Controllo di tempratura

Salve, dovrei realizzare un controllo di temperatura con Arduino uno mi servirebbe per il momento solo un sistema che legge la temperatura in un ambiente, la riporta su un display, e quando scende sotto una certa soglia attiva un relè, appena sale al disopra della soglia successiva scollega il contatto del relè (al relè poi collegherò una resistenza al quarzo), il problema è che io non ho molta dimestichezza con Arduino, mica qualcuno lo ha già fatto e può darmi una mano? grazie in anticipo e buona giornata

Ci sono molti esempi sulla rete, ad esempio:

Ciao
Ci sono state recenti discussioni su come usare dei relè.
Per il dimensionamento del relè soprattutto se usi la 220 mi astengo, troppo pericolosa se non hai delle conoscenze adeguate.

aletto118:
Salve, dovrei realizzare un controllo di temperatura con Arduino uno mi servirebbe per il momento solo un sistema che legge la temperatura in un ambiente, la riporta su un display, e quando scende sotto una certa soglia attiva un relè, appena sale al disopra della soglia successiva scollega il contatto del relè (al relè poi collegherò una resistenza al quarzo), il problema è che io non ho molta dimestichezza con Arduino, mica qualcuno lo ha già fatto e può darmi una mano? grazie in anticipo e buona giornata

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Grazie a tutti per i suggerimenti, ho trovato su internet un codice l'ho adattato al mio sensore (LM35) e il sistema funzionava finché non ho provato ad ampliarlo inserendo un display...

Il display che ho usato è un display impilabile sulla scheda Arduino (Arduino uno) che quindi occupa tutti i pin, per ovviare l'ho montato su una breadboard e i tre pin che servivano per far funzionare il sensore (+5V, GND, A0) li ho sdoppiati con dei cavetti.

Se rimuovo il display dalla breadboard il circuito funziona dandomi la reale temperatura, se lascio il display collegato sulla breadboard la temperatura segnata è di 470 C.

A qualcuno è capitato già? qualcuno ha qualche idea per risolvere il problema?

di seguito riporto il codice.

#include <LiquidCrystal.h>

// initialize the library with
// the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

const byte pin = A0; // analog pin
float celsius = 0, farhenheit =0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;
const int G_LED = 9;
const int Y_LED = 10;
void setup()
{
Serial.begin(9600); // inizializza la comunicazione seriale
// LED
pinMode(G_LED, OUTPUT);
pinMode(Y_LED, OUTPUT);
lcd.begin(16, 2);
}
void loop() {
sensor = analogRead(pin); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
millivolts = ( sensor/1023.0)*5000.0; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
celsius =millivolts/10.0; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
Serial.print(celsius);Serial.println(" C"); // stampa su serial monitor del valore di temperatura in gradi Celsius
lcd.print(celsius);lcd.print(" C");
// accendi il led
if (analogRead(pin)<41) { // 41 corrisponde a 20°C
analogWrite(G_LED, 255);
analogWrite(Y_LED, 0); }
else {
analogWrite(G_LED, 0);
analogWrite(Y_LED, 255); }
delay(1000);
}

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Nei calcoli float forza sempre le costanti con decimale, anche .0 va bene, quindi 5000.0 e 10.0
Il pin digiatale 0 esiste, per essere sicuri il pin analogico meglio usare A0 e non 0 (e un byte basta)

const byte pin = A0; // analog pin

Per il problema, forse è utile vedere foto dei collegamenti

Grazie mille nid69ita ho corretto il commento e il codice ma l'errore lo fa ancora, ti allego a questo commento le foto dei collegamenti,scusatemi se il circuito è completamente in disordine ma sto aspettando che mi arrivino altre breadboard e strip 2.54.

Il fatto che vicino a quei pin in basso a destra ci sia scritto A1~A5 non ti suggerisce niente? Evidentemente tali pin di Arduino sono replicati su quelli, mentre A0 è utilizzato per qualche funzionalità dello shield (nella fattispecie i pulsanti), per cui non puoi utilizzarlo.

Ergo: togli tutti quei fili, plugga lo shield direttamente su Arduino, collega il tuo sensore su uno di quei pin in basso a destra e dovrebbe funzionare. Puoi prendere anche +5V e GND da lì!

Qua c'è un demo per provare display e pulsanti, dovrebbe andare con il tuo shield, alla fine sono tutti uguali: Arduino_LCD_KeyPad_Shield__SKU__DFR0009_-DFRobot

Bene grazie mille SukkoPera, ho modificato come hai detto, ho impostato il pin A1 per il sensore che ho collegato sopra il display, ora dal monitor seriale funziona, ma il display quando collego il sensore si spegne.

di seguito riporto il codice e in piè di pagina la foto dei collegamenti...

#include <LiquidCrystal.h>
 
// initialize the library with
// the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

const byte pin = A1; // analog pin
float celsius = 0, farhenheit =0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;
const int G_LED = 9;
const int Y_LED = 10;
void setup()
{
Serial.begin(9600); // inizializza la comunicazione seriale
// LED
pinMode(G_LED, OUTPUT);
pinMode(Y_LED, OUTPUT);
lcd.begin(16, 2);
}
void loop() {
sensor = analogRead(pin); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
millivolts = ( sensor/1023.0)*5000.0; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
celsius =millivolts/10.0; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
Serial.print(celsius);Serial.println(" C"); // stampa su serial monitor del valore di temperatura in gradi Celsius
lcd.print(celsius);lcd.print(" C");
// accendi il led
if (analogRead(pin)<41) { // 41 corrisponde a 20°C
analogWrite(G_LED, 255);
analogWrite(Y_LED, 0); }
else {
analogWrite(G_LED, 0);
analogWrite(Y_LED, 255); }
delay(1000);
}

Dalla foto non capisco, ma ci sono troppi fili! E mi sembra pure tutto in corto!

  • +5V deve andare al pin 1 dell'LM35
  • A1 deve andare al pin 2 dell'LM35
  • GND deve andare al pin 3 dell'LM35

Stop, stacca tutto il resto!

SukkoPera:
Dalla foto non capisco, ma ci sono troppi fili! E mi sembra pure tutto in corto!

  • +5V deve andare al pin 1 dell'LM35
  • A1 deve andare al pin 2 dell'LM35
  • GND deve andare al pin 3 dell'LM35

Stop, stacca tutto il resto!

Ho collegato tutto direttamente ma è la stessa cosa, inserendo il sensore il display si spegne, in qualunque dei 5 ingressi lo colleghi.

aletto118:
Ho collegato tutto direttamente ma è la stessa cosa, inserendo il sensore il display si spegne, in qualunque dei 5 ingressi lo colleghi.

... perché probabilmente lo stai collegando male creando un corto. Metti una foto nitida del collegamento.

Guglielmo

Ho ricontrollato tutti i collegamenti e non trovo nulla in corto.

cito sotto il codice e posto foto più nitide in allegato, grazie in anticipo.

#include <LiquidCrystal.h>
 
// initialize the library with
// the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

const byte pin = A1; // analog pin
float celsius = 0, farhenheit =0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;
const int G_LED = 9;
const int Y_LED = 10;
void setup()
{
Serial.begin(9600); // inizializza la comunicazione seriale
// LED
pinMode(G_LED, OUTPUT);
pinMode(Y_LED, OUTPUT);
lcd.begin(16, 2);
}
void loop() {
sensor = analogRead(pin); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
millivolts = ( sensor/1023.0)*5000.0; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
celsius =millivolts/10.0; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
Serial.print(celsius);Serial.println(" C"); // stampa su serial monitor del valore di temperatura in gradi Celsius
lcd.print(celsius);lcd.print(" C");
// accendi il led
if (analogRead(pin)<41) { // 41 corrisponde a 20°C
analogWrite(G_LED, 255);
analogWrite(Y_LED, 0); }
else {
analogWrite(G_LED, 0);
analogWrite(Y_LED, 255); }
delay(1000);
}

Allora, se hai usato in modo corretto i colori dei fili io vedo un bianco a sinistra (ed immagino sia il segnale), un rosso al centro (ed immagino sia il +Vcc) e un nero a destra (ed immagino sia il GND) ...

SE è così ... SONO SBAGLIATI !!!

Questo è come si collega un LM35:

... e quindi il rosso (+Vcc) a sinistra ed il bianco (il segnale) al centro !

Guglielmo

No no, lui ha usato il bianco per Vcc... È contro le convenzioni, ma i collegamenti mi sembrano corretti.

... Sempre che quell'adattatore che usa per pluggare il tutto non metta tutto in corto ;).

Hai un tester? Riesci a controllare che i pin GND vadano davvero a GND, e idem gli altri? E anche che non ci sia un corto tra +5v e GND.

SukkoPera:
No no, lui ha usato il bianco per Vcc... È contro le convenzioni, ma i collegamenti mi sembrano corretti.

:o :o :o ... complimenti ... veramente l'ideale per rendere "comprensibile" un circuito !!! :smiling_imp:

Meno male che, per precauzione avevo scritto SE ... ::slight_smile:

Guglielmo

Magari semplicemente non conosce le convenzioni :).

Capita anche a me di usare cavi blu per Vcc, visto che rossi ne ho pochi :-*. Perlmeno, però, cerco di non mischiarli!

... uso scriteriato dei colori dei cavi DC !

Guglielmo

Consolati, c'e' chi fa peggio, anche in campo professionale ... una volta ho dovuto riparare una vecchia fresa radiale, e quando ho aperto la scatola che connetteva tutti i micro ed i finecorsa, mi sono trovato davanti 27 identici fili tutti neri (e tutti rigorosamente NON numerati, ovviamente) :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

Ma infatti secondo me non ha senso storcere troppo il naso a livello hobbystico, dove alla fine vai avanti a "prototipi": io ho comprato un pacco di jumper e dentro ce n'erano tipo 2 rossi e 15 blu. Non ho intenzione di comprarne un altro solo per questo motivo, mi sembra più sensato invertire i colori con l'unica attenzione, a questo punto, di usare sempre cavi blu per Vcc, il che permette comunque di verificare i collegamenti a colpo d'occhio... Alla fine è anche comodo se sei abituato agli impianti 220V, i colori sono gli stessi ;).

Ovvio che se mai dovessi fare qualcosa di professionale non esiterei a comprare i materiali corretti e ad utilizzarli come si deve.