Ciao a tutti,
nel dispositivo che sto assemblando, necessito oltre che visualizzare data e ora, anche di una funzione TimeSwitch, tipo presa temporizzata, il problema è che il tutto dovrebbe essere sandalone e quindi dovrei regolare data, ora, ora accensione e ora spegnimento , possibilmente utilizzando solo 3 pulsanti ( ma anche 4 va bene).
Vi allego la parte del codice, ma non funziona correttamente, ad esempio i “contatori” aumentano senza che io prema il pulsante.
Comunque l’ideale sarebbe che un pulsante mi permetta di passare da una funzione all’altra (es. giorno–>mese–>anno–>ora…ecc) e con gli altri due, incrementare o decrementare il valore; sarebbe opportuno inoltre riuscire a “bloccare” il loop ( almeno sul display) mentre esegue le impostazioni di set.
if (digitalRead(TimeRegBut)) {
delay(15);
setModeLevel=setModeLevel +1;
Serial.println (setModeLevel);
};
DateTime now = RTC.now();
lcd.clear();
sprintf(buffer, "%02d/%02d", now.day(), now.month());
lcd.setCursor(0,0);
lcd.print( buffer );
char buffer[10] = "";
sprintf(buffer, "%02d:%02d", now.hour(), now.minute());
lcd.setCursor(0,1);
lcd.print( buffer );
while (digitalRead(Set)) {
Serial.println (" SETMODE ");
Serial.println (setModeLevel);
boolean setMode = true;
setModeLevel = 0;
int _day = now.day();
int _month = now.month();
int _year = now.year();
int _hour = now.hour();
int _min = now.minute();
int _sec = now.second();
lcd.clear();
lcd.setCursor(0,0);
sprintf(buffer, "%s: %02d", "Giorno", _day);
delay( 1000 );
timeSet = millis();
while ( setMode ) {
if (digitalRead(TimeRegBut) == HIGH || digitalRead(TimeUp) == HIGH || digitalRead(TimeDn) == HIGH ) { timeSet = millis(); }
lcd.setCursor(0,0);
// Set Day
if ( setModeLevel == 0 ) {
if ( digitalRead(TimeUp) == HIGH && _day < 31) { _day++; }
if ( digitalRead(TimeDn) == HIGH && _day > 1) { _day--; }
sprintf(buffer, "%s: %02d", "Giorno", _day);
}
// Set Month
if ( setModeLevel == 1 ) {
if ( digitalRead(TimeUp) == HIGH && _month < 12) { _month++; }
if ( digitalRead(TimeDn) == HIGH && _month > 1) { _month--; }
sprintf(buffer, "%s: %02d", "Mese", _month);
}
// Set Year
if ( setModeLevel == 2 ) {
if ( digitalRead(TimeUp) == HIGH && _year < 9999) { _year++; }
if ( digitalRead(TimeDn) == HIGH && _year > 1900) { _year--; }
sprintf(buffer, "%s: %02d", "Anno", _year);
}
// Set Hour
if ( setModeLevel == 3 ) {
if ( digitalRead(TimeUp) == HIGH && _hour < 24) { _hour++; }
if ( digitalRead(TimeDn) == HIGH && _hour > 1) { _hour--; }
sprintf(buffer, "%s: %02d", "Ora", _hour);
}
// Set Minute
if ( setModeLevel == 4 ) {
if ( digitalRead(TimeUp) == HIGH && _min < 60) { _min++; }
if ( digitalRead(TimeDn) == HIGH && _min > 1) { _min--; }
sprintf(buffer, "%s: %02d", "Minuti", _min);
}
// Set Second
if ( setModeLevel == 5 ) {
if ( digitalRead(TimeUp) == HIGH && _sec < 60) { _sec++; }
if ( digitalRead(TimeDn) == HIGH && _sec > 0) { _sec--; }
sprintf(buffer, "%s: %02d", "Secondi", _sec);
}
//Set OraStart
if ( setModeLevel == 6 ) {
if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraStart++; }
if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraStart--; }
sprintf(buffer, "%s: %02d", "OraStart", OraStart);
}
//Set MinStart
if ( setModeLevel == 7 ) {
if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinStart++; }
if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinStart--; }
sprintf(buffer, "%s: %02d", "MinStart", MinStart);
}
//Set OraOFF
if ( setModeLevel == 8 ) {
if ( digitalRead(TimeUp) == HIGH && _sec < 24) { OraOff++;}
if ( digitalRead(TimeDn) == HIGH && _sec > 1) { OraOff--; }
sprintf(buffer, "%s: %02d", "OraOff", OraOff);
}
//Set MinStart
if ( setModeLevel == 9 ) {
if ( digitalRead(TimeUp) == HIGH && _sec < 60) { MinOff++; }
if ( digitalRead(TimeDn) == HIGH && _sec > 1) { MinOff--; }
sprintf(buffer, "%s: %02d", "MinOff", MinOff);
}
lcd.print( buffer );
// if ( digitalRead(TimeRegBut) == HIGH ) { lcd.clear(); setModeLevel++; }
if ( setModeLevel > 9 ) { setModeLevel=0; }
if (digitalRead(Set) == LOW) {
RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
setMode = false;
}
delay(200);
}
}
grazie
Jacopo