Forum: Mikrocontroller und Digitale Elektronik Arduino nach Uhrzeit an/ausschalten


von Sadorn (Gast)


Lesenswert?

Hallo,
Ich habe ein Arduino Projekt, bei welchem ich gerne den Mikrocontroller 
ab einer bestimmten Zeit an/abschalte würde, bzw. den Loop stoppen (z.b. 
zwischen 20:00 und 8:00 Uhr). Dazu würde ich das RTC Modul DS1307 (V03) 
verwenden, allerdings habe ich auf Google nichts gefunden, was mir 
weiterhelfen könnte. Villeichthat hat ja jemand von euch eine Idee.

Liebe Grüße

von Hugo H. (hugo_hu)


Lesenswert?

Sadorn schrieb:
> allerdings habe ich auf Google nichts gefunden

Dann wirst Du auch keine Ostereier finden :-)

von MaWin (Gast)


Lesenswert?

Sadorn schrieb:
> Dazu würde ich das RTC Modul DS1307 (V03) verwenden,

Tja, wer soll es denn auswerten und damit den Arduino einschalten ? Der 
Arduino offenbar nicht, der ist ja aus. Ein zweiter Arduino ? Mit Relais 
?

> allerdings habe ich
> auf Google nichts gefunden, was mir weiterhelfen könnte. Villeichthat
> hat ja jemand von euch eine Idee.

Offenkundig ist es eine blöde Idee. Wenn statt dem Arduino-Spielzeug ein 
echter Mikrocontroller wie ATmega328 verwendet wird, kann der in sleep 
vom Stromverbrauch her praktisch ausgeschaltet sein.

von H. H. (Gast)


Lesenswert?

Nimm besser einen RTC-Chip mit Alarmfunktion.

von Christian B. (cb1969)


Lesenswert?

Steckerzeitschaltuhr um dreifuffzich ...

von H. H. (Gast)


Lesenswert?

Christian B. schrieb:
> Steckerzeitschaltuhr um dreifuffzich ...

Viel zu einfach!

von Sebastian S. (amateur)


Lesenswert?

Ich würde mich Ha. Ha. anschließen.
Es gibt einen ganzen Sack voll RTC's mit Schaltausgang.
Du kannst aber auch jemanden einstellen, der den Schalter, zur rechten 
Zeit, betätigt.

von Jan (Gast)


Lesenswert?

Nun lasst ihn doch. Nicht jeder ist ein Profi oder will einer werden.

@Sadorn: Sowas macht man, indem man den µC in den sleep mode schickt. 
Dann braucht der nur noch 100nA Strom, also nichts. Natürlich muss der 
irgendwann wieder aufwachen. Das macht man, indem man z.B. den internen 
Watchdog laufen lässt, der alle 8 Sekunden den µC weckt und der dann 
nachschaut, obgenug Zeit vergangen ist. Der Watchdog ist nicht umsonst. 
Der Stromverbrauch steigt auf, je nach Modell, 250nA bis 6uA. Ist aber 
immernoch fast nichts.

Mit 6 uA hält eine CR2032 Knopfzelle ganze drei Jahre.

von Jan (Gast)


Lesenswert?

Vielleicht noch wichtig zu wissen: Der Watchdog ist nicht genau. 8s 
können auch mal gut 8.3s sein. Wenn es auf die Uhrzeit wirklich ankommt, 
musst doch noch einen externen Taktgeber einbauen. Wenn nicht, gut, dann 
hast du bereits alles an Bord, also gibts gratis.

von Wolfgang (Gast)


Lesenswert?

Sadorn schrieb:
> Dazu würde ich das RTC Modul DS1307 (V03) verwenden

Falls es dir nichts ausmacht, wenn die Schaltzeitpunkte um einige 
Sekunden pro Tag driften, ist das sicher eine gute Wahl.
Für eine stabilere Zeit ist eine DS3231 mit dem integrierten TCXO meist 
pflegeleichter.

von Martin V. (oldmax)


Lesenswert?

Hi
Nun ja, ich kenn zwar nicht den wirklichen Grund, aber der Sinn 
erschließt sich mir auch nicht. Feste Schaltzeiten können dem Controller 
zwar von außen gegeben werden,aber diese Bauteile brauchen auch Energie 
und machen eine mögliche Energieeinsparung eventuell wieder kaputt. Der 
Watchdog ist sinnvoll, wenn externe Ereignisse den Controller wecken 
können und er dann dieses Ereigniss abarbeitet und sich danach wieder 
schlafen legt.
In der Regel benötigt aber jede externe Sensorik auch Energie, so dass 
der Energiebedarf des Controllers nicht unbedingt eine Rolle spielt. Um 
also wirklich einen vernünftigen Rat zu geben, muss man den Gedanken 
dahinter kennen Nur dann kann man bewerten,ob eine "Abschaltung" des 
Controllers sinnig ist.
Gruß oldmax

von Erwin D. (Gast)


Lesenswert?

MaWin schrieb:
> Offenkundig ist es eine blöde Idee. Wenn statt dem Arduino-Spielzeug ein
> echter Mikrocontroller wie ATmega328 verwendet wird, kann der in sleep
> vom Stromverbrauch her praktisch ausgeschaltet sein.

Meistens IST der Arduino ein M328, also kann man ihn auch in den 
SleepMode schicken und periodisch die RTC abfragen.
Also offensichtlich keine "blöde Idee", nur ein blöder Kommentar...

von MaWin (Gast)


Lesenswert?

Erwin D. schrieb:
> Meistens IST der Arduino ein M328, also kann man ihn auch in den
> SleepMode schicken und periodisch die RTC abfragen.
> Also offensichtlich keine "blöde Idee", nur ein blöder Kommentar...

Oder ein blöder Erwin.

Ein Arduino ist mehr als ein ATmega328, nämlich Spannungsregler, USB 
Bridge, LEDs, und quartzgetaktet.

Man kommt nicht an seine fuses dran um ihn auf energiesparsam 
umzuprogrammieren.

Wenn man aber auf die blöde Platine verzichtet, hat man plötzlich alle 
Freiheit. Nur halt nicht mehr die USB Uploadmöglichkeit

Beitrag #7035216 wurde von einem Moderator gelöscht.
von MaWin (Gast)


Lesenswert?

Mohammed A. schrieb im Beitrag #7035216:
> Warum nicht ein esp8266? Kann per NTP synchronisieren, braucht den
> RTC nicht, und ist auch nicht teurer als ein 328p.

Bei dessen Stromverbrauch im Netz kann er alternativ den Arduino gleich 
die ganze Zeit durchlaufen lassen, braucht ihn gar nicht auszuschalten.

Beitrag #7035320 wurde von einem Moderator gelöscht.
von Uwe G. (scd)


Lesenswert?

Die Ausgangsfrage könnte man auch dahingehend verstehen, dass die 
Funktion des Arduino zu bestimmten Zeiten nicht erwünscht sei, also 
nicht das Stromsparen im Vordergrund stünde.

von MaWin (Gast)


Lesenswert?

Mohammed A. schrieb im Beitrag #7035320:
> Deep_sleep funktioniert bei den teilen wunderbar

Supi, und wie wacht er dann zu einer gegebenen Uhrzeit wieder auf ?

Beitrag #7035337 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

MaWin schrieb:
> Ein Arduino ist mehr als ein ATmega328, nämlich Spannungsregler, USB
> Bridge, LEDs, und quartzgetaktet.

Ein Arduino mit ATmega328 muss keine USB Bridge enthalten.
Der Arduino Pro Mini kommt ohne USB Bridge daher und es ist auch keiner 
gezwungen, den auf dem Board vorhandenen Spannungsregler zu verwenden. 
SJ1 nimmt den Regler und die Power-LED vollständig aus dem System raus.
https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

von EAF (Gast)


Lesenswert?

MaWin schrieb:
> Man kommt nicht an seine fuses dran ....

Du nicht.

Aber ein Arduino Jünger könnte das, und hat meist sogar das Werkzeug 
(einen zweiten Arduino) dafür.
Und das sind nicht die "Hohen Weihen" sondern nur ein klein bisschen 
mehr, als der Anfängerstatus.

Das Programm könnte man schön auf einem Standard Arduino UNO 
ausprobieren/entwickeln, und zum Ende hin den ATMega auf eine sparsamere 
Platine verpflanzen.

von MaWin (Gast)


Lesenswert?

Mohammed A. schrieb im Beitrag #7035337:
> Das "wach mal nach xx sekunden auf" geht prächtig. Mein
> batteriebetriebener sat-rx schläft zwischen den überflügen stundenlang.

Sorry, aber der sleep-timer nennt sich zwar RTC, ist aber nur RC und so 
ungenau, dass man danach wieder die Zeit holen muss - per NTP über WLAN. 
Das frisst so viel Strom, man sollte wohl besser einen Arduino mit 32kHz 
Quartz dauernd mitlaufen lassen um die Zeit mitzuführen.

https://arduino.stackexchange.com/questions/65530/esp8266-deep-sleep-timer-slightly-inaccurate

Beitrag #7035371 wurde von einem Moderator gelöscht.
von MaWin (Gast)


Lesenswert?

Mohammed A. schrieb im Beitrag #7035371:
> MaWin schrieb:
>
>> 32kHz
>> Quartz
>
> Der wäre wohl etwas gross ...

Geht so:

https://www.reichelt.de/standardquarz-grundton-32-768-khz-iqd-lfxtal002995-p245392.html

von Stefan F. (Gast)


Lesenswert?

Jan schrieb:
> Der Watchdog ist nicht genau. 8s können auch mal gut 8.3s sein

Oder 6 oder 10. Eine RTC braucht man trotzdem noch.

von Stefan F. (Gast)


Lesenswert?

MaWin schrieb:
> Man kommt nicht an seine fuses dran um ihn auf energiesparsam
> umzuprogrammieren.

Wozu ist dann der IST Connector vorhanden?

von HildeK (Gast)


Lesenswert?

Sadorn schrieb:
> Ich habe ein Arduino Projekt, bei welchem ich gerne den Mikrocontroller
> ab einer bestimmten Zeit an/abschalte würde, bzw. den Loop stoppen (z.b.
> zwischen 20:00 und 8:00 Uhr). Dazu würde ich das RTC Modul DS1307 (V03)
> verwenden,

Ich würde ein DS3231-Modul verwenden. Da kann man Alarmzeiten vorgeben, 
die Möglichkeit gibt es beim DS1307 nicht.
Wenn die Abschaltzeit (Alarm) erreicht ist, lässt man das Modul einen 
Interrupt machen und kann dann, nachdem die Aufweckzeit gesetzt wurde, 
den µC schlafen legen.
Beim nächsten Interrupt zur Aufweckzeit setzt der µC sein Programm fort, 
als erstes wird man den nächsten Zeitpunkt zum nächsten Stoppen und 
Schlafen legen in das Alarmregister schreiben. Und so weiter.

Falls es um sehr sparsamen Betrieb während der Ruhezeit geht, werden ein 
paar Modifikationen notwendig sein:
- DS3231-Module sind mit einer LED ausgestattet - die braucht keiner.
- dort sind auch diverse PUs verbaut, die nicht alle notwendig sind und 
µA kosten.
- Achtung, manche sind mit einer CR2032 ausgestattet, aber die 
Ladeelektronik für eine LIR2032 ist trotzdem drauf ...
- auch das gesamte Arduino-Board könnte sich selber von der 
Stromversorgung trennen und mit dem Alarmausgang des DS3231 wieder 
aktiviert werden. Schaltung ähnlich zum Transistortester.

Realisierungsvarianten gäbe es viele; Details für deine Anwendung hast 
du ja nicht genannt. So könnte man die aktuelle Zeit auch pollen und, 
falls dazwischen nicht viel zu tun ist, kurze Schlafphasen einlegen.
Ist für die Aufgabe überhaupt ein Arduino notwendig oder reicht nicht 
evtl. auch ein kleiner Tiny, insbesondere wenn es um sparsamen Betrieb 
gehen würde?

Nachteil beim DS3231, genauso wie beim DS1307, ist das Stellen der Uhr 
auf die aktuelle Zeit. Ich hab mir dazu eine HW, DCF-SW und einen 
Anschluss an meine DCF-Uhr gebastelt, mit denen ich das Modul einmal im 
Jahr stellen lasse.
Alternativ ginge das auch über einen UART-Anschluss über ein 
PC-Terminal.

von EAF (Gast)


Lesenswert?

HildeK schrieb:
> - DS3231-Module sind mit einer LED ausgestattet - die braucht keiner.
> - dort sind auch diverse PUs verbaut, die nicht alle notwendig sind und
> µA kosten.
> - Achtung, manche sind mit einer CR2032 ausgestattet, aber die
> Ladeelektronik für eine LIR2032 ist trotzdem drauf ...

Wenn es ein Modul sein soll.....
Dann rate ich zum ChronoDot Modul.
Komische Bauform, aber kein überflüssiger Kram drauf.

von Jan (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Jan schrieb:
>> Der Watchdog ist nicht genau. 8s können auch mal gut 8.3s sein
>
> Oder 6 oder 10. Eine RTC braucht man trotzdem noch.

Naja.... also wenn man man ganz naiv annimmt, der TO betreibt sein Gerät 
bei 25°, dann ist die Abweichung nicht ganz so extrem wie von dir 
geschildert.

Aber ja, wenn die Zeit sein muss, dann gehts nur mit Taktgeber. Muss ja 
nichtmal eine RTC sein. Ein 1 Hz Taktgeber, der eine ISR triggert, die 
einfach einen Counter hochzählt ist bereits eine halbe RTC.

Ich tippe aber drauf, dass der TO einfach Energie sparen will. Ich habe 
hier gut 50 Geräte mit Knopfzellen, die laufen alle mit einigen uA. 
Natürlich auch dann, wenn ich sie nicht brauche, eben weil es völlig 
egal ist.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Jan schrieb:
> Naja.... also wenn man man ganz naiv annimmt, der TO betreibt sein Gerät
> bei 25°, dann ist die Abweichung nicht ganz so extrem wie von dir
> geschildert.

Das angehängte Diagramm zeigt nur das "typische" Verhalten. Da lese ich 
(für 25°C und 5V) 114,5 kHz ab, was bereits eine beträchtliche 
Abweichung von den 128 kHz ist. Dazu kommen noch Fertigungstoleranzen, 
zu denen der Hersteller keine Angaben macht.

Ich denke nicht dass dieser Oszillator nicht taugt, um Zeiten zu messen 
oder festzulegen. Da ist ja jede Sanduhr um Welten präziser.

von MaWin (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> MaWin schrieb:
>
>> Man kommt nicht an seine fuses dran um ihn auf energiesparsam
>> umzuprogrammieren.
>
> Wozu ist dann der IST Connector vorhanden?

Um den eingelöteten Atmega328AU das erste Mal mit dem Arduino-Bootloader 
zu programmieren und auf den festgelöteten 16MHz Quartz einzustellen.

von Jan (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Das angehängte Diagramm zeigt nur das "typische" Verhalten. Da lese ich
> (für 25°C und 5V) 114,5 kHz ab, was bereits eine beträchtliche
> Abweichung von den 128 kHz ist. Dazu kommen noch Fertigungstoleranzen,
> zu denen der Hersteller keine Angaben macht.
>
> Ich denke nicht dass dieser Oszillator nicht taugt, um Zeiten zu messen
> oder festzulegen. Da ist ja jede Sanduhr um Welten präziser.

Ich habe nichts anderes behauptet. Für eine Uhrzeit ist er ungeeignet. 
Aber wie gesagt, ist eine Uhrzeit vllt gar nicht nötig. Es könnte auch 
nur ums Energiesparen gehen und da reicht es aus, eine billige 
Aufwachquelle zu haben. Da der TO sich bisher aber nicht mehr gemeldet 
hat, werden wir das vielleicht auch nie erfahren.

von Jan (Gast)


Lesenswert?

MaWin schrieb:
> Um den eingelöteten Atmega328AU das erste Mal mit dem Arduino-Bootloader
> zu programmieren und auf den festgelöteten 16MHz Quartz einzustellen.

Bei den Stückzahlen sollte man ja eigentlich meinen, die werden von 
Microchip direkt factory programmed geliefert....

von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich denke nicht dass dieser Oszillator nicht taugt

Oops, da steht ein "nicht" zu viel.

von Manfred (Gast)


Lesenswert?

Mohammed A. schrieb im Beitrag #7035337:
> Das "wach mal nach xx sekunden auf" geht prächtig. Mein
> batteriebetriebener sat-rx schläft zwischen den überflügen stundenlang.

Wenn es auf eine Stunde mehr oder weniger nicht ankommt, geht das 
prächtig.

Wolfgang schrieb:
> Ein Arduino mit ATmega328 muss keine USB Bridge enthalten.
> Der Arduino Pro Mini kommt ohne USB Bridge daher und es ist auch keiner
> gezwungen, den auf dem Board vorhandenen Spannungsregler zu verwenden.
> SJ1 nimmt den Regler und die Power-LED vollständig aus dem System raus.

Genau das habe ich in einer Anwendung getan, alles runter. Es wird nach 
jedem sleep (8s) ein Zähler inkrementiert, auf eine Steckbrücke und 
einen Taster geschaut und ansonsten bei Zählerstand 111 eine Aktion 
ausgelöst. Die Zeit ist furchtbar ungenau, aber stört mich in dieser 
Anwendung nicht.

Versorgt wird er per MCP1703T-5002 aus einer 12V Blei-Gel und schaltet 
alle etwa 15 Minuten per FET den Spannungsteiler an, um die Akkuspannung 
zu messen. Da ist noch ein großer Elko drumherum, in Mittel verbraucht 
das Gebilde etwa 25µA. Da sind keine Fuses geändert, das Ding läuft so, 
wie es der Chinese geliefert hat, mit dem Standard-A*-Bootloader.

MaWin schrieb:
>> Wozu ist dann der IST Connector vorhanden?
Sollte wohl ISP heißen.

> Um den eingelöteten Atmega328AU das erste Mal mit dem Arduino-Bootloader
> zu programmieren und auf den festgelöteten 16MHz Quartz einzustellen.

Wir haben zwar keine ATMega verbaut, sondern andere ICs, aber diese 
werden durchweg vor der Bestückung programmiert, das macht ein 
Dienstleister, der die auch wieder sauber gegurtet anliefert. Schon rein 
aus Gründen des Zeitaufwandes will man nicht nachträglich seriell 
programmieren.

von Sadorn (Gast)


Lesenswert?

Hallo,

Vielen Dank, für die Zahlreichen Antworten, auch wenn sich einige 
wiederspricht...
Um meine Frage nochmal zu präzisieren: Das Stromsparen steht tatsächlich 
gar nicht im Vordergrund. Es geht mir eigentlich darum, zwischen einer 
bestimmten Zeit den Loop den der Arduino sonst ausführt, zu 
unterbrechen. D.h. der Arduino liest die RTC aus, und wenn meine 
Vorgegebene Zeit erreicht ist, stoppt der Loop, und der Arduino kann 
sich gerne auch schlafen legen, oder er wacht wieder auf, wenn meine 
"Aufwachzeit" erreicht ist und der Loop geht weiter. Kleine Zeitliche 
Abweichungen stören mich im Übrigen auch nicht.

Damit stellt sich mir aber auch eine neue Frage, wie kann ich das 
programmieren?
Ich habe bisher nur gefunden, wie man den Arduino schlafen legen kann, 
aber ich habe keine Idee, wie ich den Arduino die RTC auslesen lassen 
könnte, sodass er danach entscheidet, ob der Loop läuft, oder stoppt. 
Ich würde mich freuen, wenn jemand dazu eine Idee, Tutorial oder 
ähnliches hat.

Liebe Grüße

von Stefan F. (Gast)


Lesenswert?

>> Wozu ist dann der IST Connector vorhanden?

Manfred schrieb:
> Sollte wohl ISP heißen.

Korrekt

von Stefan F. (Gast)


Lesenswert?

Sadorn schrieb:
> Ich habe bisher nur gefunden, wie man den Arduino schlafen legen kann,
> aber ich habe keine Idee, wie ich den Arduino die RTC auslesen lassen
> könnte, sodass er danach entscheidet, ob der Loop läuft, oder stoppt.

Befasse dich dazu mit dem Datenblatt des ATmega328, insbesondere dem 
Stichwort "Wakeup". Wenn der Mikrocontroller im Tiefschlaf ist, kann er 
durch ein (Interrupt-) Signal an einem I/O Pin aufgeweckt werden. Weil 
das ein Interrupt ist, musst du auch eine Interrupt-Prozedur schreiben, 
im einfachsten Fall eine leere.

Für diverse RTC Chips gibt es sicher passende Arduinio Bibliotheken auf 
Github. Du musst die RTC so konfigurieren, dass sie zum gewünschten 
Zeitpunkt das Interrupt-Signal auf einem Pin ausgibt.
Beim der Bibliothek für D3231 wäre das RTC.setAlarm(). Siehe 
https://thekurks.net/blog/2018/2/5/wakeup-rtc-datalogger

Wenn die Zeit nicht so super genau sein muss und Stromsparen nicht 
relevant ist, reicht dir vermutlich die Genauigkeit des 16 Mhz Quarzes 
(oder Resonator) von deinem Arduino Modul. Bei Einzelstücken könnte man 
auch erwägen, die Abweichung von der Soll-Zeit per Software 
aufzugleichen. In diesem Fall kannst du die Wartezeit einfach per 
delay() Befehl in deine Schleife einfügen.

von MaWin (Gast)


Lesenswert?

Sadorn schrieb:
> Es geht mir eigentlich darum, zwischen einer bestimmten Zeit den Loop
> den der Arduino sonst ausführt, zu unterbrechen.

Dazu braucht man keine extra Hardware, sondern nur grundlegende 
Programmierkenntnisse.

Also wirklich grundlegend, Kindergartenniveau. Selbst ein delay täte es 
laut deiner Beschreibung zur Unterbrechung bis 24 Tagen.

von HildeK (Gast)


Lesenswert?

Sadorn schrieb:
> Um meine Frage nochmal zu präzisieren: Das Stromsparen steht tatsächlich
> gar nicht im Vordergrund.
Ok, war oben nicht klar geworden.

> Es geht mir eigentlich darum, zwischen einer
> bestimmten Zeit den Loop den der Arduino sonst ausführt, zu
> unterbrechen. D.h. der Arduino liest die RTC aus, und wenn meine
> Vorgegebene Zeit erreicht ist, stoppt der Loop, und der Arduino kann
> sich gerne auch schlafen legen, oder er wacht wieder auf, wenn meine
> "Aufwachzeit" erreicht ist und der Loop geht weiter. Kleine Zeitliche
> Abweichungen stören mich im Übrigen auch nicht.
Deine Anwendung hast du nicht genannt. "Kleine zeitliche Abweichungen" 
heißen was? Eine Sekunde/Tag, eine Minute/Tag oder noch mehr oder nur 
eine Minute/Jahr?
Soll sich das z.B. regelmäßig jeden Tag wiederholen? Dürfen sich die 
Abweichungen pro Tag im Laufe der Zeit aufsummieren?

Sadorn schrieb:
> aber ich habe keine Idee, wie ich den Arduino die RTC auslesen lassen
> könnte, sodass er danach entscheidet, ob der Loop läuft, oder stoppt.
Die von mir genannte RTC wird über I2C angesprochen. Es gibt sicherlich 
auch I2C-Libs für den Arduino. Der RTC-Baustein hat Register für Datum 
und Uhrzeit sowie für zwei (?) Alarmzeiten, die man beschreiben und 
auslesen kann. Lies einfach das frei zugängliche Datenblatt des DS3231.
Wie ich oben schon sagte: Man gibt der RTC den Auftrag ein Signal zu 
generieren um hh:mm Uhr über die Alarmfunktion (wie bei einem Wecker). 
Die RTC schaltet dann einen Pin. Das kann man nutzen, um aus dem Schlaf 
aufzuwachen oder es einfach in einer Schleife regelmäßig auf eine 
Änderung abzufragen und dann entsprechende Codeblöcke auszuführen oder 
es zu lassen.
Ähnliches kann man auch mit den eingebauten Timern machen. Dann zählt 
man halt z.B. die Sekunden solange die Funktion ausgeführt werden soll 
oder eben nicht ausgeführt werden soll.
Mir fehlt einfach eine kurze Erklärung, was du mit der Anordnung machen 
willst. Das würde gute Tipps leichter machen.

von Manfred (Gast)


Lesenswert?

MaWin schrieb:
> Also wirklich grundlegend, Kindergartenniveau.

Böse, aber sehr wahr.

Sadorn schrieb:
> Das Stromsparen steht tatsächlich gar nicht im Vordergrund.

Diese Information kommt erheblich zu spät!

> Es geht mir eigentlich darum, zwischen einer
> bestimmten Zeit den Loop den der Arduino sonst ausführt, zu
> unterbrechen.

Es gibt keinen Grund, die Hauptschleife zu unterbrechen. Befasse Dich 
mit der Grundstruktur von Programmen.

In der Loop steht dann eben "frage die RTC ab" und dann die Entscheidung 
"wenn Zeit größer 08:00 und kleiner 20:00 mache etwas" ansonsten "delay 
irgendwas".

Da wird keine kilometerlange loop, sondern man lagert Funktionen in 
eigene Schleifen (Klassen ?) aus, die man in Art eines Befehls anspringt
1
void FrageUhrAb(){
2
..
3
}
4
5
void LEDgruenEin {
6
...
7
}

und so weiter, zumindest für Dinge, die man im Programmablauf mehrfach 
benötigt.

HildeK schrieb:
> Ähnliches kann man auch mit den eingebauten Timern machen. Dann zählt
> man halt z.B. die Sekunden solange die Funktion ausgeführt werden soll
> oder eben nicht ausgeführt werden soll.

Das mache ich anders: Ich hole mir millis(), addiere meine Zeitdauer 
dazu und schreibe das in eine Variable. In loop wird dann in jeder Runde 
verglichen, ob millis() größer Zielzeit ist. Das hat den Vorteil, dass 
auch ein zwischenzeitlicher Überlauf keinen Fehler erzeugt.

von Stefan F. (Gast)


Lesenswert?

Manfred schrieb:
> Das mache ich anders: Ich hole mir millis(), addiere meine Zeitdauer
> dazu und schreibe das in eine Variable. In loop wird dann in jeder Runde
> verglichen, ob millis() größer Zielzeit ist. Das hat den Vorteil, dass
> auch ein zwischenzeitlicher Überlauf keinen Fehler erzeugt.

Ich glaube diese Methode ist falsch, eben weil sie einen Überlauf 
erzeugt. Begründung:

Angenommen der Zeit-Zähler hat 8 Bit, wir starten beim Wert 254 und 
wollen 5 Millisekunden warten. Dann rechnest du

254 + 5 = 3  (wegen Überlauf)

Im nächsten Schritt wartest du so lange, bis millis() > 3 ist, was 
sofort der Fall ist. Du hast keine 5 ms gewartet.

Neuer Versuch: Angenommen der Zeit-Zähler hat immer noch 8 Bit aber du 
benutzt eine 16 Bit Variable. Dann rechnest du:

254 + 5 = 259 (kein Überlauf)

Im nächsten Schritt wartest du so lange, bis millis() > 259 ist, was 
niemals passiert. Dein Programm hängt sich auf.

Der Fehler tritt bei größeren Zählern ebenso auf, nur nicht so häufig.

Richtig geht es mit einer Subtraktion. Dabei ist wichtig, dass die 
Variable (start) ein unsigned int gleicher Größe ist, wie der 
Rückgabewert von millis().

start=millis()
if (millis()-start >= intervall) {
  tue etwas;
}

Falls nicht klar ist warum, spiele das mal in einem Debugger durch - 
gerne auch auf einem PC, wenn du keinen µC mit Debugger hast. Wenn der 
Zähler gerade übergelaufen ist, ergibt die Subtraktion trotz Überlauf 
die richtige Differenz. Beispiel:

3 - 254 = 5

von Erwin D. (Gast)


Lesenswert?

MaWin schrieb:
> Um den eingelöteten Atmega328AU das erste Mal mit dem Arduino-Bootloader
> zu programmieren und auf den festgelöteten 16MHz Quartz einzustellen.

Wer verbietet es einem, nicht nur die Erstprogrammierung darüber zu 
machen, sondern ihn auch das zweite oder dritte Mal zu programmieren und 
dabei logischerweise auch die Fuses mit zu programmieren? Tut mir ja 
leid, dass du dich dazu nicht in der Lage fühlst, aber andere können das 
zweifellos!

von MaWin (Gast)


Lesenswert?

Erwin D. schrieb:
> Wer verbietet es einem, nicht nur die Erstprogrammierung darüber zu
> machen, sondern ihn auch das zweite oder dritte Mal zu programmieren und
> dabei logischerweise auch die Fuses mit zu programmieren? Tut mir ja
> leid, dass du dich dazu nicht in der Lage fühlst, aber andere können das
> zweifellos!

Wenn man den eingelöteten Quartz gegen einen 32kHz ersetzt, die LEDs 
ausbohrt, den Spannungsregler ablötet, die Leiterbahnen zum USB Bridge 
Chip durchkratzt, könnte man nach Reprogrammierung des ATmega328 und 
dessen fuses aus einem Arduino was stromsparendes machen.

Aber es ist Schwachsinn, das machen nur Schwachsinnige.

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
Noch kein Account? Hier anmelden.