VBen:
Einfach nur genial…
es hat auf anhieb geklappt.
Im Prinzip wie der manuelle Schalter. Wenn es betätigt ist, soll der Timer deaktivier sein damit die Pumpe bei Regen nicht anläuft.
Der Sensor ist nicht so problematisch. Ist eigentlich nur ne zusätzliche Zeile.
Bevor den bekommst, gibt es zwei Codeschnipsel, mit denen Du Dich beschäftigen sollst.
Der erste Teil ist als Ersatz für void blinking() gedacht. Der ist übersichtlich und soll Dir nur mal zeigen, wie dieses if if && && if if && && && if if aufgelöst werden kann.
void blinking ()
{
//BLINKING SCREEN
//Set Clock
// *INDENT-OFF* // das sorgt dafür, das die Formatierung nicht mehr verändert wird
if (setAlarm < 2) {
switch (setMode) {
case 1: {lcd.setCursor (0, 0); break;}
case 2: {lcd.setCursor (3, 0); break;}
case 3: {lcd.setCursor (6, 0); break;}
case 4: {lcd.setCursor (1, 1); lcd.print(" ");break;}
case 5: {lcd.setCursor (5, 1); break;}
case 6: {lcd.setCursor (8, 1); break;}
case 7: {lcd.setCursor (11, 1);lcd.print(" ");break;}
default:{break;}}
lcd.print (" ");}
//Set Timer
if (setMode == 0) {
if (mode == 0) {
switch (setAlarm) {
case 1: {lcd.setCursor (2, 1);break;}
case 2: {lcd.setCursor (6, 1);break;}
case 3: {lcd.setCursor (10, 1);break;}
case 4: {lcd.setCursor (13, 1);break;}
default: {break;}}
lcd.print(" ");}
else if (mode > 0) {
switch (setAlarm) {
case 1: {lcd.setCursor (11, 0);break;}
case 2: {lcd.setCursor (14, 0);break;}
case 3: {lcd.setCursor (11, 1);break;}
case 4: {lcd.setCursor (14, 1);break;}
default:{break;}}
lcd.print (" ");}}
// *INDENT-ON* // die Formatierung via STRG-T wieder eingeschaltet
}
Das sollte eigentlich funktionieren.
Interessant wird es, wenn Du das für Deine Tasten auf/ab umsetzt.
In Deinem Code in void setupClock(void)
beginnend mit
if(digitalRead (bt_up) == 0){
ersetze das gesamte Konstrukt mal durch folgendes:
if (!digitalRead (bt_up)) {
// *INDENT-OFF*
if (setAlarm < 2) {
switch (setMode){
case 1:{hh++;if (hh > 23)hh = 0;break;}
case 2:{mm++;if (mm > 59)mm = 0;break;}
case 3:{ss++;if (ss > 59)ss = 0;break;}
case 4:{set_day++;if (set_day > 7)set_day = 0;break;}
case 5:{dd++;if (dd > 31)dd = 0;break;}
case 6:{bb++;if (bb > 12)bb = 0;break;}
case 7:{yy++;if (yy > 2030)yy = 2000;break;}
default:break;}}
//Timer
if (setMode == 0) {
if (mode == 0 {
switch (setAlarm){
case 1:{timer1 = 1;break;}
case 2:{timer2 = 1;break;}
case 3:{timer3 = 1;break;}
case 4:{timer4 = 1;break;}
default:break;}}
else if (mode > 0) {
switch (setAlarm){
case 1:{StartHH++;if (StartHH > 23)StartHH = 0;break;}
case 2:{StartMM++;if (StartMM > 59)StartMM = 0;break;}
case 3:{FinishHH++;if (FinishHH > 23)FinishHH = 0;break;}
case 4:{FinishMM++;if (FinishMM > 59)FinishMM = 0;break;}
default:break;}}}
rtc.setDOW (set_day);
// *INDENT-ON*
}
Es wird also nicht Zeile für Zeile mit Bedingungen und Vergleichen geprüft, sondern von oben nach nur weiter gemacht, solange der vorherige Teil erfüllt ist.
Da fällt dann auch auf, das Du Dich das erste Mal schon auf Abwegen befindest.
dd könnte im Februar oder auch November 31 werden.
Das müsstest abfangen.
Wenn das mit dem Taster so funktioniert, dann bau das für if (digitalRead (bt_down) == 0)
nach.
Wenn das hast, zeigs und dann gibts die Zeile für den Sensor 