Errore di arduino quando il relè stacca

Ciao a tutti, non riesco a risolvere un problema che ho da tempo ma che non riesco a risolvere, sicuramente per le poche conoscenze elettroniche o informatiche.
Utilizzo arduino in macchina per comandare la ventola del radiatore in questo modo:
-arduino legge la temperatura da un dallas DS18B20
-ad una certa temperatura accende il relè (comandato a 5v e può far passare fino a 10A a 30v)
-il relè fa partire un altro relè all'interno del cofano che fa partire appunto la ventola.
Finché lo provo senza collegare il relè esterno va tutto bene, il relè collegato ad arduino attacca e stacca senza problemi e arduino continua a girare.
Quando collego il relè esterno allora si presenta il problema: quando stacca perché la temperatura è scesa, il termometro non dà più informazioni. A me sembra che quello che si blocca sia il termometro e non arduino perché, come da mia impostazione, quando comunica -150° mi visualizza "---". Se resetto arduino con il suo bottoncino, riparte come se nulla fosse successo.
Qualcuno ha un'idea di cosa potrei fare? Se vi serve qualche dato in più sono felice di fornirvelo. Intanto vi ringrazio e vi auguro buona serata.
Andrea

Grazie della risposta, proverò a rispondere almeno alla metà delle domande! Intanto per far capire i collegamenti ho provato a disegnare quello che ho fatto e ho caricato l’immagine.

Per il resto:
-il relè a 5v è uno dei classici (credo) per arduino, quelli blu per intenderci;
-tempo fa avevo provato ad alimentarlo a batteria, all’inizio non creava il problema, poi lo ha ricreato. Proverò di nuovo a farlo per levarmi ogni dubbio;
-per imporre lo spegnimento senza il dallas cosa intendi? Potrei provare a far attaccare/staccare la ventola con dei fili esterni al primo relè?
-avevo pensato alla possibilità di un diodo ma non saprei di preciso in che punto inserirlo
Andrea

/* Porte utilizzate
DISPLAY 5110
Pin 4 - CLK
Pin 5 - DIN
Pin 9 - DC
Pin 10 - RST
Pin 11 - CE

RELAY
Pin 6 - output high

DALLAS DS18B20
Pin 8 - input
*/

#include <LCD5110_Graph.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 8 //connessione del sensore alla porta 8 di Arduino
OneWire oneWire(ONE_WIRE_BUS); // Imposta la comunicazione oneWire per comunicare con un dispositivo compatibile
DallasTemperature sensors(&oneWire); // Passaggio oneWire reference alla Dallas Temperature

LCD5110 myGLCD(4,5,9,10,11); // Impostazione delle porte del display (CLK,DIN,DC,RST,CE)

extern unsigned char MediumNumbers[];
extern unsigned char SmallFont[];
float tempFloat;
String z;
int relayhigh;
int time;

void setup()
{
relayhigh=6;
time=0;
tempFloat=0;
myGLCD.InitLCD();
sensors.begin();
pinMode(relayhigh, OUTPUT);
digitalWrite(relayhigh, LOW);
}

void loop()
{
myGLCD.clrScr();
delay(500);
z=readTemp(0);

if (tempFloat<81) //ACCENSIONE O SPEGNIMENTO SPIA ARIA CALDA
{ Display(); myGLCD.update(); }             //
else                                        //
{ if (tempFloat<93)                         //  ////// CONTROLLO TEMPERATURA DI ACCENSIONE VENTOLA
 { Display(); Aria(); myGLCD.update(); }   //                    
 else                                      //      //  ////// ACCENSIONE E GESTIONE DELLA VENTOLA
 {                                         //      //      //
   
   Display(); Aria(); Ventola();           //      //      //
   myGLCD.update();                        //      //      /
   digitalWrite(relayhigh, HIGH);          //      //      //  // ACCENSIONE VENTOLA
                                           //      //      //
   while (tempFloat>91.5 && time<120)      //      //      //  ////// CICLO DI AGGIORNAMENTI TEMPERATURA
   {                                       //      //      //      // 
     delay(500);                           //      //      //     
     time=time+1;                          //      //      //      //
     z=readTemp(0);                        //      //      //      //
     myGLCD.clrScr();                      //      //      //      //
                                           //      //      //      //
     if (tempFloat>91.5 && time<120)       //      //      //      //  ////// CONTROLLO TEMPERATURA DI SPEGNIMENTO VENTOLA  
     {                                     //      //      //      //      //
       Display(); Aria(); Ventola();       //      //      //      //      //
       myGLCD.update();                    //      //      //      //      //
     }                                     //      //      //      //      //
     else                                  //      //      //      //      /
     { if (tempFloat>92.5)                 //      //      //      //      //  ////// CONTROLLO TEMPERATURA DOPO 60 SECONDI
       {                                   //      //      //      //      //      //
         Display(); Aria(); Ventola();     //      //      //      //      //      //
         myGLCD.update();                  //      //      //      //      //      //
         time=119;                         //      //      //      //      //     
       }                                //      //      //      //      //      //
       else                                //      //      //      //      //      //
       {                                   //      //      //      //      //      //
         Display(); Aria();                //      //      //      //      //      //
         myGLCD.update();                  //      //      //      //      //      
         digitalWrite(relayhigh, LOW);     //      //      //      //      //      // SPEGNIMENTO VENTOLA
       }                                   //      //      //      //      //  //////
     }                                     //      //      //      //  //////
   }                                       //      //      //  //////
   time=0;                                 //      //      
 }                                         //      //  //////  
}                                           //  //////
}                                         //////


////////////////////////////////////////////////////////////// 
String readTemp (int sensorIndex) // funzione float to string // 0,1,2 
{
char charVal[8];
sensors.requestTemperatures();
float x = sensors.getTempCByIndex(sensorIndex);
float tempFloat = ((11*x*x*x)/48144)-((1537*x*x)/32096)+(84101*x)/24072; // FORMULA DI ADEGUAMENTO TEMPERATURA CRUSCOTTO REALE
if (tempFloat < -150.00)
{
  return "---";
}
else
{
//Serial.println(tempC);
dtostrf(tempFloat, 3, 1, charVal);
//Serial.println(charVal);
return charVal;
}
}
////////////////////////////////////////////////////////////////
void Display() // SCRITTURA DEL DISPLAY BASE
{
myGLCD.setFont(MediumNumbers);
myGLCD.print(z, 28, 23);
myGLCD.setFont(SmallFont);
myGLCD.print("o", 76, 22);
Acquarad();
}
////////////////////////////////////////////////////////////////
void Acquarad() //DISEGNO DELLA SPIA DELL'ACQUA
{
myGLCD.drawRect(10,3,12,3);
myGLCD.drawRect(10,6,12,6);
myGLCD.drawRect(10,9,12,9);
myGLCD.drawRect(9,2,9,11);
myGLCD.drawRect(8,12,10,12);
myGLCD.drawRect(8,13,10,13);
myGLCD.drawRect(2,12,5,12);
myGLCD.drawRect(13,12,16,12);
myGLCD.drawRect(5,13,6,13);
myGLCD.drawRect(12,13,13,13);
myGLCD.drawRect(2,15,3,15);
myGLCD.drawRect(5,15,8,15);
myGLCD.drawRect(10,15,13,15);
myGLCD.drawRect(15,15,16,15);
myGLCD.drawRect(3,16,5,16);
myGLCD.drawRect(8,16,10,16);
myGLCD.drawRect(13,16,15,16);
}
////////////////////////////////////////////////////////////////
void Ventola() // DISEGNO DELLA SPIA DELLA VENTOLA
{
myGLCD.drawRect(70,2,71,2);
myGLCD.drawRect(69,3,72,3);
myGLCD.drawRect(78,3,79,3);
myGLCD.drawRect(68,4,73,4);
myGLCD.drawRect(77,4,80,4);
myGLCD.drawRect(68,5,74,5);
myGLCD.drawRect(12+65,5,16+65,5);
myGLCD.drawRect(4+65,6,9+65,6);
myGLCD.drawRect(11+65,6,16+65,6);
myGLCD.drawRect(6+65,7,9+65,7);
myGLCD.drawRect(11+65,7,80,7);
myGLCD.drawRect(8+65,8,14+65,8);
myGLCD.drawRect(5+65,9,13+65,9);
myGLCD.drawRect(4+65,10,10+65,10);
myGLCD.drawRect(3+65,11,7+65,11);
myGLCD.drawRect(9+65,11,12+65,11);
myGLCD.drawRect(2+65,12,7+65,12);
myGLCD.drawRect(9+65,12,14+65,12);
myGLCD.drawRect(2+65,13,6+65,13);
myGLCD.drawRect(9+65,13,80,13);
myGLCD.drawRect(3+65,14,6+65,14);
myGLCD.drawRect(10+65,14,80,14);
myGLCD.drawRect(4+65,15,5+65,15);
myGLCD.drawRect(11+65,15,14+65,15);
myGLCD.drawRect(12+65,16,13+65,16);
}
////////////////////////////////////////////////////////////////
void Aria() // DISEGNO DELLA SPIA DELL'ARICA CALDA
{
myGLCD.drawRect(37,2,45,2);
myGLCD.drawRect(34,3,37,3);
myGLCD.drawRect(45,3,48,3);
myGLCD.drawRect(31,4,34,4);
myGLCD.drawRect(41,4,41,4);
myGLCD.drawRect(48,4,51,4);
myGLCD.drawRect(30,5,31,5);
myGLCD.drawRect(40,5,42,5);
myGLCD.drawRect(51,5,52,5);
myGLCD.drawRect(30,6,30,6);
myGLCD.drawRect(39,6,43,6);
myGLCD.drawRect(52,6,52,6);
myGLCD.drawRect(30,7,31,7);
myGLCD.drawRect(41,7,41,8);
myGLCD.drawRect(51,7,52,7);
myGLCD.drawRect(31,8,32,8);
myGLCD.drawRect(50,8,51,8);
myGLCD.drawRect(32,9,32,9);
myGLCD.drawRect(42,9,42,10);
myGLCD.drawRect(50,9,50,9);  
myGLCD.drawRect(32,10,33,10);
myGLCD.drawRect(49,10,50,10);
myGLCD.drawRect(33,11,34,11);
myGLCD.drawRect(41,11,41,12);
myGLCD.drawRect(48,11,49,11);
myGLCD.drawRect(34,12,34,12);
myGLCD.drawRect(48,12,48,12);
myGLCD.drawRect(34,13,37,13);
myGLCD.drawRect(37,12,45,12);
myGLCD.drawRect(45,13,48,13);
myGLCD.drawRect(40,13,40,14);
myGLCD.drawRect(41,15,41,16);
}
////////////////////////////////////////////////////////////////

l’immagine non riesco a caricarla, inserisco il link

>marekjay: ti ricordo che in conformità al REGOLAMENTO (… che ti consiglio di rileggere con MOLTA attenzione), punto 7, devi editare il tuo post #4 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Guglielmo

scusami sono poco ferrato sui forum :cold_sweat: post modificato

Ho inserito e provato al pc quello che mi hai detto, appena lo faccio partire attacca e stacca il relè continuamente senza problemi. Attaccato ad arduino c'è solo il relè, termometro e lcd sono in macchina.
Cosa si capisce da questa prova?

Allora, dimmi se può andar bene, ho aggiunto solo

delay(1000)
digitalWrite(relayhigh, HIGH)
delay(1000)
digitalWrite(relayhigh, LOW)

all'interno del loop per provarlo in macchina, indipendentemente da quanto è alta la temperatura.
Al primo spegnimento del relè mi tornano i tre --- segno che la temperatura non viene letta, mentre arduino continua a girare accendendo e spegnendo la ventola senza problemi.

cioè collego il termometro con una batteria esterna? vcc e gnd alla batteria esterna e cavo dati ad arduino, la resistenza tra cavo dati e vcc la lascio comunque?

Ok attendo :slight_smile: grazie ancora per l'aiuto

In serata provo a farlo e ti faccio sapere!

Ciao, ho provato a collegare come mi hai detto, nell'immagine ho fatto uno schemino per conferma, e sembra che non vada in errore allo spegnimento della ventola e continui a funzionare :grinning:
Cosa devo fare per poterlo attaccare di nuovo alla batteria?

tutta questa roba :o appena ho tempo compro tutto e monto, aggiornerò sia se funzionerà sia che non!
Un diodo di che tipo? uno zener da 12v o altro?

Ho finalmente risolto il problema! Se può servire a qualcuno:
-inserendo uno snubber in parallelo sui fili che vanno al relè della ventola ho risolto lo spegnimento del termometro;
-alimentanto il relè di arduino da uno stepdown diverso ho risolto lo spegnimento di arduino, in pratica ho separato completamente le due alimentazioni a 5v di arduino e relè.
Ora la ventola attacca e stacca senza problemi