Ds3231 Va in blocco durante settaggio orario

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*****************************************************************************


Ho dovuto personalizzare la libreria davvero scarsa del controller del display (er_oled) per realizzare dei numeri grandi con un font di mio gradimento tramite il programma LCDAssistant.
questo per spiegare il motivo di quei numerosi e ripetuti

if(now.minute() == 59){er_oled_bitmap(52, 0, N5, 96, 32, oled_buf)

Che mi permettono di visualizzare correttamente le cifre, ma in visualizzazione funziona tutto bene.

Altra info: quando il sistama va in blocco anche il display va in blocco smettendo di fare il refresh,se resetto però trovo l'orario aggiornato, quindi la funzione di settaggio ore o minuti viene trasmessa

Per scrivere ore e minuti potresti molto più brevemente usare un'unica funzione con dieci if (o uno switch/case) a cui invii le singole cifre delle ore e dei minuti:

scrivi_n (now.hour()/10, posizione);
scrivi_n (now.hour()%10, posizione);
scrivi_n (now.minute()/10, posizione);
scrivi_n (now.minute()%10, posizione);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.