Sou iniciante e tenho um arduino uno (no qual usei muito o blog desse site para aprender melhor sobre a plataforma) com um dht11, um servo motor, um módulo de relé e uma tela de LCD conectada, que idealmente deve permanecer ligada e totalmente funcional por 20 dias.
A tela de LCD geralmente para de funcionar aleatoriamente, caracteres estranhos aparecem (sempre diferentes) e não são mais atualizados; a única maneira de reiniciá-lo é reiniciá-lo ou abrir e fechar o monitor serial (que para de funcionar em conjunto com a tela). A única maneira de o erro não ocorrer é se o módulo de relé estiver desconectado.
Este é o código:
#include <Servo.h>
#include <LiquidCrystal.h>
#include <DHT.h>
int rele=2;
int t,u,temperatura=39,c0=0,c=0,c1=0,c2=0;
int m=0,h=0,g=1;
extern unsigned long timer0_millis;
DHT dht(4,DHT11);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
Servo servomotor;
void resetMillis() {
cli();
timer0_millis = 0;
sei();
}
void setup() {
dht.begin();
lcd.begin(16, 2);
servomotor.attach(6);
pinMode(rele, OUTPUT);
Serial.begin(9600);
lcd.setCursor(0, 0);
lcd.print("T= ");
lcd.setCursor(5, 0);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("U= ");
lcd.setCursor(5, 1);
lcd.print("%");
lcd.setCursor(7, 0);
lcd.print("tempo:");
lcd.setCursor(9, 1);
lcd.print("g");
lcd.setCursor(12, 1);
lcd.print("h");
lcd.setCursor(15, 1);
lcd.print("m");
}
void loop() {
delay(1000);
t=dht.readTemperature();
u=dht.readHumidity();
Serial.print("temperatura = ");
Serial.print(t);
Serial.println(" C");
Serial.print("umidade= ");
Serial.print(u);
Serial.println(" %");
lcd.setCursor(3,0);
lcd.print(t);
lcd.setCursor(3,1);
lcd.print(u);
lcd.setCursor(7,1);
lcd.print(g);
int tempo=(millis()/1000);
if (m==0) {lcd.setCursor(13, 1);
lcd.print("0");}
if (h==0) {lcd.setCursor(10, 1);
lcd.print("0");}
if (tempo>58) {resetMillis();
m++;}
if (m>0) {lcd.setCursor(13, 1);
lcd.print(m);}
if (m>59) {m=0;
lcd.setCursor(13, 1);
lcd.print(" ");
h++;}
if (h>0) {lcd.setCursor(10, 1);
lcd.print(h);}
if (h>23) {h=0;
lcd.setCursor(10, 1);
lcd.print(" ");
g++;}
if(t>temperatura){
digitalWrite(rele, HIGH);
}
else{
digitalWrite(rele, LOW);
}
if(u<60){if(c2==0){servomotor.write(150);
delay(40);
servomotor.write(170);}
c2++;
if(c2==50){c2=0;}
}
}