Problema con LM35DZ + relay

Salve a tutti,

ho un problema assurdo con la lettura della temperatura a display di un sensore LM35DZ se operante insieme ad un modulo relay e mi spiego meglio....

Quando leggo la temperatura a display del LM35DZ è tutto regolare, la temperatura mostrata è quella giusta, poniamo ad esempio 25°C. (testata con altri termometri digitali, quindi ok).

Il problema arriva quando lo sketch (per mia esigenza) attiva un modulo relay.... una volta che il relay passa appunto allo stato LOW, la temperatura si alza di circa 12°C senza un motivo.

Se infatti disattivo il relay leggo 25°C (la temperatura corretta), come lo riattivo la temperatura rilevata diventa all'istante 37/38 °C circa, falsando quindi tutto il regolare svolgimento dello sketch.... non riesco a trovare la causa di questo problema, qualcuno sa darmi un'indicazione?

Grazie a tutti per l'attenzione, Francesco.

Wow che cosa strana, probabilmente non so come aiutarti ma di sicuro se alleghi lo sketch con i tag code qualcuno può anche darti qualche dritta =)

ciao, grazie per la risposta, scusa se ti chiedo una cosa ovvia ma sono da poco su questo blog, posso postare quì lo sketch come semplice risposta?

Mmm... sarà il caso che ti studi il regolamento ... ed in particolare il punto 7 ... dopo di che ...

... metti il codice ed anche uno schema dei collegamenti e dell'alimentazione.

Guglielmo

Grazie Guglielmo, avevo letto il regolamento ma mi era sfuggito.
Il post è questo, ho aggiunto i commenti a lato, il problema descritto avviene quando siamo nel MAIN...

// RONER AUTOMATICO
//
// Dispositivi in uso: Arduino uno, bollitore a immersione, pompa acqua, modulo relay.
//
//
// Lo sketch chiede a quale temperatura vogliamo mantenere l'acqua, il relay disattiva il bollitore quando la 
// temperatura è speriore a quella richiesta per riattivarsi appena diminuisce poco sotto il valore richiesto



#include <Keypad.h>
#include <EEPROM.h>


int addr = 0;   
int addr1 = 1;


const int buttonPin = A0;     //pulsante + temperatura
const int buttonPin1 = A1;    //pulsante - temperatura


int buttonState = 0;         //valore iniziale bottone 0
int buttonState1 = 0;        //valore iniziale bottone 0


int temp = 0;
int time = (millis()/1000);

#include <LiquidCrystal.h>
#define RELAY 9 
float temperature; 
int reading;  
int lm35Pin = A5;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int backLight = 8;    
byte newChar[8] = {
  B11000,
  B11000,
  B00011,
  B00100,
  B00100,
  B00100,
  B00011,
  B00000
};
byte newChar1[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte goccia[8] = {
  B00000,
  B00100,
  B00100,
  B01010,
  B10001,
  B10001,
  B11011,
  B01110
};



void setup()
{    lcd.begin(16,2);                		
digitalWrite(RELAY,LOW);      //relay acceso

  lcd.createChar(8, newChar);
  lcd.createChar(9, newChar1);
  lcd.createChar(7, goccia);
  pinMode(RELAY, OUTPUT);
  pinMode(backLight, OUTPUT);        	
  analogWrite(backLight, 200); 
    analogReference(INTERNAL);
  lcd.clear();                    		
  lcd.setCursor(5,0);             		
  lcd.print("RONER"); 
     delay(800);
 lcd.setCursor(4,1);             		
  lcd.print("by ME"); 
  delay(1200);
    lcd.clear();  
lcd.setCursor(2,1);             		
  lcd.print("TEMPERATURA"); 
  lcd.setCursor(3,0);             		
  lcd.print("SELEZIONE");
    for (int i = 0; i < 512; i++)            //AZZERA EEPROM
    EEPROM.write(i, 0);
      pinMode(buttonPin, INPUT);     

    lcd.clear();  

}

void loop()  
{      
  lcd.setCursor(2,0);           //    SELEZIONE DELLA TEMPERATURA          
lcd.print("gradi?");            //                              
 lcd.setCursor(14, 0);          //    Lo sketch chiede quale temperatura desideriamo che venga              
  lcd.write(8);                 //    mantenuta, abbiamo 30 secondi di tempo per selezionarla.
                                //  
lcd.setCursor(2,1);             //    Tenendo premuto il primo tasto la temperatura aumenta, col
  lcd.print("tempo");           //    secondo diminuisce, alla fine dei 30 secondi il sistema
                                //    usa la temperatura visualizzata a display.
lcd.setCursor(9,1);             //
  lcd.print(millis()/1000);     //
  lcd.setCursor(11,1);          //  
  lcd.print("/30");             //
                                //
  if(millis()/1000==30){        //
      lcd.clear();              //    FINE SELEZIONE
                      
                                
   lcd.setCursor(2,0);          //    CONFERMA SELEZIONE
 lcd.print("temperatura");      // 
 lcd.setCursor(2,1);            //    Qui viene confermata la temperatura scelta per 3 secondi, in seguito
 lcd.print("scelta");           //    si avvia lo sketch.
lcd.setCursor(12, 1);           //
  lcd.write(8);                 //
    lcd.setCursor(9,1);         //  		
  lcd.print(temp);              //
delay(3000);                    //
      lcd.clear();              //

goto MAIN;

MAIN:  //  LABEL PRINCIPALE 
       //
       //  lo sketch legge la temperatura del LM35DZ e spegne il relay se la temperatura è 
       //  superiore alla temperatura selezionata. QUI SI PONE IL PROBLEMA, QUANDO LA TEMPERATURA E' SUPERIORE
       //  IL RELAY SI ACCENDE E A QUESTO PUNTO LA LETTURA DELLA TEMPERATURA E' SBALLATA, SE IL RELAY VIENE
       //  DISATTIVATO TORNA A LEGGERE CORRETTAMENTE I VALORI...

reading = analogRead(lm35Pin);
    temperature = reading / 9.31;
    delay(400);




lcd.setCursor(0,0);
 lcd.print("acqua");
 lcd.setCursor(6,0);
 lcd.write(7);
 lcd.setCursor(7,0);
 lcd.write(7);
 lcd.setCursor(14,0);
 lcd.write(8);
 lcd.setCursor(10,0);
 lcd.print(temperature);
 lcd.setCursor(4,1);
 lcd.print("target");
 lcd.setCursor(14,1);
 lcd.write(8);
 lcd.setCursor(11,1);
 lcd.print(temp);

if (temperature >= temp)
{
  
      digitalWrite(RELAY,HIGH); 
      
}
if (temperature < temp)
{
      digitalWrite(RELAY,LOW); 

}

 goto MAIN;
 
 
 
 
 
 

}
    buttonState = digitalRead(buttonPin);      //selezione temperatura:
 if (buttonState == HIGH) {                    //pulsante + temperatura
    // turn LED on:    
temp = temp + 1;
 lcd.setCursor(11,0);  
lcd.print(temp); 
delay(130);		  } 

      buttonState1 = digitalRead(buttonPin1);  //selezione temperatura:
 if (buttonState1 == HIGH) {                   //pulsante + temperatura
    // turn LED on:    
temp = temp - 1;
 lcd.setCursor(11,0);  
lcd.print(temp); 
delay(100);		

}}

... rispetto a quanto chiesto ... manca lo schema di come hai fatto i collegamenti e le informazioni di come alimenti il tutto.

goto in un programma C ... è un obbrobrio ...
... se fossi in te dedicherei un po' di tempo a studiare bene il linguaggio ed ad eliminare quegli orrendi goto ... non stai mica scrivendo in basic ! :stuck_out_tongue_closed_eyes:

Guglielmo

Bisogna vedere da dove prendi alimentazione per la scheda relè, come ti hanno detto mancano specifiche sull'hardware che usi e schemi

Se prelevi i 5V dall'alimentatore di arduino essi si abbassano leggermente con l'attivazione dei relè. Visto che i 5V vengono usati come riferimento per il ADC del ATmega un abbassamento dei 5V significa che il segnale del LM35 che resta costante viene letto piú alto.
Succede anche se aggiungi solo 2 led.

Ciao Guglielmo,

non capisco di quali collegamenti in particolare hai bisogno, c'è solo un LM35DZ e un relay, entrambi sono collegati al pin analogico descritto, per quanto riguarda l'alimentazione sto facendo prove con la scheda collegata direttamente al pc, in ogni caso ho provato anche ad alimentare la scheda esternamente ma il problema continua a ripetersi.

il discorso comunque è piu generale, non dipende molto da questo sketch, basta che tu faccia una prova semplice, scrivi un semplice sketch e leggi i dati che ti manda LM35DZ a display, poi aggiungi allo sketch un relay, gli imposti lo stato LOW nel setup e poi leggi di nuovo i valori... sono sballati..... ora stacca il delay direttamente dall'alimentazione e guarda la temperatura.... torna quella di prima.

Per quanto riguarda il suggerimento sono d'accordo con te sui "GOTO" ma mi semplificano spesso il lavoro

Ciao Pablos, grazie per la risposta, avevo già considerato il fatto, infatti sono arrivato ad alimentatare la scheda con un alimentatore 12 V 10 A ;D credo possa bastare

infatti sono arrivato ad alimentatare la scheda con un alimentatore 12 V 10 A

Quindi non hai più i valori sballati?

Ogni volta che fai il reset riscrivi 512 celle sulla eeprom ... non è proprio il massimo

ciao

cecco77:
non capisco di quali collegamenti in particolare hai bisogno, c'è solo un LM35DZ e un relay

... se non metti lo schema esatto dei collegamenti (... non puoi aver collegato un relay ad un pin di Arduino senza un qualche cosa per pilotarlo) e dell'alimentazione ... dubito troverai molti che ti potranno aiutare. :roll_eyes:

Comunque ... fai come vuoi ... :smiling_imp:

Guglielmo

pablos:
Quindi non hai più i valori sballati?

Ogni volta che fai il reset riscrivi 512 celle sulla eeprom ... non è proprio il massimo

ciao

Grazie, ho tolto l'errore della eeprom, mi ero dimenticato di modificare le sole due celle richieste! avevo fatto un copia incolla dagli esempi senza modificarlo :-X
Purtroppo il problema rimane, non ho davvero idea su come risolverlo, ripeto, a parte il programma che ho scritto, il problema si pone anche scrivendo un semplice sketch di lettura di temperatura, una volta attivato un relay ci risiamo.
Anche io come te credo sia solo un problema di alimentazione, il fatto è che non so come risolverlo. Ho provato ad alimentare esternamente anche soltanto il sensore di temperatura ma niente da fare, lo fa di nuovo, mentre per quanto riguarda il relay, mi risulta impossibile alimentarlo esternamente, non si accende neanche, quindi devo per forza alimentarlo dalla scheda

gpb01:
... se non metti lo schema esatto dei collegamenti (... non puoi aver collegato un relay ad un pin di Arduino senza un qualche cosa per pilotarlo) e dell'alimentazione ... dubito troverai molti che ti potranno aiutare. :roll_eyes:

Comunque ... fai come vuoi ... :smiling_imp:

Guglielmo

Guglielmo non è che non voglia mettere lo schema, lo avrei già fatto se sapessi come fare.

Comunque per quanto riguarda il relay invece è attualmente collegato DIRETTAMENTE a un pin arduino (qui è al A2) quindi se è sbagliato magari siamo già a cavallo....

piccolo aggiornamento.... ho provato a togliere la retroilluminazione del display, così facendo "recupero" 3 gradi verso il parametro corretto, cioè da 39 °C rilevati con retroilluminazione, passa a 36 °C, mentre il valore corretto rimane 25 °C. Ho la sensazione che il problema sia il LCD, trasmettendo i dati al pc anzichè al LCD credo che questo problema non si verifichi e anche fosse a me serve rilevare tutto correttamente dal LCD!! :frowning: devo costruire un piccolo oggetto....

cecco77:
Guglielmo non è che non voglia mettere lo schema, lo avrei già fatto se sapessi come fare.

... nel regolamento (... punti 7, 8 e 9 ) queste cose sono ampiamente descritte ... basta seguirlo ! :smiling_imp:

cecco77:
Comunque per quanto riguarda il relay invece è attualmente collegato DIRETTAMENTE a un pin arduino (qui è al A2) quindi se è sbagliato magari siamo già a cavallo....

Normalmente, salvo micro-relay, non solo è sbagliato, ma può danneggiare seriamente la MCU.

Ti ricordo che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

cecco77:
piccolo aggiornamento.... ho provato a togliere la retroilluminazione del display, così facendo "recupero" 3 gradi verso il parametro corretto .....

Continui ad incaponirti su cose che NON sono il vero problema (... l'LCD, se ben collegato, non c'entra nulla), il problema è come tu hai fatto i collegamenti e come alimenti il tutto (... puoi mettere anche un alimentatore da 100A ... ci sono dei limiti intrinseci nei componenti di Arduino che NON puoi superare).

Ripeto un'ultima volta che, solo esaminando lo schema in dettaglio e conoscendo le esatte caratteristiche dei componenti che hai usato (... quindi includi link che ci diano le specifiche tutto ciò che hai collegato) si può capire il problema, il resto ... sono solo chiacchiere !

Guglielmo

Ciao Guglielmo,

finalmente ho risolto, il problema come dicevi tu stava nello schema...
Proverò a spiegare con il mio linguaggio da contadino dell'elettronica.
il GND del relay era collegato alla "linea" GND della basetta alla quale erano collegati anche sensore, display etc.
Togliendo il GND del relay da lì e collegandolo all'altro GND di arduino uno (quello in alto a sinistra vicino al reset) risolvo il problema.
Tutto questo hai spiegato già tu il perchè....

Vi ringrazio tutti per il supporto, alla prossima!!