Crash arduino e display

Io ho un problema con il mio arduino uno.
Io ho creato uno schetch che controlla una mini serra con sensore dht 11, rele per ventilazione, luce, riscaldamento e umidità.

Inoltre ho un display 16x2 che visualizza i dati raccolti dal sensore dht e l orario attuale.

Schetch testato per diverso tempo... ora ho lasciato acceso il tutto per 36 ore e mi sono accorto che dopo un numero imprecisato di ore il display si blocca.

Il tutto si sistema se tolgo alimentazione ad arduino.

Puó essere arduino che si surriscalda?
Puó essere il display che si surriscalda?

Si puó fare una procedura che spegne arduino per 10 minuti ogni ora?

raf85:
Puó essere arduino che si surriscalda?
Puó essere il display che si surriscalda?

Si puó fare una procedura che spegne arduino per 10 minuti ogni ora?

  1. NO (... salvo tu non stia assorbendo troppo dal pin 5V)
  2. NO (... salvo non sia difettoso)
  3. NO (... i problemi vanno RISOLTI !)

Metti il codice (racchiuso nei tag CODE) e descrivi esattamente cosa è collegato ad arduino (fai uno schema, anche a mano ed allegalo).

Guglielmo

E aggiungi anche le fonti delle librerie usate.
Ciao Uwe

Ciao ecco lo schema ed il codice

#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// stato relay display
int s_ventola;
int s_umidificatore;
int s_temperatura;
int s_libero;

byte spento[8] = {
                   B00100, 
                   B01010, 
                   B10001, 
                   B10001, 
                   B10001, 
                   B10001, 
                   B01010, 
                   B00100
};

byte acceso[8] = { 
                    B00100, 
                    B01110, 
                    B11111, 
                    B11111, 
                    B11111, 
                    B11111, 
                    B01110, 
                    B00100 
                    };



// inizializzione relay
//pinliberi
const int pinalfa = 7;
const int pinbeta = 6;
//pin umidità
const int pinumidita = 8;

//pin ventola
const int pinventola = 9;
const int v_timer = 10;
int ventola;

// Creazione oggetto RTC
DS1302 rtc(2, 3, 4);
Time timp;

//INIZIALIZZAZIONE SENSORE TEMPERATURA
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 5


// Creazione dell'oggetto LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Imposta l'indirizzo LCD 0x27 per un display a 16 caratteri e 2 linee

int vumidificatore;

void setup()
{

  
  pinMode (pinalfa, OUTPUT);
  pinMode (pinbeta, OUTPUT);


  
  //settaggio pinumidità
  pinMode (pinumidita, OUTPUT);
  //settaggio pinventola
  pinMode (pinventola, OUTPUT);
  // Imposta RTC in run-mode e disabilita' la protezione da scrittura
  rtc.halt(false);
  rtc.writeProtect(false);

  // Imposta la comunicazione seriale
  Serial.begin(9600);
  // inizializza il display
  lcd.init();
  lcd.backlight();//accende la retroilluminazione
  lcd.createChar(0, spento);
  lcd.createChar(1, acceso);    

  
}

void loop()
{
  
  int readData = DHT.read(DHT11_PIN);
  int t = (DHT.temperature);
  int u = (DHT.humidity);
  s_ventola=0;
  s_umidificatore=0;
  s_temperatura=0;
  s_libero=0;

 

 c_timer_ventola();
 temp_tappeto();
 c_umidificatore();
 delay(3000);
 lcd.clear();

  for (int i=0; i <= 100; i++)
   { 
    data (); // Scrive su LCD la data
    ora (); // Scrive su LCD l'ora 
    
   }

 lcd.clear();  
 stato_relay();
 delay(3000);   


    
    
 
 

 }



void c_timer_ventola ()
{ int tt;
  
   
    //variabile per visualizzare solo minuti associata a libreria TIME di ds1302
    timp=rtc.getTime();
    tt=(timp.min);
    if (tt<10) {
     lcd.setCursor(10,1);
     lcd.print(' ');
     lcd.print(tt);}
    else   {
     lcd.setCursor(10,1);
     lcd.print(tt);}
      
    


    
 // accensione ventola
   ventola = tt ;

  if (ventola > v_timer){
    digitalWrite(pinventola, HIGH);
    s_ventola =1;
       }
       else
       {digitalWrite(pinventola, LOW);
              }
   
}


void temp_tappeto ()
{
  int c_tappeto = (DHT.temperature);

   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Temperatura");
   lcd.setCursor(13, 0);
   lcd.print(c_tappeto);
   lcd.print((char)223);
  
  if (c_tappeto > 20) {
    digitalWrite (pinbeta, HIGH);
    s_temperatura =1;
  }
   else
    {digitalWrite (pinbeta, LOW);
  }





  
}

void c_umidificatore()
{
  int u = (DHT.humidity);
  const int x = 45;  
   lcd.setCursor(0, 1);
   lcd.print("Umidita'");
   lcd.setCursor(13, 1);
   lcd.print(u);
   lcd.print("%");

   
  //accensione umidificatore


    vumidificatore = u;

     if (vumidificatore > x )
       {digitalWrite(pinumidita, HIGH);
       s_umidificatore =1;
       }
     else
       {digitalWrite(pinumidita, LOW);
       }
   

  
}
void data ()
{
  lcd.setCursor(0, 0);
  lcd.print(rtc.getDateStr());
}

void ora()
{
  lcd.setCursor(0, 1);
  lcd.print(rtc.getTimeStr());
  
  
}

void stato_relay()
{
  lcd.setCursor(4,0);
  lcd.print("U F T L");
  if (s_umidificatore >= 1)
      {
         lcd.setCursor(4, 1);
         lcd.write(0);
      }
      else
      {
        lcd.setCursor(4, 1);
         lcd.write(1);
        }

  if (s_ventola >= 1)
      {
         lcd.setCursor(6, 1);
         lcd.write(0);
      }
      else
      {
        lcd.setCursor(6, 1);
         lcd.write(1);
        }
  if (s_temperatura >= 1)
      {
         lcd.setCursor(8, 1);
         lcd.write(0);
      }
      else
      {
        lcd.setCursor(8, 1);
         lcd.write(1);
        }

  if (s_libero = 0)
      {
         lcd.setCursor(10, 1);
         lcd.write(0);
      }
      else
      {
        lcd.setCursor(10, 1);
         lcd.write(1);
        }
 
 
}

Ringrazio in anticipo

Un primo problema è il collegamento del modulo relè ...
... bastava fare una semplice ricerca qui sul forum dato che ... se ne sarà parlato un centinaio di volte .. ::slight_smile:

I moduli relè VANNO alimentati con un alimentatore separato che NULLA deve avere in comune con Arduino. Lo schema di collegamento (© Brunello) è il seguente:


Quindi, un alimentatore a 5V separato e dedicato collegato come vedi nello schema a destra e il comllegamento verso Arduino come vedi in basso (solo i pin ed i Vcc, NO il GND).

Attenzione, in questo modo i relè lavoreranno a "logica inversa" ovvero, pin HIGH -> relè a riposo, pin LOW -> relè eccitato.

Intanto comincia con questa modifica e verifica come va ... se ci sono ancora problemi ne riparliamo.

Guglielmo

stavo facendo delle simulazioni... il problema sorge quando la temperatura arriva a 21°

controlla anche questi punti non sono errori ma solo suggerimenti

void loop() {
                                                                             
   int readData = DHT.read(DHT11_PIN);   //a cosa serve la lettura qui?
   int t = (DHT.temperature);                    // tra l'altro fatta su variabili locali
   int u = (DHT.humidity);                         // che poi non usi mai più   
   
   s_ventola = 0;
   s_umidificatore = 0;
   s_temperatura = 0;
   s_libero = 0;

   c_timer_ventola();
   temp_tappeto();
   c_umidificatore();

   delay(3000);                                   
   lcd.clear();     

/*
   for (int i = 0; i <= 100; i++) {        //scrivi la data e l'ora 100 volte di seguito
      data (); // Scrive su LCD la data   // cosa ci metterà..... in totale 2 secondi?
      ora (); // Scrive su LCD l'ora
   }
   lcd.clear();                                     // poi cancelli l'lcd
*/

 // non ti comviene fare così

   data();                                        // per lo meno chiami le 2 funzioni una volta sola
   ora();                                         // tanto anche se non aggiorni l'ora ogni decimo di
   delay(3000)                                // secondo poi stai fermo per 3 secondi... tanto vale
// e poi continuare 

   lcd.clear();
   stato_relay();
   delay(3000);
}

qui hai gia la variabile ventola che è globale, è inutile creare una locale (int tt) per metterci i minuti e
poi copiarli in ventola

void c_timer_ventola () {
   //variabile per visualizzare solo minuti associata a libreria TIME di ds1302
   timp = rtc.getTime();
   ventola = (timp.min);
   if (ventola < 10) {
      lcd.setCursor(10, 1);
      lcd.print(' ');
      lcd.print(tt);
   } else {
      lcd.setCursor(10, 1);
      lcd.print(tt);
   }
   // accensione ventola
   if (ventola > v_timer) {
      digitalWrite(pinventola, HIGH);
      s_ventola = 1;
   } else {
      digitalWrite(pinventola, LOW);
   }
}

stessa cosa per variabile locale u e globale vumidificatore

void c_umidificatore() {
   vumidificatore = (DHT.humidity);
   const int x = 45;
   lcd.setCursor(0, 1);
   lcd.print("Umidita'");
   lcd.setCursor(13, 1);
   lcd.print(vumidificatore);
   lcd.print("%");

   //accensione umidificatore
   if (vumidificatore > x ) {
      digitalWrite(pinumidita, HIGH);
      s_umidificatore = 1;
   } else {
      digitalWrite(pinumidita, LOW);
   }
}

lo stato dei rele può essere solo 1 o 0 (zero)
inutile controllare se >=1

attenzione che su s_libero il controllo è sbagliato manca il doppio = , ma per il momento non è usato :wink:

  if (s_umidificatore == 1) {
...
  if (s_temperatura == 1) {
...
  if (s_libero == 0) {
...

spero essere stato di aiuto :slight_smile:

raf85:
stavo facendo delle simulazioni… il problema sorge quando la temperatura arriva a 21°

quindi devi verificare cosa c’è attaccato a pinbeta

for (int i = 0; i <= 100; i++) {        //scrivi la data e l'ora 100 volte di seguito
      data (); // Scrive su LCD la data   // cosa ci metterà..... in totale 2 secondi?
      ora (); // Scrive su LCD l'ora
   }

questo l’ho inserito semplicemente per un fattore estetico… si vedono scorrere i secondi come fosse un orologio

if (s_umidificatore == 1) {
...
  if (s_temperatura == 1) {
...
  if (s_libero == 0) {
...

Ok ma mi sorge una domanda se qui metto il doppio = perchè all’inizio quando dichiaro lo stato delle variabili metto solo un = ?

perchè se usi un solo = assegni un valore ad una variabile e ne usi due == per eseguire il controllo del valore in riferimanto a qualcos'altro

scrivendo dentro ad un if (variabile=5) non fai un controllo ma da quel momento variabile diventa uguale a 5

Grazie della risposta.

Comunque ho apportato le modifiche ma il problema si ripresenta sempre

raf85:
Comunque ho apportato le modifiche ma il problema si ripresenta sempre

Quali? Quelle HW che ti ho detto io o quelle SW che ti ha detto Patrick_M?

Guglielmo

ho apportato entrambe le modifiche suggerite...

ho fatto un ulteriore prova:

il pin che controlla la temperatura comanda una presa alla quale è collegata una lampadina scaldante ad infrarossi da 35 watt.

Se viene utilizzata questa lampadina il problema si presenta dopo 2 ore circa, mentre se per il riscaldamento uso una serpentina da 5 watt il problema sparisce.

:-? :-?

Ma stai parlando di oggetti a 220V ? ? ? :o :o :o

Guglielmo

È come la ciabatta arduino

raf85:
È come la ciabatta arduino

E che è ? ? ?

Guglielmo

Questa solo che con qualche modifica

Ma ... HAI PRESENTE IL REGOLAMENTO ? ? ? :o :o :o

Rileggiti il punto 15 e capirai perché mi vedo costretto a chiudere questo tuo thread ! NON sono ammesse discussioni in cui si parla di oggetti a 220V !!!

Guglielmo

P.S.: Se hai bisogno di chiarimenti in merito al regolamento puo contattarmi in MP ...