/*
Timer - Proof of Concept
https://forum.arduino.cc/t/zeitschaltuhr-mit-manuellem-ein-aus-schalter/688003
Timer in struct array
persist in EEPROM
read from EEPROM
act according stored timers
by noiasca
2021-07-21
*/
#include <EEPROM.h>
struct Timer {
bool active; // is the timer running
byte startHH; // start hour
byte startMM; // start minute
byte finishHH; // finish hour
byte finishMM; // finish minute
} timer[5];
const byte addrTimer = 0; // EEPROM start addresss for timer array
void testChangeValues()
{
timer[0].active = false;
timer[0].startHH = 0;
timer[0].startMM = 0;
timer[0].finishHH = 0;
timer[0].finishMM = 0;
timer[1].active = true;
timer[1].startHH = 0;
timer[1].startMM = 1;
timer[1].finishHH = 0;
timer[1].finishMM = 2;
timer[2].active = true;
timer[2].startHH = 0;
timer[2].startMM = 2;
timer[2].finishHH = 0;
timer[2].finishMM = 3;
timer[3].active = true;
timer[3].startHH = 11;
timer[3].startMM = 0;
timer[3].finishHH = 11;
timer[3].finishMM = 30;
timer[4].active = true;
timer[4].startHH = 22;
timer[4].startMM = 0;
timer[4].finishHH = 22;
timer[4].finishMM = 30;
EEPROM.put(addrTimer, timer);
}
void debugTimer()
{
// Ausgabe aller Werte
for (size_t i = 0; i < sizeof(timer) / sizeof(timer[0]); i++)
{
Serial.print(F("timer ")); Serial.println(i);
Serial.print(F(" active ")); Serial.println(timer[i].active);
Serial.print(F(" start ")); Serial.print(timer[i].startHH); Serial.print(":"); Serial.println(timer[i].startMM);
Serial.print(F(" finish ")); Serial.print(timer[i].finishHH); Serial.print(":"); Serial.println(timer[i].finishMM);
}
}
void runAutomatic()
{
uint32_t currentMillis = millis();
byte hh = currentMillis / 1000 / 60 / 24; // simulate HH
byte mm = currentMillis / 1000 / 60 % 60000UL; // simulate MM
static byte previousMM = 255;
if (previousMM != mm) // run automatic only once a minute
{
Serial.print(F("Current Time ")); Serial.print(hh); Serial.print(":"); Serial.println(mm);
for (size_t i = 0; i < sizeof(timer) / sizeof(timer[0]); i++)
{
if (timer[i].active && timer[i].startHH == hh && timer[i].startMM == mm)
{
Serial.print(F("ON timer ")); Serial.println(i);
}
else if (!timer[i].active) // only debug
{
Serial.print(F("not active timer ")); Serial.println(i);
}
else // only debug
{
Serial.print(F("no fitting starttime timer ")); Serial.println(i);
}
if (timer[i].active && timer[i].finishHH == hh && timer[i].finishMM == mm)
{
Serial.print(F("OFF timer ")); Serial.println(i);
}
}
previousMM = mm;
}
}
void setup() {
Serial.begin(115200);
// testChangeValues(); // einmal um Werte ins EEPROM zu bekommen
EEPROM.get(addrTimer, timer);
debugTimer();
}
void loop() {
// put your main code here, to run repeatedly:
runAutomatic();
}
testChangeValues soll dir nur zeigen, wie man Werte im struct verändert. Außerdem brauchte ich das einmal um Werte im EEPROM zu haben.
EEPROM speichern in das struct ist ein EINZEILER. Mit put werden wie bei update nur veränderte Werte geschrieben.
Ebenso
EEPROM auslesen in das struct ist ein EINZEILER.
debugTimer zeigt dir wie man auf die Werte im struct zugreift
runAutomatic ... ich hab mir HH / MM einfach aus den millis gemacht, der Sketch muss also ein paar Minuten laufen damit du siehst das was passiert. Wichtig erscheint mir, du hast Minuten-Timer, also braucht die Automatik nur einmal pro Minute laufen. Daher das static previousMM
Dann mal hier noch ein Wurf von mir.
Frage an den TO: ich könnte Dir das auch mit dem Aufbau via Array anbieten, aber das mache ich nur, wenn die lib für die RTC ausgetauscht wird und Du das ganze rechnen nicht mitmachst, sondern die Werte aus der lib nimmst.
Na dann...
Richte Dich auf neu bauen ein.
Timelib und rtc1307 von Paul Stoffregen
Letztere funktioniert auch mit einer 3231, da alles was die Uhr angeht gleich ist. Nur die Zusatzfunktionen der 3231 gehen damit nicht. Benutzt Du nicht, also sorglos.
Wenn Du einen ersten Einblick bekommen willst, dann lies einfach mal kurz ein meinem aktuellen Lieblingsteil...
Angefangen mit der Uhr und deren Tücken mit der DSlib, die ihr alle benutzt....
Ich habe die nur inhaltlich umgeschrieben mit deutschen Angaben. -> findest Du im ersten Link oben.
Die Example der time.lib einfach mal durchgehen...
(Ich weiss nicht genau, ob die ds3231 lib vorher gelöscht werden muss....)
habe deiner Conversation mit benziner leider nicht ganz folgen können.
Bei mir ist es so, dass ich neben den Tastenbelegungen und den Regensensor eine einfach Zeitschaltuhr mit 4 verschiedenen Timereinstellungen aufgebaut habe.
Nur das der Timer offenbar nicht richtig zählt.
Nun habe ich die Bibliotheken die du vorgeschlagen hast in den Code eingebunden und bekomme prompt folgende Fehlermeldung:
Ja - sorry.
Aehm..
Möchtest Du Dich darauf einlassen etwas neues zu bauen? - Ich habe das in #64 schon mal angesprochen, das Du Dich darauf einlassen müsstest.
Damit ist dann ein Umbau ausgeschlossen, Es wird ein Neubau - und Du musst mitmachen.
Das fängt damit an, die timelib und die dc1307 von Paul Stoffregen runterzuladen und dort wenigstens das TimeRTC-Example zum laufen zu bekommen.
Wenn das geht, baue ich mit Dir die Alarmierung in ein Array.
ja gerne, nur ich bin mich nicht sicher ob ich es mit meinen beschränkten Kenntnissen hin bekomme.
Die timelib und die dc1307 von Paul Stoffregen habe ich bereits herunter geladen und eingebunden.
Am WE (ich denke morgen Abend) werde ich versuchen gem. deiner Konversation mit Benziner das TimeRTC-Example aufzubauen.
leider noch nicht, da ich eine recht stressige Woche hinter mir habe ......kennt bestimmt jeder ....die Woche vor dem Sommerurlaub .....my-xy und ich haben in der Vergangenheit recht erfolgreich das Projekt vorangetrieben und möchte mich vorrangig darauf konzentrieren.
Ich bin aber für deine konstruktiven Beiträge sehr dankbar. Es kann einen nur schlauer machen.
ich habe versucht die Uhr gem. Dialog zwischen dir und Benziner aufzubauen, leider bekomme ich folgenden Fehler:
Blockquote
E:\Gartenbewässerung\Arduino-210722\UHR\UHR\UHR.ino: In function 'void setup()':
UHR:25:13: error: no matching function for call to 'LiquidCrystal_I2C::begin()'
In file included from E:\Gartenbewässerung\Arduino-210722\UHR\UHR\UHR.ino:9:0:
C:\Users\VB\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate: void LiquidCrystal_I2C::begin(uint8_t, uint8_t, uint8_t)
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
^~~~~
C:\Users\VB\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate expects 3 arguments, 0 provided
exit status 1
no matching function for call to 'LiquidCrystal_I2C::begin()'
Lerne zwischen warning und error zu unterscheiden.
Du solltest aber auch die Ursache von warnings beseitigen. unused parameter sagt, dass Du einen Wert übergibst, den aber nicht benutzt, die Übergasbe nach Ansicht des Kompilers also sinnlos ist.