Símbolos estranhos aparecem na minha tela de LCD e ele para de funcionar

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

O relé está a ser alimentado por onde?

Normalmente o problema é que o relé a funcionar consome corrente a mais... a tensão baixa e o Arduino crasha por falta de tensão.
Diria que o mesmo problema aparece aqui no fórum pelo menos uma vez por mês.