Arduino Sketch Zeitschaltung?


21.11.2020, 13:13

Es geht um die Abweichung über mehrere Tage. Um diese irgendwie gering zu halten.

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Mein 6/18h-Timer der auf Attiny25 läuft.... Aber du brauchst eine ext Quarz.. Die internen sind viel zu ungenau...

unsigned long currentMillis = millis(); //Zeitspeicher
void setup() {
  pinMode(0, OUTPUT); //LED-Ausgang
}
void loop() {
  if (millis() - currentMillis >= 86400000) {
    currentMillis = millis();  //24h (86400000 ms) abgelaufen -> Zeitspeicher neu setzen
  }
  else if (millis() - currentMillis < 21600000) {
    digitalWrite(0, HIGH);  //Ausgang ein während den ersten 6h (21600000 ms) nach setzen des Zeitspeicher
  }
  else {
    digitalWrite(0, LOW);  // ausschalten des Ausgang wenn keine Bedingung erfüllt ist
  }
}
Fragewitz 
Fragesteller
 21.11.2020, 13:49

Danke erst mal.

Also die millis werden das erste mal übergeben im globalen Teil.

Die erste if Abfrage aktualisiert nach 24 Stunden die currentMillis.

Die zweite else if Abfrage schaltet bei Erfüllung der Bedingung nach 6 Stunden erste ein. Nur es soll ja von Beginn High sein. Dafür hatte ich (wenn auch verschoben kopiert) im setup den pin gleich auf High genommen.

Das heißt aber in dem Sketch das der Ausgang nur im setup High geht und weil keine Bedingung erfüllt ist, alles sofort wieder auf low geht.

Müsste das als Operator nicht mit doppeltem << geschrieben werden? Sieht komisch aus.

Und in der letzten else ist alles aus wenn nichts erfüllt ist.

0
RareDevil  21.11.2020, 13:54
@Fragewitz
Die zweite else if Abfrage schaltet bei Erfüllung der Bedingung nach 6 Stunden erste ein. Nur es soll ja von Beginn High sein. Dafür hatte ich (wenn auch verschoben kopiert) im setup den pin gleich auf High genommen.

Nein, wenn der Zeitspeicher, der nach 24h aktualisiert wurde, gesetzt ist, dann ist in den ersten 6h direkt high.. Ist die aktuelle Zeit ("millis()") zum Zeitspeicher größer wie 6h, geht der Ausgang aus. Also nach dem laden ist direkt ein, nach 6h dann für 18h aus, bis der Zeitspeicher nach 24h neu gesetzt wird... Du brauchst also nur die 6h auf 7h zu ändern und hast einen 7h/17h-Timer, da die 24h immer fest bleiben...

0
Fragewitz 
Fragesteller
 21.11.2020, 14:43
@RareDevil

Nach 6 Stunden geht der auf High bei dir. Aber im Setup wurde in meinem Sketch der Pegel direkt auf High gesetzt. Bei dir wäre das erst nach 6 Stunden. Sobald der Controller startet soll aber High sein. Dann 17 Stunden aus.

Das erste else if greift ja erst nach 6 Stunden.

0
Fragewitz 
Fragesteller
 21.11.2020, 15:01
@RareDevil

Ach stimmt. Da steht ja wenn es kleiner ist als 6 Stunden dann an. 😄 Ahh

Aber eins noch. Bei einem Arduino könnte ich so ein Uhren Modul verwenden. Aber bei einem Attiny?

0
RareDevil  21.11.2020, 16:41
@Fragewitz

Uhrenmodul wäre ja nur nötig, wenn Du eine feste Uhrzeit vorgeben willst.

https://www.instructables.com/TEMPO-the-Handy-Timer-Switch-Attiny85-DS3231-RTC-B/

In dem Projekt nutzt einer einen Attiny und eine TinyWire-Library für die I2C-Kommunikation. Weiß nur nicht, wann der Tiny an seine Speichergrenzen stößt... Wenn das Projekt rel schmal ist, dürfte es wohl passen. Habs aber noch nicht ausprobiert. Mir reicht der Timer... Wenn wir Batterien in der Beleuchtunbg wechseln, dann zu der Zeit, wann sie angehen soll... Durch die ext Quartz laufen die in der Woche bis zur leeren Batterie nicht weg... Ohne Quartz gingen alle am nächsten Tag schon unterschiedlich an.. Bis zu zwei Stunden Zeitversatz... Das würde die RTC kompensieren, da sie die Uhrzeit vorgibt...

https://arduino-projekte.webnode.at/meine-libraries/rtc-ds3231/

noch ein Beispiel....

1
Fragewitz 
Fragesteller
 21.11.2020, 21:49
@RareDevil

Eh ja. Zur RTC im Prinzip wäre die Steuerung anhand der echtzeit Uhr möglich. Die Zeit ließe sich ja dann mittels eines Tasters, also Zählers oder ähnlichem, meinetwegen halbstündig anpassen. Bzw. Müsste man doch nur die aktuelle Uhrzeit einlesen und mit dieser dann rechnen anstelle der millis.

Wie hast du persönlich das mit dem externen Quarz gelöst?

0
RareDevil  21.11.2020, 22:07
@Fragewitz

Genau, die RTC wird ausgelesen und dann hast Du Variablen zu h, m, s ect und musst drauf prüfen, ob eine bestimmte Zeit erreicht ist und dann darauf reagieren... Die kann man auch als Alarm definieren und auf den Alarm prüfen. Hab ich aber noch nicht gemacht.

Quartz ist super einfach... Ich hab mir 4Mhz-Quartz bestellt, die haben 2 Anschlussdrähte. Einer kommt an Pin2 und einer Pin3... In der IDE dann bei den Bootloadersettings, wenn man den Attiny als Board gewählt hat, einfach "Ext 4Mhz" einstellen und Bootloader brennen, danach Sketch übertragen, fertig....

Der ATTiny25/45/85 hat ja den XTAL1 und XTAL2-Pin an den Pins 2 und 3...

0
RareDevil  21.11.2020, 22:09
@RareDevil

Wichtig ist, dass beim brennen des Bootloader die Quartz schon angeschlossen ist. Hab mir eine auf dem Steckbrett gesteckt und hinterher angelötet, da ich die Attiny nicht auf einem PCB nutze, sondern lose als "Fliegenverdrahtung" im Batteriefach der Lichterketten... Platzsparend ^^

0
Fragewitz 
Fragesteller
 21.11.2020, 22:24
@RareDevil

Also ich habe mir ein Board zusammengebaut auf dem ist ein Arduino nano und Steckplätze für DIP-8 für Attiny85 und SOIC-8 für attiny13.

Also neheme ich als Programmer Arduino as ISP und dann kann ich bei attiny85, Clock ändern auf External 8 MHz 16MHz und 20MHz.

0
RareDevil  21.11.2020, 22:28
@Fragewitz

Dann hast Du eine andere Boardbibliothek für den Attiny.. Hab zwei oder drei... Die haben verschiedene Einstellmöglichkeiten. Eine von denen kann zumindest auch auf 4MHz... Wenn Du eine 8 oder 16MHz Quartz nimmst, dann stellst Du es entsprechend ein. Bin auf 4Mhz gegangen, wegen der Versorgungsspannung und dem Verbrauch, da er nur mit 2 Mignonakkus betrieben wird. Bei höheren Frequenzen soll er mit mind 2,7V glaube ich versorgt werden... 2 Mignonakkus haben aber nur 2,4V und gehen auf 1,8V runter, bis sie leer sind...

Wichtig ist, dass Du eine Möglichkeit hast, die Quarz auch schon zum programmieren anzuschließen, da ab dem Brennen des Bootloader mit den ext Quartzeinstellungen dieser nur noch mit ext uartz läuft und sich auch nur noch mit Quartz programmieren lässt...

0
Fragewitz 
Fragesteller
 21.11.2020, 23:07
@RareDevil

Okay okay Okay. Sehr interessant alles.

Habe bei ebay ein Kit Quarz 8 MHz mit Kondensatoren gefunden. Normal bestell ich gleich in China aber bei 4,50 Euro für 4 Stück geht das schon mal. Die Kondensatoren kommen sicherlich parallel zwischen die Pins 2 und 3.

Und du meinst ich müsste dann nur den Bootloader brennen und danach müsste der Attiny mit externaler Clock laufen und sich bespielen lassen?

Noch was. Da es bis jetzt keine Rolle spielte und die einen Versorgungsbereich von glaube 1,8 V bis etwa 5V haben, verwende ich Lithium Akkus die eben ihren Bereich von etwa 3,7V bis 4,2V haben und so lief das alles gut. Nur wird es beim Quarz dann zum Problem wenn denn die Spannung abfällt? Sonst müsste ich das noch stabilisieren was zwar kein Problem ist aber wenn nicht nötig eben umsonst.

0
RareDevil  21.11.2020, 23:37
@Fragewitz

Nein, mit der Spannung gibt es keine Probleme. Die Quartz bleibt Frequenzstabil... Besonders wenn die Spannung über 2,7V bleibt...

Im Internet ist von Pin2 und Pin3 jeweils noch ein Kondensator gegen Masse geschaltet. Die hab ich tatsächlich erst jetzt entdeckt... Hab damals einfach die Quartz ohne weitere Beschaltung an Pin2 und 3 gesteckt und lief perfekt. Ggf sind die Kondensatoren noch zum stabilisiseren.. Keine Ahnung, ob die Sinn machen..

Mit den Spannungen hab ich im Datenblatt gelesen, dass 0-4Mhz bei dem Attiny25V 1,8-5,5V angegeben sind und bei 0-10Mhz z.B. 2,7-5,5V... Deshalb bin ich auf 4 Mhz gegangen... Hatte aber bei 2,4V auch mal einen 16Mhz dran und lief auch ohne Probleme...

0
Fragewitz 
Fragesteller
 21.11.2020, 23:49
@RareDevil

Okay also gegen Masse pro pin. Ja sicherlich zum stabilisieren.

Wenn das ansich so einfach ist, könnte ich das noch nachrüsten.

Und man kann die Controller nicht mehr einfach umstellen auf internal Clock auch wenn der externe noch dran hängt? Oder muss man theoretisch da für den Bootloader auch so eine high voltage Beschreibung durchführen? Die geht dann über 12V irgendwie. Hab vergessen wie das war.

0
RareDevil  22.11.2020, 00:47
@Fragewitz

Nein, den HighVoltage-Reset brauchst Du, wenn Du den Resetpin als Ein-/Ausgang nutzt und den Reset nicht mehr durchführen kannst. Wenn Du den ext quartz dran hast und brennst den Booloader dann mit Int16Mhz oder anderen internen, läuft der danach wieder mit dem internen... Ist beliebig änderbar... Nur beim Bootloaderbrennen wird das Programm gelöscht. Danach musst Du also immer das aktuelle rogramm noch mal neu flashen... Deshalb erst Bootloader einstellen, dann das Programm. Auch die Timings werden entsprechend den Bootloadereinstellungen angepasst. Brennst Du einen 4Mhz-Bootloader und stellst dann auf 16Mhz und schreibst das Programm, stimmen die Timings nicht mehr.. Ein 1s Delay würde dann 4s brauchen, da der µC nur mit 1/4 der Taktrate läuft.. Ist alles voneinander abhängig...

0
Fragewitz 
Fragesteller
 22.11.2020, 23:41
@RareDevil

Ja genau.. Beim attiny13 musste ich die Timings manuell anpassen weil die überhaupt nicht stimmten. Trotz Interner Clock. Wie auch immer, jetzt wo du das sagst, es ging um den Reset pin. Stimmt. Dachte das es mit dem Clock wechsel auch was zu tun hatte. Also ich muss echt sagen, klasse user bist du. 👍🏼

Ich melde mich noch mal wenn das mit dem External Quarz geklappt hat.

0
RareDevil  23.11.2020, 05:42
@Fragewitz

Agemerkt: Die ATTiny13 haben eine auf 10% genau kalibirierte Quartz intern. Das ist noch so grob, dass die auch weg laufen... In Foren haben User die auf ca 3% nachkalibriert. Aber 3% auf 24h ist auch noch viel... Leider haben die ATTiny13 keine Möglichkeit, mit einer ext Quartz so betrieben zu werden, wie die Attiny 25/45/85 z.B...

Ja dann viel Spaß erst mal :)

0
Fragewitz 
Fragesteller
 25.11.2020, 14:29
@RareDevil

Also wenn ich gewusst hätte, dass das so einfach geht.. ;)

Hat beim ersten Versuch alles geklappt. Großes Dankeschön. ps. Da ich keinen Bock hatte die Platine zu lösen, hab ich die Kondensatoren gleich weg gelassen. Ich meine ich habe hier nur eine Gleichspannung ohne große Störungen. Vielleicht hat das aber auch nur mit der Funktion des Quarzes selber etwas zu tun.

0