Ciao a tutti,
Ho un problema di blocco durante la fase di settaggio ore e/o minuti, penso sia di programmazione.
Sto realizzando un semplice orologio su un micro diplay oled ( risoluzione 96x32) e un DS3231 da settare con un solo pulsante.
In modalità orologio funziona perfettamente, testato per 48H senza blocchi.
in modalita setting molto spesso va in blocco, tenendo premuto il pulsante di program entro nella sub routine di program e compare un apice ad indicarmi cosa sto per modificare.
molto spesso dopo aver incrementato 1 o 2 volte il sistema va in blocco, Ho inserito un delay(50) dopo la scrittura sul DS per prova.... ma nulla.
L'auto exit dalla funzione di programmazione funziona correttamente.
#include <Wire.h>
#include "DS3231.h"
DS3231 Clock;
RTClib RTC;
#include "er_oled2.h"
#include <avr/wdt.h>
int lux = 3;
int lux_read = A2;
int button = A1;
int prog = 0;
int programstart = 0;
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int luxset = 0;
int a_exit = 0;
int cicl = 0;
int ciclo1 = 0;
int countm = 0;
int counth = 0;
int countsec = 0;
int logostart =0;
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 500; // intervallo del timer in milliseconds
int tmr_out =0;
uint8_t oled_buf[WIDTH * HEIGHT / 8];
void setup() {
// Serial.begin(9600);///////////////////////////////////////////////////////////////////////
pinMode(button, INPUT_PULLUP);
pinMode(lux_read, INPUT_PULLUP);
pinMode(lux ,OUTPUT);
analogWrite (lux, 100);
Wire.begin();
er_oled_begin();
er_oled_clear(oled_buf);
command(0xC8); // sottosopra
er_oled_display(oled_buf);
er_oled_clear(oled_buf);
Wire.begin(); // RTC
}
void loop() {
DateTime now = RTC.now(); // x RTC
if ((programstart== 0)&&(prog<25)&&((digitalRead(button) == 0))){prog ++;}
if ((programstart== 0)&&(prog >=25)){progm();buttonState = digitalRead(button);lastButtonState = buttonState;}
if (countm != now.minute()||counth!= now.hour()||(ciclo1 == 0)){
er_oled_clear(oled_buf);
er_oled_char(46, 1, '.' ,12, 1, oled_buf);
er_oled_char(46, 13, '.' ,12, 1, oled_buf);
if (now.hour() == 0){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 1){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 2){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 3){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 4){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 5){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 6){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 7){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 8){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 9){er_oled_bitmap(0, 0, N0, 96, 32, oled_buf); er_oled_bitmap(23, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 10){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 11){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 12){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 13){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 14){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 15){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 16){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 17){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 18){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 19){er_oled_bitmap(0, 0, N1, 96, 32, oled_buf); er_oled_bitmap(23, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 20){er_oled_bitmap(0, 0, N2, 96, 32, oled_buf); er_oled_bitmap(23, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 21){er_oled_bitmap(0, 0, N2, 96, 32, oled_buf); er_oled_bitmap(23, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 22){er_oled_bitmap(0, 0, N2, 96, 32, oled_buf); er_oled_bitmap(23, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() == 23){er_oled_bitmap(0, 0, N2, 96, 32, oled_buf); er_oled_bitmap(23, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if (now.hour() > 23){Clock.setHour(0);}
if(now.minute() == 0){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 1){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 2){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 3){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 4){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 5){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 6){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 7){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 8){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 9){er_oled_bitmap(52, 0, N0, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 10){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 11){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 12){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 13){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 14){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 15){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 16){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 17){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 18){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 19){er_oled_bitmap(52, 0, N1, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 20){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 21){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 22){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 23){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 24){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 25){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 26){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 27){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 28){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 29){er_oled_bitmap(52, 0, N2, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 30){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 31){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 32){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 33){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 34){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 35){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 36){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 37){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 38){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 39){er_oled_bitmap(52, 0, N3, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 40){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 41){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 42){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 43){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 44){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 45){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 46){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 47){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 48){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 49){er_oled_bitmap(52, 0, N4, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 50){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N0, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 51){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N1, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 52){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N2, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 53){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N3, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 54){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N4, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 55){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N5, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 56){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N6, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 57){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N7, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 58){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N8, 96, 32, oled_buf);er_oled_display(oled_buf);}
if(now.minute() == 59){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf);er_oled_bitmap(76, 0, N9, 96, 32, oled_buf);er_oled_display(oled_buf);}
countm = now.minute() ;
counth = now.hour() ;
ciclo1 =1;
}// end if orario---------------------------
if (programstart>= 1){progm();}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {previousMillis = currentMillis; if (tmr_out == 0) {tmr_out = 1;} else {tmr_out = 0;}}
if (tmr_out == 0) {
er_oled_char(46, 1, '.' ,12, 1, oled_buf);
er_oled_char(46, 13, '.' ,12, 1, oled_buf);
er_oled_display(oled_buf);
}
else{er_oled_char(46, 1, ' ' ,12, 1, oled_buf);
er_oled_char(46, 13, ' ' ,12, 1, oled_buf);
er_oled_display(oled_buf);
}
wdt_reset();
}// ************************************************* end loop******************************************************************
void progm(){////////////////////////////////////////////////////////////////////////////////
if (programstart == 0) {programstart =1;}
if (a_exit >= 80){ programstart =0 ;prog =0;cicl =0;a_exit =0;} // uscita automatica da programmazione
if (programstart == 1){ // sistyema ore*******************************
er_oled_char(45, 1, '<' ,12, 1, oled_buf);
DateTime now = RTC.now(); // x RTC
er_oled_display(oled_buf);
buttonState = digitalRead(button);
if (buttonState != lastButtonState) { if (buttonState == HIGH) {cicl ++; if (cicl >=2){ Clock.setHour(now.hour()+1);delay(80); a_exit =0; if(prog > 25){prog =25;} } } }
if (prog >= 25 && prog <= 40 && buttonState == lastButtonState){ if (buttonState == LOW) {prog ++;a_exit =0;}}
if (prog >=40){programstart =2 ;cicl =0;}
lastButtonState = buttonState;
wdt_reset();
}// fine sistema ore****************************
if (programstart == 2){ // sistyema minuti******
DateTime now = RTC.now(); // x RTC
er_oled_char(45, 13, '>' ,12, 1, oled_buf);
er_oled_display(oled_buf);
buttonState = digitalRead(button);
if (buttonState != lastButtonState) { if (buttonState == HIGH) {cicl ++; if (cicl >=2){ Clock.setMinute(now.minute()+1);delay(50); a_exit =0; if(prog > 40){prog =40;}} } }
if (prog >= 40 && prog <= 70 && buttonState == lastButtonState){ if (buttonState == LOW) {prog ++;a_exit =0;}}
if (prog >=70){programstart =0 ;prog =0;cicl =0;a_exit =0;}
lastButtonState = buttonState;
wdt_reset();
}// fine sistema minuti****************
a_exit ++;
}// end progm*****************************************************************************