Hallo Leute, Ich habe eine Schaltung aufgebaut, welches ich mit dem CR2477 LI-IOn Batterie versorgen möchte und es soll so lange halten wie möglich. Die Schaltung Läuft einwandfrei, wenn 3V Spannung angelegt sind. Die Batterie entlädt sie sich zu schnell bis zur 2,7 und die Schaltung ist nach 10 min stillgelegt. Jedoch muss ich sagen, dass ich zum Test zwecke es auf Dauerbetrieb gehalten hab. Natürlich soll es später 10 bis 20 Mess- und Sendeeinheiten Senden. Der restlichen Zeit soll es in Sleep Modus sein. Der Mikrocontroller erfasst die Daten von Sensor und gibt es an Sender weiter. Es wird gesendet dann bekommt der Sende/ Empfänger einen Bestätigungsabfrage die er zum Vollendet der Sendeeinheit tätigen muss. Das ist der Ablauf der Sendeeinheit. Ich benutze einen Sensor MS5803-14BA https://cdn.sparkfun.com/datasheets/Sensors/Weather/ms5803_14ba.pdf Für die Sende und Empfangseinheit diente RFM 22W mit 433 MHz: https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf Der Mikrocontroller habe ich den ATmega328P genommen. http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf Ich komme leider nicht mehr weiter. Obwohl die vorhandene Spannung alle Bauteile betreiben kann wird der Batterie schnell entladen. Ich würde mich freuen, wenn ihr mir da weiterhelfen könntet.
.sch ist eine schei* datei? Damit kann jemand ohne Eagle leider nichts anfangen...
Funken kostet sehr viel Energie. Mein erster Blick sagte mir: Sparsamkeit am falschen Platz! Also wenn Du Energie sparen willst, so mach das auch. Natürlich "sparst" Du eine Leiterbahn, in dem Du SDN am RFM24 offen lässt, aber ich würde mir mal das Kapitel: Operating Modes Response Time and Current Consumption im Handbuch reinziehen! Muss aber nicht sein. Was sonst noch im Kleingedruckten steht weiß ich nicht. Auch den ATMega kann man als Verbraucher ansehen, über die verwendete Software schweigt sich Dein Post ja aus. Kenne den Befehlssatz nicht, aber ein paar Schnarchoptionen werden wohl auch verfügbar sein. Auch Dein MS5803-05BA hat einen Stand-by Modus. Wie gesagt: Muss aber nicht sein...
KlausKleber schrieb: > .sch ist eine schei* datei? Damit kann jemand ohne Eagle leider nichts > anfangen... Sorry benutze halt eagle aber lade ein Bild hoch. ich hoffe da können sie was erkennen.
Was mir noch eingefallen ist: Möglicherweise reicht eine 1:1 Beschaltung eines Ports zum SDN nicht. Ich weiß aber nicht, was die Ports des ATMega machen, wenn Schlafenszeit angesagt ist. Möglicherweise kommt also zu der Leiterbahn noch ein Widerstand gen Masse hinzu. Ob die Spannungsversorgung wirklich für 24 Bit ausreicht glaube ich nicht. Der µP und der Sender produzieren reichlich "Schmutz" auf den Versorgungsleitungen. Da das Teil aber bis hinunter auf 1,8 V betrieben werden kann, könnten eine Entkopplung aus Spule und ev. Widerstand (in Reihe) und Kondensator (µF - Bereich + Kerko) gegen Masse helfen. Ist alles "kann" und nicht "muss".
:
Bearbeitet durch User
Sebastian S. schrieb: > Ich weiß aber nicht, was die Ports des ATMega machen, wenn Schlafenszeit > angesagt ist. hier ist mein code leider ist da noch keine schlafenzeit integriert. Ich möchte dass er 20 sekunden lang senden und 15 Sekunden schläft. Ich bin leider nict so gut bei programmieren und habe zwar einen lösungansatz gefunden kann die aber nicht in meine Code integrieren. ich hoffe jemand von euch ist so gütig und kann mir den code integrieren. hier der lösungansatz http://shelvin.de/arduino-in-den-sleep_mode_pwr_down-schlaf-modus-setzen/
1 | #include <RHReliableDatagram.h> |
2 | #include <RH_RF24.h> |
3 | #include <SPI.h> |
4 | #include <MS5803_05.h> |
5 | |
6 | #define CLIENT_ADDRESS 1
|
7 | #define SERVER_ADDRESS 2
|
8 | |
9 | // Singleton instance of the radio driver
|
10 | RH_RF24 driver; |
11 | |
12 | // Class to manage message delivery and receipt, using the driver declared above
|
13 | RHReliableDatagram manager(driver, CLIENT_ADDRESS); |
14 | |
15 | // Single instance of the pressure sensor
|
16 | MS_5803 sensor = MS_5803(4096); |
17 | |
18 | // stuct of measured data to send
|
19 | struct Messung{ |
20 | double temperature; |
21 | double pressure; |
22 | };
|
23 | |
24 | |
25 | |
26 | void setup() |
27 | {
|
28 | Serial.begin(115200); |
29 | if (!manager.init()) |
30 | Serial.println("init failed"); |
31 | // Defaults after init are 434.0MHz, modulation GFSK_Rb5Fd10, power 0x10
|
32 | if (sensor.initializeMS_5803()) { |
33 | Serial.println( "MS5803 CRC check OK." ); |
34 | }
|
35 | else { |
36 | Serial.println( "MS5803 CRC check FAILED!" ); |
37 | }
|
38 | delay(100); |
39 | }
|
40 | |
41 | uint8_t data[] = "Hello World!"; |
42 | // Dont put this on the stack:
|
43 | uint8_t buf[RH_RF24_MAX_MESSAGE_LEN]; |
44 | |
45 | void loop() |
46 | {
|
47 | Messung m, m1,m2,m3,m4,m5; |
48 | |
49 | // Read sensor data 5 times
|
50 | sensor.readSensor(); |
51 | m1.temperature=sensor.temperature(); |
52 | m1.pressure=sensor.pressure(); |
53 | |
54 | sensor.readSensor(); |
55 | m2.temperature=sensor.temperature(); |
56 | m2.pressure=sensor.pressure(); |
57 | |
58 | sensor.readSensor(); |
59 | m3.temperature=sensor.temperature(); |
60 | m3.pressure=sensor.pressure(); |
61 | |
62 | sensor.readSensor(); |
63 | m4.temperature=sensor.temperature(); |
64 | m4.pressure=sensor.pressure(); |
65 | |
66 | sensor.readSensor(); |
67 | m5.temperature=sensor.temperature(); |
68 | m5.pressure=sensor.pressure(); |
69 | |
70 | // Average of temperature
|
71 | m.temperature = (m1.temperature+m2.temperature+m3.temperature+m4.temperature+m5.temperature)/5.0; |
72 | // Average of pressure
|
73 | m.pressure = (m1.pressure+m2.pressure+m3.pressure+m4.pressure+m5.pressure)/5.0; |
74 | |
75 | //Serial.print("Temperatur: ");
|
76 | Serial.println(m.temperature); |
77 | //Serial.print("Druck: ");
|
78 | Serial.println(m.pressure); |
79 | |
80 | // byte array for sending data
|
81 | uint8_t payload[sizeof(struct Messung)]; |
82 | // copy struct of measurement to byte array for sending
|
83 | memcpy(payload,&m,sizeof(m)); |
84 | |
85 | Serial.println("Sending to rf24_reliable_datagram_server"); |
86 | |
87 | // Send a message to manager_server
|
88 | if (manager.sendtoWait(payload, sizeof(payload), SERVER_ADDRESS)) |
89 | {
|
90 | // Now wait for a reply from the server
|
91 | uint8_t len = sizeof(buf); |
92 | uint8_t from; |
93 | if (manager.recvfromAckTimeout(buf, &len, 2000, &from)) |
94 | {
|
95 | Serial.print("got reply from : 0x"); |
96 | Serial.print(from, HEX); |
97 | Serial.print(": "); |
98 | Serial.println((char*)buf); |
99 | }
|
100 | else
|
101 | {
|
102 | Serial.println("No reply, is rf24_reliable_datagram_server running?"); |
103 | }
|
104 | }
|
105 | else
|
106 | Serial.println("sendtoWait failed"); |
107 | delay(1000); |
108 | }
|
Wie ein Mensch macht ein batteriebetriebener µP ohne Pausen sehr bald schlapp. In wie fern der Arduino, bzw. dessen Entwicklungsumgebung, die Energiesparzustände unterstützt, weiß ich nicht. Wichtig ist aber: Dauerzustand alles aus. In den gewünschten Intervallen den µP aufwecken der dann seinerseits die jeweilige Peripherie kurz in Betrieb nimmt. Sofort, wenn nichts zu tun ist: In den Ruhezustand versetzen. So wird es z.B. kaum der Fall sein, in dem der Sensor und der Sender in Betrieb sind. Außerdem ist so etwas mehr Ruhe auf der Versorgungsspannung. Die hier sinnvolle Reihenfolge, nach dem Aufwachen, ist wohl: Sensor an. Wartezeit lt. Datenblatt. Falls vorhanden. In den Speicher messen. Sensor aus. Sender an. Die Einschaltzeit zum Aufbereiten der Messwerte nutzen. Falls nötig. Daten senden. Sender aus. Ab in die Heia. Übrigens, soll auch noch empfangen werden, so reicht es aus den Empfänger alle paar Sekunden kurz in Betrieb zu nehmen. Oft haben die Befehlsgeber oder sogar ein PC/Schlapptopf genügend Energie um ein paar Sekunden dauernd zu senden. Das Sendemodul sollte, wenn es sowieso in Betrieb ist, auch mal kurz auf Empfang umschalten. So die Energiebilanz hierbei positiv ist. Man sieht also, wenn es auf eine effektive Energiebilanz ankommt, sollte der gesamte Programmablauf zeitgesteuert/zeitgeplant erfolgen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.