Problema con reloj RTC

Buenas, tengo un problema, estoy intentando hacer un dispensador de alimento automático, pero cuando conecto el reloj(RTC DS3231) la pantalla(Pic I2c) se queda pausada y el programa deja de funcionar. ¿Podrían ayudarme?
Este es mi código


//SERVOMOTOR
#include <Servo.h>
Servo servo_mot;  

//PANTALLA
#include <Adafruit_GFX.h>                       
#include <Adafruit_SSD1306.h>                   
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET);

//RELOJ
#include <DS3231.h>                             
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
//DS3231  rtc(SDA, SCL);
//Time  t;



//Entradas y salidas
int but1 = 2;
int but2 = 3;
int but3 = 4;
int servo_pin = 9;
int Buzzer = 6;

             //VARIABLES
unsigned int millis_before = 0;     
unsigned int millis_now = 0;
int OLED_refresh_rate = 200;
int porciones = 3;
bool state_but1 = true;
bool state_but2 = true;
bool state_but3 = true;
int stop_angle = 91;           
int rotate_angle = 180;
int max_portions = 30;
int min_portions = 1;
bool feed_active = true;
int portion_delay = 500;


void setup() {

 //rtc.adjust(DateTime(_DATE, __TIME_));
  
 Serial.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  delay(100);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.display();

  millis_before = millis();
  millis_now = millis();
  rtc.begin(); 

  servo_mot.attach(servo_pin);  
  servo_mot.write(stop_angle);
  pinMode(Buzzer, OUTPUT);
  digitalWrite(Buzzer, LOW);

  pinMode(but1, INPUT_PULLUP);
  pinMode(but2, INPUT_PULLUP);
  pinMode(but3, INPUT_PULLUP);

 
 
}
 

void loop() {

  
 DateTime  t = rtc.now();
 
 millis_now = millis();                                 
  if(millis_now - millis_before > OLED_refresh_rate){     
    millis_before = millis();                             
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print(porciones);
    display.print(" :");
    display.print(" porciones");   
    display.setCursor(0, 20);
    display.print(t.hour());
    display.print(":");
    display.print(t.minute());
    display.print(":");
    display.print(t.second());
    display.print("   ");    
    display.print(t.day());
    display.print("/");
    display.print(t.month());
    display.print("/");
    display.print(t.year());
    display.display(); 
  }
   if (t.hour() ==  8 && t.minute() == 0){
      if(feed_active){                            
    int i = 0;
     while(i<porciones){                        
      servo_mot.write(rotate_angle);          
      i++;
      display.clearDisplay();   
      display.setCursor(44,11);      
      display.print("SIRVIENDO");    
      display.display();      
      delay(portion_delay);                 
    }
    if(i=porciones){
      display.clearDisplay();
      display.setCursor(48,11);
      display.print("SERVIDO");
      display.display();
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500); 
    }
      servo_mot.write(stop_angle);             
      feed_active = false;                     
      digitalWrite(Buzzer, LOW);
  }
   }

  if (t.hour() ==  14 && t.minute() == 0){
      if(feed_active){                            
    int i = 0;
     while(i<porciones){                        
      servo_mot.write(rotate_angle);          
      i++;
      display.clearDisplay();   
      display.setCursor(44,11);      
      display.print("SIRVIENDO");    
      display.display();      
      delay(portion_delay);                 
    }
    if(i=porciones){
      display.clearDisplay();
      display.setCursor(48,11);
      display.print("SERVIDO");
      display.display();
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
    }
      servo_mot.write(stop_angle);             
      feed_active = false;                     
      digitalWrite(Buzzer, LOW);
  }
  
  }
  if(porciones > 30){
    porciones = min_portions;
  }
  if(porciones < 0){
    porciones = min_portions;
  }
   //Boton 1(Incrementar porciones)   
  if(!digitalRead(but1) && state_but1){
    porciones++;
    if(porciones > max_portions){          
      porciones = min_portions;
    }
    state_but1 = false;
  }
  else if(digitalRead(but1) && !state_but1){
    state_but1 = true;
  }  

  //Boton 2(Decrementar porciones)
  if(!digitalRead(but2) && state_but2){
    porciones--;
    if(porciones < min_portions){         
      porciones = max_portions;
    }
    state_but2 = false;
  }
  else if(digitalRead(but2) && !state_but2){
    state_but2 = true;
  }

  //Boton 3(Servir manualmente)
  if(!digitalRead(but3) && state_but3){                      
       int i = 0;
     while(i<porciones){                        
      servo_mot.write(rotate_angle);          
      i++;
      display.clearDisplay();   
      display.setCursor(44,11);      
      display.print("SIRVIENDO");    
      display.display();      
      delay(portion_delay);                
    }
    if(i=porciones){
      display.clearDisplay();
      display.setCursor(48,11);
      display.print("SERVIDO");
      display.display();
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
    }
      servo_mot.write(stop_angle);             
      feed_active = false;                     
      digitalWrite(Buzzer, LOW);
  }
    else if(digitalRead(but3) && !state_but3){
     state_but3 = true;
  }
  
 }

¿Quieres decir que el programa funciona adecuadamente si el reloj está desconectado?

¿Conectas el reloj mientras el circuito está energizado?

¿Puedes compartir tu circuito? (puede ser la foto de un diagrama en papel)


Por otro lado, hay algunas mejoras que puedes hacer a tu programa.

En el código

if(i=porciones){

seguramente debes utilizar

if(i==porciones){

Pero, en las tres veces que aparece esa instrucción, conforme a la lógica del programa, los valores de i y porciones son iguales, así que el if sale sobrando, ya que siempre se ejecuta. De hecho, aquí funciona mejor for en vez de ese while.

El propósito de tu secuencia while/if es servir (dispensar) el alimento, y puedes crear una función que sea llamada desde esos tres puntos y simplifique el programa.


Esta instrucción evita que se repita la liberación de alimento varias veces en el mismo minuto (8:00, 14:00), pero no parece haber una instrucción que vuelva a true el valor de esa variable, así que solamente quedaría el sistema para operación manual...

Sí, el programa funciona correctamente si el reloj esta desconectado, pero cuando lo conecto (con el circuito des energizado) deja de funcionar.
Este es mi diagrama

Si te olvidas de todo y pruebas solo el RTC con algun código ejemplo de su librería funciona bien?

Es muy posible que tengas algun problema de niveles I2C.
El Adafruit_SSD1306 creo que trabaja a 3.3V y si el RTC lo hace a 5 podria ser un problema.
Estoy suponiendo pero verifica.

Buenas, ya pude solucionar el error, al parecer solo tenía que inicializar primero el reloj y después la pantalla en el setup.
Muchas gracias por su ayuda.

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