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;
}
}
