Hallo zusammen, ich habe da ein "kleines" Problem. Ich habe einen Datenlogger, der per DS3231-Modul die Zeit bekommt und 3 mal täglich einen Temperaturwert auf eine SD-Karte speichert. Jetzt habe ich festgestellt, dass der Verbrauch dabei extrem hoch ist (ca. 36mA) und habe mir darüber Gedanken gemacht. Letztendlich bin ich zu dem Schluss gekommen, dass das ständige Aufladen des Akkus der RTC wahrscheinlich das Problem ist. Unteranderem habe ich gemessen, dass mein Atmega328 einen Verbrauch von ca. 10mA hat, was schon recht viel ist. Nun möchte ich den Atmega328 die meiste Zeit "schlafen legen" und nur zu den Bestimmten Zeiten aufwachen lassen, um die Daten zu schreiben. Ist das denn überhaupt möglich?
Mehr als 0,65mA sollte der DS3231 nicht ziehen (siehe DB). Aber die SD-Karte benötigt schon etwas mehr. Du könntest die SD-Karte über einen Pin des ATMega mit einem Transistor ein/ausschalten. Kannst Du das hier mal erklären: "Letztendlich bin ich zu dem Schluss gekommen, dass das ständige Aufladen des Akkus der RTC wahrscheinlich das Problem ist." Schaltplan, Aufbau?
Pete K. schrieb: > Mehr als 0,65mA sollte der DS3231 nicht ziehen (siehe DB). Aber > die > SD-Karte benötigt schon etwas mehr. > Du könntest die SD-Karte über einen Pin des ATMega mit einem Transistor > ein/ausschalten. > > Kannst Du das hier mal erklären: > "Letztendlich bin ich zu dem Schluss gekommen, dass das ständige > Aufladen > des Akkus der RTC wahrscheinlich das Problem ist." > > Schaltplan, Aufbau? OK ich werde es mal versuchen;) Erstmal möchte ich noch erwähnen, dass ich dieses http://amzn.to/1Rf0IFp Modul benutze. Ich habe sowohl das DS3231-Modul als auch das SD-Karten-Modul(http://amzn.to/1nVN6ne) direkt an 5v angeschlossen. Das Schalten der Spannung der Module habe ich bereits versucht, bin aber daran gescheitert, dass das Modul ja immer "angeschalten" sein muss um eine Uhrzeit zu liefern, und diese brauch ich ja um zu wissen, wann ich die Daten schreiben muss. Auf diese Erkenntnis bin ich gekommen, als ich das Modul einmal vom Strom getrennt habe und den Verbrauch gemessen habe, welcher danach drastisch gesunken ist, was für mich bedeutet, dass da recht viel verbraucht wird ;) MFG programmierer12
Wenn du ein Problem mit dem Ladestrom hast, solltest du mal prüfen, ob tatsächlich ein Akku verbaut ist. Viele RTC werden mit Batterie geliefert. Hast du die Led noch auf der RTC drauf?
Wie machst Du das genau? Üblich wäre: nur DS3231 läuft,der weckt durch den Interrupt den Atmega und der schmeisst den Rest an, setzt den Alarm der ds3231 neu auf den eingestellten Interval/Zeit+Interval und geht wieder in den Tiefschlaf. ich weiß ja nicht wieviele Daten das sind.. auf nen 16MB SPI Flash oder EEPROM passen in Bytes auch ne Menge daten drauf.
Dieter S. schrieb: > Wenn du ein Problem mit dem Ladestrom hast, solltest du mal prüfen, ob > tatsächlich ein Akku verbaut ist. Viele RTC werden mit Batterie > geliefert. > Hast du die Led noch auf der RTC drauf? Ich habe das nochmal geprüft, und ja es ist laut Conrad ein Akku(LIR2032) verbaut. Und ja die LED habe ich noch auf den Modul drauf.
Philipp K. schrieb: > Wie machst Du das genau? > > Üblich wäre: > > nur DS3231 läuft,der weckt durch den Interrupt den Atmega und der > schmeisst den Rest an, setzt den Alarm der ds3231 neu auf den > eingestellten Interval/Zeit+Interval und geht wieder in den Tiefschlaf. > > ich weiß ja nicht wieviele Daten das sind.. auf nen 16MB SPI Flash oder > EEPROM passen in Bytes auch ne Menge daten drauf. Das ist ja genau mein Problem, ich weiß nicht genau wie ich das umsetzen soll! Angenommen ich baue statt der SD-Karte einen EEPROM ein, wie viele Datensätze könnte ich darauf speichern, wenn ich 3 mal täglich Datum, Uhrzeit und Temperatur abspeichern möchte. Und wie bekomme ich diese Daten denn dann bequem auf einen PC um sie auszuwerten?
Ich habe so ein Projekt als Arduino Projekt gemacht, glaube das war wie folgt.. Das speichert die Unixtime in unsigned long und Temperatur in Float. Das macht 8 byte pro messung .. ein 16MB EEPROM hat also Speicher für 2.000.000 Messungen, je nachdem kann man den also für Preis/Leistung kleiner wählen ;) Ich habe dann ein Serielles Menü mit dem ich für Copy&Paste CSV vorbereitete Daten für bestimmte Zeitbereiche ausgeben lassen kann. Du kannst ja mal austesten wieviel die SD mit EnableOff zieht.. ich habe die SDs leider noch nie benutzt.
Lukas D. schrieb: > Ich habe das nochmal geprüft, und ja es ist laut Conrad ein > Akku(LIR2032) verbaut. Und ja die LED habe ich noch auf den Modul drauf. Inwiefern jetzt 'laut Conrad'? Dein Link oben verweist auf das typische Chinamodul - bei denen steht in der 'Produktbeschreibung' zwar oft auch noch was von 'Akku', die allermeisten werden aber mittlerweile wegen Zollproblemen mit CR2032 oder ganz ohne Bat. geliefert. Da ist es dann ratsam, die 'Ladeschaltung' zu deaktivieren. Auf dem Modul ist übrigens auch noch ein 32k Eeprom zur freien Verwendung drauf - da passen schon etliche Messwerte rein...
Jan L. schrieb: > Inwiefern jetzt 'laut Conrad'? Dein Link oben verweist auf das typische > Chinamodul - bei denen steht in der 'Produktbeschreibung' zwar oft auch > noch was von 'Akku', die allermeisten werden aber mittlerweile wegen > Zollproblemen mit CR2032 oder ganz ohne Bat. geliefert. Ja das ist schon klar, aber in meinem Modul ist eine Zelle mit der Aufschrift 3,6V LIR2032 Lithium Ion battery, wenn ich jetzt nach der Bezeichnung suche kommt dabei raus, dass es sich um einen Akku handeln müsste. Jetzt habe ich aber immer noch das gleiche Problem. Wie reduziere ich jetzt meinen Stromverbrauch und wie kann ich bei einer bestimmten Zeit den Conroller wieder "aufwecken" bzw. Wie bekomme ich ihn so weit, dass er in den Sleepmode geht?
Philipp K. schrieb: > Ich habe so ein Projekt als Arduino Projekt gemacht, glaube das > war wie > folgt.. > > Das speichert die Unixtime in unsigned long und Temperatur in Float. > > Das macht 8 byte pro messung .. ein 16MB EEPROM hat also Speicher für > 2.000.000 Messungen, je nachdem kann man den also für Preis/Leistung > kleiner wählen ;) > > Ich habe dann ein Serielles Menü mit dem ich für Copy&Paste CSV > vorbereitete Daten für bestimmte Zeitbereiche ausgeben lassen kann. Du > kannst ja mal austesten wieviel die SD mit EnableOff zieht.. ich habe > die SDs leider noch nie benutzt. Danke für deine Hilfe! Also denkst du, dass ein EEPROM die bessere Wahl ist?
Lukas D. schrieb: > soll! Angenommen ich baue statt der SD-Karte einen EEPROM ein, wie viele > Datensätze könnte ich darauf speichern, wenn ich 3 mal täglich Datum, > Uhrzeit und Temperatur abspeichern möchte. Und wie bekomme ich diese > Daten denn dann bequem auf einen PC um sie auszuwerten? Da ist doch 4K Eeprom dabei, wenn du wie folgt speicherst: Datum - 2 Byt Zeit - 2 Byt Temp - 2 Byt passen da beguem 7 Monate drauf.
Marc V. schrieb: > Da ist doch 4K Eeprom dabei, wenn du wie folgt speicherst: So ist noch besser.. bzw unixtime 4byte und Temp 2Byte ist sinnvoller.. Rundet man Float auf zwei nachkommstellen und macht*100 als uin16_t/arduino int. Glaub so hab ich das sogar gemacht. Worauf programmierst Du das?
Marc V. schrieb: > Da ist doch 4K Eeprom dabei, wenn du wie folgt speicherst: > > Datum - 2 Byt > Zeit - 2 Byt > Temp - 2 Byt > > passen da beguem 7 Monate drauf. Wo soll denn der EEPROM dabei sein schäm? Und wie beschreibe ich den mit meinem Arduino-Aufbau. Die Übertragung dürfte auch nicht ganz so einfach sein, da ich nur eine ISP-Schnittstelle habe über die ich ja keine Daten Seriell hin und her schicken kann, oder? Philipp K. schrieb: > Worauf programmierst Du das? Ich habe einen Atmega328 als standalone-Arduino und programmiere den natürlich auch mit der "Arduino-IDE", und spiele den Sketch dann mit einem USBasp auf den Chip.
Hast Du die LEDs auf den Modulen gekappt? Was ist das für ein Arduino? (z. B. beim Nano USB-Teil stilllegen) Guck Dir mal an, wie der das gemacht hat: https://edwardmallon.wordpress.com/2014/10/07/the-diy-data-logger-v2-with-low-power-shut-down-capability/
> Wo soll denn der EEPROM dabei sein schäm? Und wie beschreibe ich den > mit meinem Arduino-Aufbau. Die Übertragung dürfte auch nicht ganz so > einfach sein, da ich nur eine ISP-Schnittstelle habe über die ich ja > keine Daten Seriell hin und her schicken kann, oder? müsste at24c32 oder so draufstehen.. ist nur nen 8Pin und benutzt zusammen mit dem ds3231 die i2C Schnittstelle als Bus.. gibts genügend Libs die auf beides eingehen. > Ich habe einen Atmega328 als standalone-Arduino und programmiere den > natürlich auch mit der "Arduino-IDE", und spiele den Sketch dann mit > einem USBasp auf den Chip. Ich würde das nächste mal nen 6 pin kompatiblen FTDI Header benutzen. Dann kann man den mit dem hier programmieren und immer angeschlossen lassen.. so hat man dann auch eine serielle Verbindung zum Rechner um die daten abzurufen. https://drive.google.com/file/d/0BxOStC_q23RWcTFLMzE1MFBXNWs/view?usp=sharing So ein FDTI Header kostet einmalig 5€ und den stecke ich dann zwischen den Boards um.
google schrieb: > Hast Du die LEDs auf den Modulen gekappt? Was ist das für ein Arduino? > (z. B. beim Nano USB-Teil stilllegen) Nein die LEDs gehen noch(habe ich schon mal geschrieben ;) ). Das ist gewissermaßen der Arduino UNO nur als standalone auf meiner Platine und den anderen Sachen wie es hier https://www.arduino.cc/en/Main/Standalone gezeigt wird.
Philipp K. schrieb: > Ich würde das nächste mal nen 6 pin kompatiblen FTDI Header benutzen. > Dann kann man den mit dem hier programmieren und immer angeschlossen > lassen.. so hat man dann auch eine serielle Verbindung zum Rechner um > die daten abzurufen. Ja das ist eigentlich ne gute Idee, aber zum Testen tuns auch ein Paar Breadboardkabel, müssten ja die gleichen Pins sein oder?
Lukas D. schrieb: > Jetzt habe ich aber immer noch das gleiche Problem. Wie reduziere ich > jetzt meinen Stromverbrauch und wie kann ich bei einer bestimmten Zeit > den Conroller wieder "aufwecken" bzw. Wie bekomme ich ihn so weit, dass > er in den Sleepmode geht? Die RTC kann so programmiert werden, dass bei einem Alarm der INT-Pin getriggert wird - der dann wieder einen Atmega aufwecken könnte, falls richtig beschaltet und programmiert... Ich würde das aber erstmal einfacher probieren, und zwar mit den Sleepmodes, aus denen die Atmegas selbst wieder aufwachen können. Hier gibt's eine kleine Lib dazu: https://code.google.com/archive/p/narcoleptic/ Ohne LED sollte ein 328 damit unter 1mA laufen... Für 'Knopfzelle' sicherlich immer noch zuviel, für'n Akkupack aber nicht. Was du benutzt, hast du nicht geschrieben...
Jan L. schrieb: > Die RTC kann so programmiert werden, dass bei einem Alarm der INT-Pin > getriggert wird - der dann wieder einen Atmega aufwecken könnte, falls > richtig beschaltet und programmiert... Ja ok aber wie programmiere ich die RTC und was für ein INT-Pin ist denn da gemeint? Jan L. schrieb: > Ich würde das aber erstmal einfacher probieren, und zwar mit den > Sleepmodes, aus denen die Atmegas selbst wieder aufwachen können. Hier > gibt's eine kleine Lib dazu: > https://code.google.com/archive/p/narcoleptic/ Und was bringt mir das, ich muss ja extern den Atmega aufwecken oder? Oder muss ich die Lib in Verbindung mit dem RTC verwenden? Jan L. schrieb: > Was du benutzt, hast du nicht geschrieben... Sorry habe ich vergessen zu schreiben, ich benutze einen Akkupack aus 3 AAA-Akkus mit je 1,2V also 3,6V. Ich möchte aber irgendwann auf Lipo oder Li-Ion umsteigen um eine höhere Laufzeit zu erreichen.
Ich wiederhole mich: "the-diy-data-logger-v2-with-low-power-shut-down-capability" https://edwardmallon.wordpress.com/2014/10/07/the-diy-data-logger-v2-with-low-power-shut-down-capability/ Der hat genau Dein Problem gelöst.
Lukas D. schrieb: > Hallo zusammen, > ich habe da ein "kleines" Problem. Ich habe einen Datenlogger, der per > DS3231-Modul.... Nun möchte ich den Atmega328 die meiste Zeit > "schlafen legen" und nur zu den Bestimmten Zeiten aufwachen lassen, um > die Daten zu schreiben. Ist das denn überhaupt möglich? ist möglich habe ich schon gemacht Philipp K. schrieb: > Üblich wäre: > nur DS3231 läuft,der weckt durch den Interrupt den Atmega und der > schmeisst den Rest an, setzt den Alarm der ds3231 neu auf den > eingestellten Interval/Zeit+Interval und geht wieder in den Tiefschlaf. ganz genau, man muss sich nut Routinen schreiben um in der DS3231 die Alarmregister zu setzen, den Atmel in deep sleep zu schicken, nach dem wakeup, per /INT vom DS3231 an /INT1 vom Atmel, den Alarm zu löschen und neu zu setzen vor dem weiteren Tiefschlaf Man sollte zu EEPRO Datenspeicherung die I2C EEPROM vom RTC EEPROM nutzen, wenn das mal verbraucht ist wechselt man nur das Uhrmodul statt den Atmel. Ich hatte das mal in einem Cam Timer genutzt, ist nie ganz fertig geworden weil es nun mein Handy kann, aber die RTC und wakeup funktioniert. Musst dich halt durch den halbwegs dokumentierten Code wühlen und mit I2C vertraut machen, mit den RTC Register und mit dem Atmel.
Lukas D. schrieb: > Und was bringt mir das, ich muss ja extern den Atmega aufwecken oder? > Oder muss ich die Lib in Verbindung mit dem RTC verwenden? Ich zitiere mich mal selbst: 'Sleepmodes, aus denen der Atmega selbst wieder aufwacht'. Siehe verlinkte Lib - das Ding ist total simpel, und es ist ein Beispiel dabei. Man sagt dem Atmega 'gehe X Sekunden/Minuten/Stunden schlafen' - und danach wacht er wieder auf. Ohne irgendwelchen Abhängigkeiten zur RTC. Oft legt man das Teil dann nicht gleich für Stunden in den Tiefschlaf, sondern für kürzere Intervalle - in denen man z.B. dann prüft, ob eine Aktion ansteht, Taster gedrückt ist o.ä. - wenn nicht, wird wieder geschlafen.
Jan L. schrieb: > Ich zitiere mich mal selbst: 'Sleepmodes, aus denen der Atmega selbst > wieder aufwacht'. > Siehe verlinkte Lib - das Ding ist total simpel, und es ist ein Beispiel > dabei. Man sagt dem Atmega 'gehe X Sekunden/Minuten/Stunden schlafen' - > und danach wacht er wieder auf. Ohne irgendwelchen Abhängigkeiten zur > RTC. Oft legt man das Teil dann nicht gleich für Stunden in den > Tiefschlaf, sondern für kürzere Intervalle - in denen man z.B. dann > prüft, ob eine Aktion ansteht, Taster gedrückt ist o.ä. - wenn nicht, > wird wieder geschlafen. Ich habe die Lib gerade mal mit meinem Arduino Mega getestet, und ich verbrauche im "Stromsparmodus" satte 53mA und mit blinkender LED also im "Arbeitsmodus" 103mA. angegeben sind aber von 15mA auf 7µA da dürfte doch die zusätzliche Beschaltung auf dem Arduino nicht so viel ausmachen oder?
Lukas D. schrieb: > Ich habe die Lib gerade mal mit meinem Arduino Mega getestet, und ich > verbrauche im "Stromsparmodus" satte 53mA Du musst das in der endschaltung testen.. das meiste verbrennt sich irgendwo wo es nicht sein muss.. wenn Du sowieso standalone gehst kannste auch gleich mit internen 8Mhz auf 3.3V arbeiten.. dann nimmste nen 3.3V Regler mit Enable und eine kleine schaltung die den 3.3V Regler anschmeisst und so den atmega bootet.. dann kannste guten gewissens nen liion 400mah oder so nehmen und kannst so auch vernünftig messen.
:
Bearbeitet durch User
Lukas D. schrieb: > Ich habe die Lib gerade mal mit meinem Arduino Mega getestet, und ich siehe mein Vorredner; kein Sleepmode kann olle Linearregler beeinflussen. Ein halbwegs gescheiter LDO ist bei einem Akkupack sowieso Pflicht. 8MHz und 3.3v dann die Kür... :)
Also ich bin gerade dabei zu verstehen wie das mit den Interrupts funktioniert und versuche das jetzt umzusetzen. Vielen Dank für eure Hilfe!!!
Ich habe das Gefühl, du solltest dich erstmal um die Basics kümmern. Aus deinen Fragen entnehme ich, dir fehlen einfach die wichtigsten Grundlagen. Auch kannst du sehr viel im Netz darüber finden.
Dieter S. schrieb: > Ich habe das Gefühl, du solltest dich erstmal um die Basics kümmern. > Aus deinen Fragen entnehme ich, dir fehlen einfach die wichtigsten > Grundlagen. > Auch kannst du sehr viel im Netz darüber finden. Da hast du das richtige Gefühl, leider :( ! Aber ich bin ja gerade dabei mich da ein einzulesen um es zu verstehen. Wichtig ist mir aktuell das ganze mal zum laufen zu kriegen :)
Wenn man das Quick&Simple richtig ausreizen möchte wäre ein LDO(0.01 μA OFF) mit Enable am INT des ds3231 mit nem 9V Block davor auch eine langlebige Alternative. Der dS3231 macht den LDO an, Atmega bootet Superfix ohne Bootloader, hält den Enable zusätzlich, setzt das AlarmRegister zurück, der Int/sqw geht aus. Zuguterletzt geht der Atmega nach der Messung in den Powerdown und der LDO geht somit auch aus. Das hatte ich so mal geplant aber nie umgesetzt.
Ich will euch ja nicht belästigen, aber ich habe mir da ein bisschen Code zusammenkopiert. Kann das denn gehen oder habe ich da grundlegende Fehler drin?
1 | #include <DS3232RTC.h> |
2 | #include <Streaming.h> |
3 | #include <Time.h> |
4 | #include <Wire.h> |
5 | #include "TSIC.h" |
6 | #include <SPI.h> |
7 | #include <SD.h> |
8 | |
9 | #define SQW_PIN 3
|
10 | |
11 | TSIC Sensor1(4, 2); |
12 | |
13 | uint16_t temperature = 0; |
14 | float Temperatur_C = 0; |
15 | |
16 | File myFile; |
17 | |
18 | void setup() { |
19 | |
20 | Serial.begin(115200); |
21 | |
22 | digitalPinToInterrupt(3); |
23 | |
24 | pinMode(4, INPUT); |
25 | |
26 | setSyncProvider(RTC.get); |
27 | Serial << "RTC Sync"; |
28 | if (timeStatus() != timeSet) { |
29 | Serial << " FAIL!"; |
30 | }
|
31 | Serial << endl; |
32 | |
33 | printDateTime( RTC.get() ); |
34 | Serial << " --> Current RTC time." << endl; |
35 | |
36 | //Disable the default square wave of the SQW pin.
|
37 | RTC.squareWave(SQWAVE_NONE); |
38 | |
39 | //Attach an interrupt on the falling of the SQW pin.
|
40 | //digitalWrite(SQW_PIN, HIGH); //redundant with the following line
|
41 | pinMode(SQW_PIN, INPUT_PULLUP); |
42 | attachInterrupt(INT0, alarmIsr, FALLING); |
43 | |
44 | //Set an alarm at every 20th second of every minute.
|
45 | RTC.setAlarm(ALM1_MATCH_SECONDS, 20, 0, 0, 1); //daydate parameter should be between 1 and 7 |
46 | RTC.alarm(ALARM_1); //ensure RTC interrupt flag is cleared |
47 | RTC.alarmInterrupt(ALARM_1, true); |
48 | |
49 | //Set an alarm every minute.
|
50 | RTC.setAlarm(ALM2_EVERY_MINUTE, 0, 0, 0, 1); //daydate parameter should be between 1 and 7 |
51 | RTC.alarm(ALARM_2); //ensure RTC interrupt flag is cleared |
52 | RTC.alarmInterrupt(ALARM_2, true); |
53 | |
54 | if (!SD.begin(5)) { |
55 | Serial.println("initialization failed!"); |
56 | return; |
57 | }
|
58 | |
59 | else Serial.println("initialization completed"); |
60 | |
61 | myFile = SD.open("DATA.CSV", FILE_WRITE); |
62 | |
63 | }
|
64 | |
65 | volatile boolean alarmIsrWasCalled = false; |
66 | |
67 | |
68 | void loop() { |
69 | |
70 | if (alarmIsrWasCalled) { |
71 | if (RTC.alarm(ALARM_1)) { |
72 | |
73 | if (Sensor1.getTemperature(&temperature)) { |
74 | Serial.print("uint_16: "); |
75 | Serial.println(temperature); |
76 | Temperatur_C = Sensor1.calc_Celsius(&temperature); |
77 | Serial.print("Temperature: "); |
78 | Serial.print(Temperatur_C); |
79 | Serial.println(" °C"); |
80 | }
|
81 | |
82 | myFile = SD.open("DATA.CSV", FILE_WRITE); |
83 | |
84 | if (myFile) { |
85 | Serial.println("DATA.CSV:"); |
86 | |
87 | String str = String(RTC.get()) + "," + String(RTC.get()) + "," + String(Temperatur_C); |
88 | |
89 | Serial.println(str); |
90 | |
91 | myFile.println(str); |
92 | |
93 | myFile.close(); |
94 | |
95 | //digitalWrite(1, LOW);
|
96 | |
97 | } else { |
98 | Serial.println("error opening DATA.CSV"); |
99 | }
|
100 | |
101 | }
|
102 | if (RTC.alarm(ALARM_2)) { |
103 | |
104 | if (Sensor1.getTemperature(&temperature)) { |
105 | Serial.print("uint_16: "); |
106 | Serial.println(temperature); |
107 | Temperatur_C = Sensor1.calc_Celsius(&temperature); |
108 | Serial.print("Temperature: "); |
109 | Serial.print(Temperatur_C); |
110 | Serial.println(" °C"); |
111 | }
|
112 | |
113 | myFile = SD.open("DATA.CSV", FILE_WRITE); |
114 | |
115 | if (myFile) { |
116 | Serial.println("DATA.CSV:"); |
117 | |
118 | String str = String(RTC.get()) + "," + String(RTC.get()) + "," + String(Temperatur_C); |
119 | |
120 | Serial.println(str); |
121 | |
122 | myFile.println(str); |
123 | |
124 | myFile.close(); |
125 | |
126 | //digitalWrite(1, LOW);
|
127 | |
128 | } else { |
129 | Serial.println("error opening DATA.CSV"); |
130 | }
|
131 | |
132 | }
|
133 | alarmIsrWasCalled = false; |
134 | }
|
135 | |
136 | }
|
137 | |
138 | void printDateTime(time_t t) |
139 | {
|
140 | Serial << ((day(t) < 10) ? "0" : "") << _DEC(day(t)) << ' '; |
141 | Serial << monthShortStr(month(t)) << " " << _DEC(year(t)) << ' '; |
142 | Serial << ((hour(t) < 10) ? "0" : "") << _DEC(hour(t)) << ':'; |
143 | Serial << ((minute(t) < 10) ? "0" : "") << _DEC(minute(t)) << ':'; |
144 | Serial << ((second(t) < 10) ? "0" : "") << _DEC(second(t)); |
145 | }
|
146 | |
147 | void alarmIsr() { |
148 | |
149 | if (Sensor1.getTemperature(&temperature)) { |
150 | Serial.print("uint_16: "); |
151 | Serial.println(temperature); |
152 | Temperatur_C = Sensor1.calc_Celsius(&temperature); |
153 | Serial.print("Temperature: "); |
154 | Serial.print(Temperatur_C); |
155 | Serial.println(" °C"); |
156 | }
|
157 | |
158 | myFile = SD.open("DATA.CSV", FILE_WRITE); |
159 | |
160 | if (myFile) { |
161 | Serial.println("DATA.CSV:"); |
162 | |
163 | String str = String(RTC.get()) + "," + String(RTC.get()) + "," + String(Temperatur_C); |
164 | |
165 | Serial.println(str); |
166 | |
167 | myFile.println(str); |
168 | |
169 | myFile.close(); |
170 | |
171 | //digitalWrite(1, LOW);
|
172 | |
173 | } else { |
174 | Serial.println("error opening DATA.CSV"); |
175 | }
|
176 | |
177 | }
|
Joachim B. schrieb: > Lukas D. schrieb: > #include <DS3232RTC.h> > > echt? > > für eine DS3231? > > man beachte 32 zu 31 ! Ja, die library sind abwärtskompatibel.
Joachim B. schrieb: > Lukas D. schrieb: >> #include <DS3232RTC.h> > > echt? > > für eine DS3231? > > man beachte 32 zu 31 ! Mist das hab ich ja überhaupt nicht gesehen, dass das für DS3232 ist, wobei auf der Github-Seite(https://github.com/JChristensen/DS3232RTC) steht "Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time Clocks " was für mich bedeutet, dass es auch mit DS3231 funktionieren sollte
:
Bearbeitet durch User
Allerdings ist der Sketch einigermaßen komplex und ohne richtige Kommentierung ist das schwer zu durchschauen. Versuche einfach mal zu kompilieren und wenn es klappt hochzuladen. Wir können es ohne entsprechende Hardware sowieso nicht testen.
Lukas D. schrieb: > Joachim B. schrieb: > Lukas D. schrieb: > #include <DS3232RTC.h> > > echt? > für eine DS3231? > man beachte 32 zu 31 ! > > Mist das hab ich ja überhaupt nicht gesehen, dass das für DS3232 ist, > wobei auf der Github-Seite(https://github.com/JChristensen/DS3232RTC) > steht "Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time > Clocks " was für mich bedeutet, dass es auch mit DS3231 funktionieren > sollte Das ist kein Problem.
Dieter S. schrieb: > Allerdings ist der Sketch einigermaßen komplex und ohne richtige > Kommentierung ist das schwer zu durchschauen. > Versuche einfach mal zu kompilieren und wenn es klappt hochzuladen. > Wir können es ohne entsprechende Hardware sowieso nicht testen. Ja ich habe das mal kompiliert und hochgeladen, hat auch alles funktioniert. Jetzt habe ich ein paar Minuten gewartet und geschaut ob jetzt Werte auf der SD-Karte sind - gähnende Leere :( . Mit meinem Oszi konnte ich auch nicht erkennen, dass es z.B. einen Peak gibt oder Ähnliches.
Mein Tipp. Teste die einzelnen Funktionen bzw. Module einzeln. Das ist für dich einfacher und besser überschaubar.
Genau; von null auf 100 (mit ISR) ist vielleicht etwas gewagt... Ansonsten würde ich in einer ISR alles weglassen, was selber Interrupts braucht - weil, die tun's dort nämlich nicht... Serial.println gehört da auch zu, was SD.xy macht - k.A. Jedenfalls wird sich der Arduino so einfach weghängen.
Ich habe jetzt ein FTDI-Modul angeschlossen und darüber mal geschaut wie weit er denn überhaupt kommt im Code. Die Serial Sachen habe ich aus der Stelle mit dem Interrupt gelöscht. Wie kann ich denn testen, ob die RTC ein Interrupt liefert und ob der Atmega das richtig verarbeitet? Ich konnte bis jetzt nicht beobachten, dass ein Interrupt stattgefunden hat, da keine neuen Daten auf der SD-Karte sind. Und wie könnte ich das denn lösen wenn die SD... Befehle auch Interrupts auslösen, innerhalb meines Interrupts von der RTC diese Befehle zu benutzen?
Dieter S. schrieb: > Mein Tipp. > Teste die einzelnen Funktionen bzw. Module einzeln. > Das ist für dich einfacher und besser überschaubar. Lukas D. schrieb: > Wie kann ich denn testen, ob die RTC > ein Interrupt liefert und ob der Atmega das richtig verarbeitet? siehe oben du schickst den Atmega in den Tiefschlaf, weckst ihn mit einem /INT0 oder /INT1 per Taster nach GND ohne RTC auf, dann sollte ein Testprogramm von dir laufen LED blinken lassen. Wenn nun statt Taster die RTC das übernimmt weisst du das du es richtig gemacht hast. Immer kleine Schritte, so wie du das willst alles auf einmal von o auf 100 klappt nicht.
:
Bearbeitet durch User
Ich habe jetzt den Controller in der Setup-Funktion in den Sleepmode geschickt und versuche bei jedem Interrupt einen Wert auf die SD-Karte zu schreiben. Der Verbrauch liegt zu Beginn bei ca. 26mA und steigt nach den 20 Sekunden, nach denen von der RTC ein Interrupt kommen sollte auf ca. 40mA an. Das ist für mich ein Zeichen, dass das Interrupt funktioniert! Sobald das Interrupt eintritt sollte er ja einen Wert schreiben, was er aber nicht tut! Woran kann denn das liegen?
Lukas D. schrieb: > Ich habe jetzt das ist mir zu durcheinander! Kannst du da mal Ordnung reinbringen? wie kann ein tiefschlafender AVR 26mA verbraten? da stimmt doch was vorne und hinten nicht. Lukas D. schrieb: > in den Sleepmode > geschickt in welchen? Lukas D. schrieb: > versuche bei jedem Interrupt einen Wert auf die SD-Karte > zu schreiben aber erst nach dem korrekten Aufwachen und Betrieb aufnehmen! Lukas D. schrieb: > und steigt nach > den 20 Sekunden, ??? wieso und warum 20s Das passt alles nicht zusammen und ist unverständlich, so kann keiner helfen. Lukas D. schrieb: > Sobald das Interrupt eintritt sollte er ja einen Wert > schreiben, kann er überhaupt auch ohne Interrupt schreiben? Lukas D. schrieb: > Woran kann denn das liegen? An deiner Unordnung, Dinge der Reihe nach zum Laufen zu bringen und das in Worte, Ablaufdiagramme und Schaltbilder zu kleiden.
Joachim B. schrieb: > das ist mir zu durcheinander! Tut mir echt leid wenn ich da zu unüberlegt schreibe!! Ich versuch mal Ordnung rein zu bringen und deine Fragen zu beantworten! Joachim B. schrieb: > wie kann ein tiefschlafender AVR 26mA verbraten? da stimmt doch was > vorne und hinten nicht. Das ist ja nicht nur der AVR der versorgt werden muss, sondern auch das SD- und RTC-Modul. Diese sind (im Moment noch) fest mit der Versorgungsspannung (5V) verbunden. Ich habe den Verbrauch der gesamten Schaltung gemessen und nicht nur den Verbrauch des µC. Joachim B. schrieb: > Lukas D. schrieb: >> in den Sleepmode >> geschickt > > in welchen? Ich habe den "Arduino" mit dieser Zeile :
1 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
in den "Power-Down"-Modus geschickt. Joachim B. schrieb: > aber erst nach dem korrekten Aufwachen und Betrieb aufnehmen! Was bedeutet nach dem korrekten Aufwachen? Ich habe zwar gesehen, dass der µC nicht sofort bereit ist, jedoch bin ich mir nicht sicher wie lange ich im Code eine Pause machen muss. Reichen da 100 Millisekunden? (Das habe ich bis jetzt nicht berücksichtigt ;) ) Joachim B. schrieb: > ??? wieso und warum 20s Weil ich, wie oben schon im Code erwähnt, die RTC dazu gebracht habe alle 20 Sekunden ein Interrupt auszulösen um zu testen ob es funktioniert.
1 | //Set an alarm at every 20th second of every minute.
|
2 | RTC.setAlarm(ALM1_MATCH_SECONDS, 20, 0, 0, 1); //daydate parameter should be between 1 and 7 |
3 | RTC.alarm(ALARM_1); //ensure RTC interrupt flag is cleared |
4 | RTC.alarmInterrupt(ALARM_1, true); |
Joachim B. schrieb: > kann er überhaupt auch ohne Interrupt schreiben? Also, wenn ich den Controller immer an lasse und dauerhaft die Zeit überprüfe kann er bei einer bestimmten Uhrzeit die Aktuelle Temperatur mit Datum und Uhrzeit auf die SD-Karte Schreiben. Diese Funktion habe ich 1 zu 1 aus meinem ersten Sketch ohne Sleepmode und Interrupt übernommen. Ich hoffe jetzt ist zumindest ein kleiner Teil besser verständlich und es kann mir hoffentlich auch jemand helfen. PS.: Habt ein bisschen Verständnis für meine Unordnung und für meine teilweise blöden Fragen!
Lukas D. schrieb: > Ich hoffe jetzt ist zumindest ein kleiner Teil besser verständlich und > es kann mir hoffentlich auch jemand helfen. wird schwer, mache mal einen Ablaufplan! Lukas D. schrieb: > Ich habe jetzt den Controller in der Setup-Funktion in den Sleepmode > geschickt ist mir merkwürdig! Ein normaler µC Start sollte doch so aussehen, er startet, entweder aus powerON oder aus Reset! Dann kommt die Startroutine oder Setup, dort werden die Register gesetzt für IRQ, Ports, usw. In der Setuproutine würde ich doch nie einen AVR in den sleep schicken! Dann folgt nach dem Setup normalerweise eine while(1){} Schleife, bei Arduino loop{} in dieser Schleife findet doch alles statt, Zeiten und Ereignisse prüfen und darauf Aktionen auszulösen, auch schlafen gehen. Beispiel hatte ich ja gepostet Und genau da wacht er auch wieder auf steckt alles in UBYTE shutdown(UBYTE _sleep_mode) wobei UBYTE auf neudeutsch nun uint8_t heissen sollte.
Ich habe meinen Code jetzt nochmals überprüft und nach dem Aufbau des Sleep-Examples von Arduino.cc geändert. Jetzt funktioniert es soweit! Die Schaltung verbraucht jetzt insgesamt 10,4 mA mit kurzen Peaks von ca. 14-16 mA beim Schreiben. Sind diese Werte denn einigermaßen in Ordnung?
Lukas D. schrieb: > Das ist ja nicht nur der AVR der versorgt werden muss, sondern auch das > SD- und RTC-Modul. Lukas D. schrieb: > Die Schaltung verbraucht jetzt insgesamt 10,4 mA mit kurzen Peaks von > ca. 14-16 mA beim Schreiben. mit SD dauerhaft versorgt und RTC hört sich das plausibel an. Man könnte vor dem Sleep auch die SD abschalten und die RTC, wer Strom sparen will sollte das machen. Die RTC sollte dann nur aus ihrer backup Zelle laufen Eine SD nach dem Speichern und überprüfen der geschriebenen Daten kann auch abgeschaltet werden.
Joachim B. schrieb: > mit SD dauerhaft versorgt und RTC hört sich das plausibel an. > > Man könnte vor dem Sleep auch die SD abschalten und die RTC, wer Strom > sparen will sollte das machen. > Die RTC sollte dann nur aus ihrer backup Zelle laufen > Eine SD nach dem Speichern und überprüfen der geschriebenen Daten kann > auch abgeschaltet werden. Da bin ich aber beruhigt, dass wenigstens meine Werte plausibel erscheinen!! Die Module nur zum Schrieben bzw. Lesen mit Strom zu versorgen wäre jetzt der nächste Schritt. Ich denke die Module lassen sich recht einfach per Transistor schalten. Ein Einschalten sobald der Interrupt erkannt wird sollte eigentlich reichen oder?
Lukas D. schrieb: > Ich denke die Module lassen sich recht > einfach per Transistor schalten Die RTC kann direkt aus einem Port versorgt werden, da brauchts bei dem geringen Strom keinen Transistor. Nur sollte der Port vor dem sleep ausgeschaltet werden. Erst auf low (dann wer mag auf Input) nach dem wakeup auf Output und high Bei der SD bin ich unsicher, bis 20mA geht ja auch locker aus dem Port, aber wenn die mehr braucht? Es gibt sehr große stromhungrige SD und deiner 10-20mA Messung traue ich nicht, du siehst nur Mittelwerte, je nach Messgerät um 100ms bis 330ms und keinen Echteffektivwert! Die Peaks können bis über 40mA reichen. Eine SD könnte man sogar aus einem Emitterfolger +Diode speisen wenn der Atmel mit 5V läuft, spart die VCC SD Spannungsanpassung
Joachim B. schrieb: > Die RTC kann direkt aus einem Port versorgt werden, da brauchts bei dem > geringen Strom keinen Transistor. Da habe ich aktuell keine Infos drüber aber da meine beiden Module direkt miteinander verbunden sind macht es finde ich Sinn beide gleich über einen Transistor zu schalten nur um auf Nummer sicher zu gehen :) . Joachim B. schrieb: > Nur sollte der Port vor dem sleep ausgeschaltet werden. > Erst auf low (dann wer mag auf Input) > nach dem wakeup auf Output und high Danke für den Tipp, wahrscheinlich hätte ich das ganz vergessen. Ich werde das auf jeden Fall morgen so umsetzen, dann werde ich mich nochmal melden, wie es gelaufen ist. Da werden bestimmt noch Probleme auftauchen ;)
Lukas D. schrieb: > Da habe ich aktuell keine Infos drüber aber da meine beiden Module > direkt miteinander verbunden sind macht es finde ich Sinn beide gleich > über einen Transistor zu schalten nur um auf Nummer sicher zu gehen :) . zusammen aus einem Port schalten wäre OK, aber je nach dem welches RTC Modul ist es nicht sinnvoll über einen Trnasistor zu gehen. Die evtl. vorhandene Ladeschaltung für LiR2032 braucht 5V, da würde der Transtor ja klauen, aber wenn der Arduino mit 5V läuft speist der Port die RTC direkt, und am gleichen Port die Basis vom NPN, der Collector nauch VCC, der Emitter bekommt noch eine Diode in Durchlassrichtung und dannn an VCC von der SD.
Joachim B. schrieb: > Lukas D. schrieb: >> Da habe ich aktuell keine Infos drüber aber da meine beiden Module >> direkt miteinander verbunden sind macht es finde ich Sinn beide gleich >> über einen Transistor zu schalten nur um auf Nummer sicher zu gehen :) . > > zusammen aus einem Port schalten wäre OK, aber je nach dem welches RTC > Modul ist es nicht sinnvoll über einen Trnasistor zu gehen. > > Die evtl. vorhandene Ladeschaltung für LiR2032 braucht 5V, da würde der > Transtor ja klauen, aber wenn der Arduino mit 5V läuft speist der Port > die RTC direkt, und am gleichen Port die Basis vom NPN, der Collector > nauch VCC, der Emitter bekommt noch eine Diode in Durchlassrichtung und > dannn an VCC von der SD. Ich habe jetzt die RTC durchgehend immer verbunden und schalte das SD-Modul über einen BC337 Transistor mit 10k Widerstand an der Basis. Da kommen am Modul dann noch 4v an, die aber nicht ausreichen um das Modul zu betreiben, da die SD-Karte nicht initialisiert wird. Wenn ich den VCC-Pin direkt an 5v halte klappt es wunderbar. Was kann ich denn da tun? Oder soll ich die SD-Karte direkt über einen Pin vom AVR speisen?
Lukas D. schrieb: > Ich habe jetzt die RTC durchgehend immer verbunden und schalte das > SD-Modul über einen BC337 Transistor mit 10k Widerstand an der Basis. Da > kommen am Modul dann noch 4v an, die aber nicht ausreichen um das Modul > zu betreiben, da die SD-Karte nicht initialisiert wird. Die Schaltung möchte ich gerne von dir gemalt sehen und auch als Bild SD Karten werden normnalerweise mit 3,3V betrieben, warum es mit 4V nicht gehen soll wenn es angeblich mit 5V geht ist mir ein Rätsel, oder sind da schon Pegelanpassungen dabei?
Joachim B. schrieb: > SD Karten werden normnalerweise mit 3,3V betrieben, warum es mit 4V > nicht gehen soll wenn es angeblich mit 5V geht ist mir ein Rätsel, oder > sind da schon Pegelanpassungen dabei? Auf dem Modul ist eine Pegelanpassung von 5v auf 3,3v mit drauf. Ich habe jetzt den Transistor nochmal umgangen und die SD-Karte wieder fest verbunden. Jetzt brauche ich im Sleepmode ca. 9mA und während des Schreibens ca. 15-20mA. Wie kann ich denn ausrechnen wie groß mein Akku sein muss, damit er eine Woche oder länger hält?
Ich hab mal gelesen dass es auch möglich ist 2 Ports zusammenschalten. Stimmt das? Dann hättest er 5V/40mA sicher. Sonst nimm statt dem Transistor einfach einen kleinen Mosfet. -- Alle ströme addieren und ausrechnen?
Jetzt habe ich noch ein viel größeres Problem .... Meine Serielle Schnittstelle gibt nur noch S von Start und dann € Zeichen aus und das die ganze Zeit. Im Klartext es geht nix mehr :( Ich habe lediglich die LED von der RTC entfernt, was ja kein Problem darstellen sollte. Außerdem musste ich die Zeit neu einstellen, wonach dann nichts mehr ging!
Freakazoid schrieb: > Dann hättest er 5V/40mA sicher. 40mA reichen aber nicht. SD-Karten können auch kurzzeitig 100mA und mehr ziehen. Und dann bricht die Spannung an den Avr-Ports ein. > Sonst nimm statt dem Transistor einfach einen kleinen Mosfet. Oder einfach die richtige Schaltung mit einem PNP-Transistor. NPN ist hier nicht wirklich geeignet.
Joachim B. schrieb: > verbastelt? > > liest sich so..... Was heißt hier verbastelt? Klar kann das sein aber ich wüste nicht wo! Ich habe ja baulich eigentlich nix relevantes verändert!
Hey Danke. Wieder was gelernt. :) -- Also an der ausgelöteten led kann es kaum liegen. Ist doch bestimmt nur wieder einer von diesen facepalm Momenten die wohl jeder Bastler kennt. Geh nochmal alles durch.
Gehe nicht über den Plan..Besorg Dir nen 32khz Quarz, geh in den Powersave, zähle die Sekunden selbst und nicht über ds3231.. wenn alles funktioniert hat,zeigt Dein Multimeter nix mehr an weil es nicht genau genug ist.
Philipp K. schrieb: > Gehe nicht über den Plan..Besorg Dir nen 32khz Quarz, geh in den > Powersave, zähle die Sekunden selbst und nicht über ds3231.. wenn alles > funktioniert hat,zeigt Dein Multimeter nix mehr an weil es nicht genau > genug ist. Wie stellst du dir das vor? Soll ich den Atmega328 nehmen und statt des 16MHz Quarzes einen 32kHz Quarz dranhängen und dann einfach per delay oder so die Sekunden zählen bis ich einen Wert schreibe? Da fehlt doch dann der Interrupt, der den µC wieder aus dem Powersave/Sleepmode hohlt oder? Ich bin aber für jede Möglichkeit offen, es sollte jedoch ein Datum und eine passende Uhrzeit zu jeder Messung zugeordnet werden!
Nein, Du hast das Sleepmode Tutorial also nicht durchgelesen.. erwischt! Dadrin nennt sich das PowerSave Mode und steht im dritten Absatz oder so. Du arbeitest auf ausreichenden 1-4Mhz internem Takt und haust den 32.768 an den richtigen Port.. Dann kannst Du das komplette Beispiel aus dem Tutorial nehmen und nen long hochzählen anstatt eine Led blinken zulassen. Ich meine es gibt eine Variable im AVR da steht das Flashdatum/Zeit drin.. bei der Ausgabe kannst du die in eine Unixtime umrechnen und auf deine gespeicherten sekunden draufrechnen. Laut dem "Sleepmode Artikel" sind das nur 10μA auf dauer ohne extras. Steht da im Prinzip alles drin.. ist aber nur Theorie denn ich habe mir die 32khz Teile erst heute bestellt.
:
Bearbeitet durch User
Lukas D. schrieb: > Da fehlt doch > dann der Interrupt, der den µC wieder aus dem Powersave/Sleepmode holt > oder? Nöö... Der geschickte Programmierer kann das schon so einrichten!
Philipp K. schrieb: > Du arbeitest auf ausreichenden 1-4Mhz internem Takt und haust den 32.768 > an den richtigen Port.. Dann kannst Du das komplette Beispiel aus dem > Tutorial nehmen und nen long hochzählen anstatt eine Led blinken > zulassen. warum sollte er das tun wenn er schon eine DS3231 hat?
Joachim B. schrieb: > warum sollte er das tun wenn er schon eine DS3231 hat? z.B. Weil dessen Akku bei 3,6V nicht vernünftig geladen wird?
DokuLeseVerweigerer schrieb: > z.B. Weil dessen Akku bei 3,6V nicht vernünftig geladen wird? das Problem wäre keines, D1 und R5 raus und CR 2032 einstzen, aber @DokuLeseVerweigerer auch den Thread nicht gelesen? er hat doch 5V, wie käme er sonst auf die Idee seine SD Karte mit einer Pegelanpassung zu betreiben? Lukas D. schrieb: > Auf dem Modul ist eine Pegelanpassung von 5v auf 3,3v
Joachim B. schrieb: > auch den Thread nicht gelesen? > > er hat doch 5V, Auch den Thread nicht gelesen? Lukas D. schrieb: > ich benutze einen Akkupack aus 3 > AAA-Akkus mit je 1,2V also 3,6V. 5V sehen anders aus.
DokuLeseVerweigerer schrieb: > Auch den Thread nicht gelesen? > > Lukas D. schrieb: >> ich benutze einen Akkupack aus 3 >> AAA-Akkus mit je 1,2V also 3,6V. > 5V sehen anders aus. was kann ich dafür wenn er an anderer Stelle anders schreibt, ich bin raus hier solange der TO keinen echten Plan und genaue Beschreibung vorlegt. Kann doch nicht sein, erst hü und dann hott, wo san mer denn
:
Bearbeitet durch User
Joachim B. schrieb: > Kann doch nicht sein, erst hü und dann hott, wo san mer denn Doch doch, genau so ist das Leben! Ein Zirkus.... Zum Problem an sich: 1. Irgendeinen AVR beschaffen 2. Irgendeine Spannungsquelle beschaffen 3. Irgendeine SD Karte mit Halter 4. Irgendeine Uhr Und jetzt soll der ganze Kram zusammen spielen! Leider erweist es sich dabei oft, dass ein paar winzige Randbedingungen nicht ausreichend beachtet wurden. Die kommen natürlich hier nicht sofort zum Vorschein... Wie auch, wenn Lukas D. um die Wichtigkeit der Randbedingungen gewusst hätte, hatte er vermutlich anderes Material beschafft. Aber jetzt haben wir einen Teil der Probleme ja immerhin schon mal benannt! Inclusive einigen Lösungsansätzen.
Tut mir jetzt wirklich leid, dass hier ein paar Sachen nicht zusammenpassen ... Ihr habt mir mit meinem ursprünglichen Problem echt weitergeholfen. Es hat ja soweit funktioniert und mit dem Verbrauch war ich auch recht zufrieden, doch jetzt geht Garnichts mehr. Wenn ich das jetzt wieder zum Laufen bekommen würde hätte sich das ganze Problem erübrigt!!!
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.