arduino si impalla

salve a tutti
ho realizzato un sistema di controllo della mia serra. che funziona bene fino a un certo punto…poi arduino si impalla e il sistema riparte solo resettando arduino.
da cosa può dipendere?

Dipende sicuramente dal filo antani che sblinda.

Ok, ovviamente scherzo.
Ma se non ci dai lo schema ed il programma non possiamo indovinarlo.

Potrei presumere qualche variabile dimensionata male o qualche relè, ma così è impossibile.

filo antani che sblinda è stato il mio primo pensiero, ma poi ho controllato e ho pensato pazienza, sennò, posterdati, per due e ho controllato i contatti col tarapia tapioco. Ma nulla il problema persiste!

ecco il codice :wink:

#define RELAY1 30
#define RELAY2 31
#define RELAY3 32
#define RELAY4 33
#define RELAY5 34
#define RELAY6 35
#define RELAY7 36
#define RELAY8 37


#include "LiquidCrystal.h"
#include <DHT.h>
#include <Wire.h>
const int sensorPin = A0;  // sensore temperatura
int temperature;  // sensore temperatura
int Humidity;  // sensore umidità

DHT dht(2, DHT22); //Imposta il modello di sensore e il pin di Arduino a cui è collegato
LiquidCrystal lcd(3, 4, 5, 6, 7, 8); //Imposta i pin di Arduino a quali sono collegati in pin del display (Rs,E,DB4,DB5,DB6,DB7)

int lum_pin = 9; //il pin al quale è collegato LED+
byte lum_val = 127; // il valore della luminosità. Può essere impostato da 0 (retroilluminazione spenata) a 255 (retroilluminazione massima)


void setup() {




  for (int i = 30; i < 38; i++) {
    pinMode(i, OUTPUT);
  }
  Serial.begin(9600);       //Abilitazione monitor pc
  //Abilitazione pin in output

  Serial.println("");        // cancella eventuali messaggi parziali rimasti



  pinMode(lum_pin, OUTPUT);
  analogWrite(lum_pin, lum_val);
  dht.begin();
  lcd.begin(16, 2);// imposto il numer di righe e colonne del display
  //creo il carattere ‘°’ per poter scrivere °C dopo il valore della temperatura
  byte deg[8] =
  {
    0b00011,
    0b00011,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
  };
  lcd.createChar(4, deg);


}







void loop() {
  {



    // schema umidita' e temperatura inizio

    {
      float h = dht.readHumidity(); //leggi il valore di temperatura
      float t = dht.readTemperature(); //leggi il valore di umidità
      lcd.setCursor(0, 0); //metti il cursore sulla prima riga
      lcd.print("");
      if (isnan(t))lcd.print("Errore!"); //se il valore di temperatura è NaN (Not a Number)
      else //altrimenti
      {
        lcd.print(t);
        Serial.print("temperatura: ");
        Serial.println (t);
        lcd.write(4); //scrivi il carattere ‘°’
        lcd.print("C");
      }
      lcd.setCursor(9, 0); //metti il cursore sulla seconda riga
      lcd.print("");
      if (isnan(h))lcd.print("Errore!"); //se il valore di umidità è NaN (Not a Number)
      else
      {
        lcd.print(h);
        lcd.print(" %");
        Serial.print("Umidita': ");
        Serial.println (h);

      }
    }


    // schema umidita' e temperatura fine


    // inizio comandi relè


    //TEMPERATURA INZIO relè 30




    if (dht.readTemperature() > 25) {  // settaggio temperatura MASSIMA  della serra

      digitalWrite(30, LOW);  // spegne la stufa


      lcd.setCursor(0, 3);
      lcd.print("T >20 RAFFRED");
      Serial.println ("RISCALDAMENTO OFF");
      delay(1000);
      Serial.println ("FAN ON");
      delay(1000);
      Serial.println ("FOG ON");
      delay(1000);


    } else if (dht.readTemperature() < 16) { // settaggio temperatura MINIMA  della serra

      digitalWrite(30, HIGH);   //accende la stufa

      Serial.println ("WARM ON/FOG OFF");
      lcd.setCursor(0, 3);
      lcd.print("T<15 RISCALDO");
      Serial.println ("WARM ON/FAN OFF");
      delay(1000);

    } else {                // se temperatura compresa tra min e max tutto spento
      digitalWrite(30, LOW);

      lcd.setCursor(0, 3);
      lcd.print("STUFA    OFF     ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("PARAMETRI            ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("TEMPERATURA           ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("OTTIMALI               ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("GREAT JOB!     ");
      delay(1000);
      Serial.println ("PARAMETRI ");
      Serial.println ("OTTIMALI ");
    }


    delay(1000);  // intervallo tra le letture



    //TEMPERATURA FINE

    //UMIDITA' INZIO relè 33




    if (dht.readHumidity() > 60) { // settaggio UMIDITA' MASSIMA  della serra

      digitalWrite(33, LOW);  // spegne IL FOG I


      lcd.setCursor(0, 3);
      lcd.print("UMIDITA'>60%   ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("VENTILAZIONE     ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("SUPPLEMETARE     ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("IN ATTO         ");
      delay(1000);
      Serial.println ("UMIDITÀ OTTIMALE");
      delay(1000);
      Serial.println ("MAGGIORE DEL 60%");
      delay(1000);
      Serial.println ("POMPA SPENTA");
      delay(1000);


    } else if (dht.readHumidity() < 55) { // settaggio UMIDITA' MINIMA  della serra

      digitalWrite(33, HIGH);   //accende IL FOG I


      Serial.println ("IL FOG I E' ACCESO PER 10 SEC");
      delay(10000);               //NEBULIZZO PER SEC 10
      digitalWrite(33, LOW);  //IL FOG E'ACCESO
      Serial.println ("IL FOG I E' SPENTO");
      lcd.setCursor(0, 3);
      lcd.print("UMIDITA'<75%       ");
      Serial.println ("PAUSA 5 MINUTI");
      delay(300000);                             //PAUSA 5 MIUNUTI PER FAR RIPOSARE LA POMPA
      lcd.setCursor(0, 3);
      lcd.print("NEBULIZZAZIONE      ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("IN                  ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("IN ATTO            ");
      delay(1000);
      Serial.println ("UMIDIFICAZIONE IN ATTO");
      delay(1000);

    } else {                // se umidità compresa tra min e max tutto spento
      digitalWrite(33, LOW);
      digitalWrite(34, LOW);
      lcd.setCursor(0, 3);
      lcd.print("FOG  OFF       ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("PARAMETRI      ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("UMIDITA'       ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("OTTIMMALI       ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("LE ORCHIDEE       ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("TI RINGRAZIANO      ");
      delay(1000);
      Serial.println ("FOG Spento ");
    }


    delay(1000);  // intervallo tra le letture

    //UMIDITA' FINE


    //ASPIRAZIONE INZIO relè 37




    if (dht.readTemperature() > 30) {  // settaggio temperatura MASSIMA  della serra

      digitalWrite(37, HIGH);  //ACCENDE L'ASPIRAZIONE


      lcd.setCursor(0, 3);
      lcd.print("T >30 ASPIRAZIONE");
      Serial.println ("ASPIRAZIONE IN ATTO TEMPERATURA SOPRA I 30 GRADI");
      delay(1000);


    } else if (dht.readTemperature() < 29) { // ASPIRATORE OFF
      digitalWrite(37, LOW);   //SPEGNE L'ASPIRAZIONE

      Serial.println ("ASPIRAZIIONE OFF");
      lcd.setCursor(0, 3);
      lcd.print("ASPIRAZIO. OFF");


    } else {                // se temperatura compresa tra min e max tutto spento
      digitalWrite(37, LOW);

      lcd.setCursor(0, 3);
      lcd.print("NO ASPIRAZIONE   ");
      delay(1000);
      lcd.setCursor(0, 3);
      lcd.print("GREAT JOB!     ");
      delay(1000);
      Serial.println ("PARAMETRI ");
      Serial.println ("OTTIMALI ");
    }


    delay(1000);  // intervallo tra le letture



    //ASPIRAZIONE FINE



  }
}



// FINE COMANDI RELAY

questo e lo schermo dopo che si impalla

Imgur

Sembra il classico caso di interferenza fra relè e display LCD.
Prova ad allontanare i relè.

Mentre ci sei, prova ad usare print(F(... invece di print(... dove stampi delle frasi predeterminate, quindi al posto di cose come:

lcd.print("GREAT JOB!     ");

metti

lcd.print(F("GREAT JOB!     "));