Buenas, tengo un pequeño problema. Estoy haciendo un dispensador de croquetas para mascotas, pero después de un rato conectado se queda congelado y ya no hace nada. Le pregunté a un amigo que sabe un poco más que yo y me dijo que le agregara un watchdog, pero sigue sin funcionar. Estuve leyendo un poco y al parecer puede ser el ruido de las fuentes, ya que tengo todo en una caja relativamente pequeña.
La pantalla es una lcd 16x2, el reloj es el modulo DS3231, el servo es un MG9095, de ahí en fuera es un buzzer, 3 pulsadores y las 2 fuentes, una de 5.5v exclusivamente para el servomotor y el reloj y otra de 12v con un regulador de 6v para el arduino, la pantalla, el buzzer y los demás componentes.
Agradezco mucho su ayuda
Les adjunto el código, el esquema y las fotos del montaje.
//WATCH DOG
#include <avr/wdt.h>
//COMUNICACION I2C
#include <Wire.h>
//PANTALLA
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
//RELOJ
#include <DS3231.h>
#include <RTClib.h>
RTC_DS3231 rtc;
Time t;
//SERVOMOTOR
#include <Servo.h>
Servo servo_mot;
//ENTRADAS Y SALIDAS
int but1 = 4;
int but2 = 2;
int but3 = 3;
int servo_pin = 9;
int Buzzer = 5;
int mot = 7;
//VARIABLES
//APAGADO DE PANTALLA
unsigned int millis_before = 0;
unsigned int millis_now = 0;
int apagado = 60000;
//BOTONES
bool state_but1 = true;
bool state_but2 = true;
bool state_but3 = true;
//SERVO
int close = 20;
int open = 95;
//PORCIONES Y DISPENSAR
int porciones = 9;
int max_portions = 30;
int min_portions = 1;
bool feed_active = true;
int portion_delay = 50;
//SIGUIENTE PORCION
String next = "08:00";
void setup() {
//DESACTIVAR WATCH DOG
wdt_disable();
//RELOJ
rtc.begin();
//PANTALLA
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("BIENVENIDO");
delay(3000);
lcd.clear();
//APAGADO DEPANTALLA
millis_before = millis();
millis_now = millis();
///SERVO
servo_mot.attach(servo_pin);
servo_mot.write(close);
//VIBRADOR
pinMode(mot, OUTPUT);
//BUZZER
digitalWrite(Buzzer, LOW);
pinMode(Buzzer, OUTPUT);
//CONFIGURACION DE LOS BOTONES
pinMode(but1, INPUT_PULLUP);
pinMode(but2, INPUT_PULLUP);
pinMode(but3, INPUT_PULLUP);
//ACTIVAR WATCH DOG
wdt_enable(WDTO_4S);
}
void loop() {
wdt_reset();
DateTime t = rtc.now();
//IMPRESION DE DATOS
lcd.setCursor(2, 0);
if (porciones < 10){
lcd.print("0");
lcd.print(porciones);
lcd.print(":porciones");
}
else{
lcd.print(porciones);
lcd.print(":porciones");
}
lcd.setCursor(0, 1);
//HORA
if (t.hour() < 10){
lcd.print("0");
lcd.print(t.hour());
lcd.print(":");
}
else {
lcd.print(t.hour());
lcd.print(":");
}
if (t.minute() < 10){
lcd.print("0");
lcd.print(t.minute());
}
else{
lcd.print(t.minute());
}
lcd.print(" Next:");
lcd.print(next);
//CONFIGURACION DE LAS PORCIONES
if(porciones > 30){
porciones = min_portions;
}
if(porciones < 0){
porciones = min_portions;
}
//DISPENSAR
if ((t.hour() == 8) && (t.minute() == 0) && (t.second() == 0)) {
lcd.backlight();
lcd.display();
next = "14:00";
if(feed_active){
int i = 0;
while(i<porciones){
servo_mot.write(open);
i++;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("SIRVIENDO");
lcd.display();
digitalWrite(mot, HIGH);
delay(portion_delay);
}
if(i=porciones){
servo_mot.write(close);
feed_active = false;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("SERVIDO");
digitalWrite(mot, LOW);
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);
}
}
}
if ((t.hour() == 14) && (t.minute() == 00) && (t.second() == 0)) {
lcd.backlight();
lcd.display();
next = "08:00";
if(feed_active){
int i = 0;
while(i<porciones){
servo_mot.write(open);
i++;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("SIRVIENDO");
lcd.display();
digitalWrite(mot, HIGH);
delay(portion_delay);
}
if(i=porciones){
servo_mot.write(close);
feed_active = false;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("SERVIDO");
digitalWrite(mot, LOW);
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);
}
}
}
//BOTONES
//Boton 1(Incrementar porciones)
if(!digitalRead(but1) && state_but1){
lcd.backlight();
lcd.display();
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){
lcd.backlight();
lcd.display();
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){
lcd.backlight();
lcd.display();
int i = 0;
while(i<porciones){
digitalWrite(mot, HIGH);
servo_mot.write(open);
i++;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("SIRVIENDO");
lcd.display();
delay(portion_delay);
}
if(i=porciones){
servo_mot.write(close);
feed_active = false;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("SERVIDO");
digitalWrite(mot, LOW);
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);
}
}
else if(digitalRead(but3) && !state_but3){
state_but3 = true;
}
//APAGAR PANTALLA
millis_now = millis();
if((millis_now - millis_before) > apagado){
millis_before = millis_now;
lcd.noBacklight();
lcd.noDisplay();
}
}