Hola a todos
Hace unos meses tenia prácticamente el mismo problema pero ya no sé si se puede seguir el hilo del post, mejor hago otro
Ya he buscado solución pero la verdad el hardware no es mi fuerte
Tengo un Arduino uno que controla a un pistón mecánico (motor de 12v 3a) para que gire a un lado o hacia el otro dependiendo cuando se necesite, que es constante. Controlado en dos modos, manual y automático. El manual con dos botones y el automático con dos sensores. Y monitoreado, en esta ocasión, con un LCD I2C, antes era con una OLED pero causó problemas y me mude al LCD pensando que sería más estable. Todo esta conectado a una fuente de12V 10a.
El problema es que funciona sin problema pero al cabo de un rato el arduino se congela y tengo que reiniciarlo. Lo intenté solucionarlo con un watchdog pero al final no ayuda mucho con el proceso que tiene que cumplir. Por las prisas conecte todo al arduino con cables dupont y leí que puede ocasionar falsos pero no sé si eso contribuya al congelamiento, como sea lo cambiaré con borneras. También leí que un cable largo puede causar este tipo de problemas. Lo conecté, el LCD a una distancia del arduino a no más de 2mt con cable calibre 22. Espero me puedan ayudar, les adjunto mi código y mi diagrama.
Saludos
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C: 0x27, Pantalla de 16x2
int modo = 9;
int der = 10;
int izq = 11;
int sender = 12;
int senizq = 13;
int sentido1 = 7;
int sentido2 = 8;
int conta = 0;
int velocidad = 5;
void setup() {
lcd.init(); // Inicializar la pantalla LCD
lcd.backlight(); // Encender la retroiluminación
pinMode(der, INPUT_PULLUP);
pinMode(izq, INPUT_PULLUP);
pinMode(modo, INPUT_PULLUP);
pinMode(sender, INPUT_PULLUP);
pinMode(senizq, INPUT_PULLUP);
pinMode(sentido1, OUTPUT);
pinMode(sentido2, OUTPUT);
pinMode(velocidad, OUTPUT);
lcd.setCursor(1, 0); //
lcd.print("Guia de banda");
lcd.setCursor(0,1);
lcd.print("Modo: ");
wdt_enable(WDTO_2S);
}
void loop(){
if (digitalRead (modo) == LOW){
lcd.setCursor(6,1);
lcd.print(" ");
conta++;
delay(300);
}
//digitalWrite(10, LOW);
if (conta==0){
lcd.setCursor(6,1);
lcd.print("Manual");
manual();
}
if (conta==1){
lcd.setCursor(6,1);
lcd.print("Auto");
autom();
}
if(conta>1){
conta=0;
}
delay(10);
wdt_reset();
}
void manual(){
while(digitalRead (der) == LOW){
//lcd.setCursor(13,1);
//lcd.print(">");
digitalWrite(sentido1, HIGH);
digitalWrite(sentido2, LOW);
analogWrite(velocidad, 255);
}
delay(10);
while(digitalRead (izq) == LOW){
//lcd.setCursor(13,1);
//lcd.print("<");
digitalWrite(sentido1, LOW);
digitalWrite(sentido2, HIGH);
analogWrite(velocidad, 255);
}
//lcd.setCursor(13,1);
//lcd.print(" ");
digitalWrite(sentido1, LOW);
digitalWrite(sentido2, LOW);
analogWrite(velocidad, 0);
delay(10);
}
void autom(){
while(digitalRead (sender) == HIGH && digitalRead (modo)== HIGH){
//lcd.setCursor(13,1);
//lcd.print(">");
digitalWrite(sentido1, HIGH);
digitalWrite(sentido2, LOW);
analogWrite(velocidad, 255);
}
delay(10);
while(digitalRead (senizq) == HIGH && digitalRead(modo) == HIGH){
//lcd.setCursor(13,1);
//lcd.print("<");
digitalWrite(sentido1, LOW);
digitalWrite(sentido2, HIGH);
analogWrite(velocidad, 255);
}
// lcd.setCursor(13,1);
//lcd.print(" ");
digitalWrite(sentido1, LOW);
digitalWrite(sentido2, LOW);
analogWrite(velocidad,0);
delay(10);
}