Sensore di temperatura dove sbaglio?

Ciao a tutti, sto creando un piccolo termometro ma non capisco dove sbaglio?

Vi spiego, ho inserito un led RGB, che dovrebbe accendere blu sotto i 5°, rosso sopra i 60° e verde a 24.71° (il valore di partenza del sensore su tinkercad).
Finche compilo il programma con il valore minimo e massimo non ho nessun problema, il problema inizia quando inserisco la riga di comando per l'accensione del led verde, in pratica rimane sempre acceso da 5,01° a 59,99°, mentre teoricamente dovrebbe accendersi solo a 24,71°.
Non capisco perché.
Anche la parte di testo che indica ">" o "<" collegata al valore di temperatura, non va nel senso se scendo sotto i 5° indica "<", ma risalendo non scompare ma rimane sul display, stessa cosa per il valore sopra i 60°
Vi allego il codice, spero possiate aiutarmi grazie :slight_smile:

// Biblioteca LCD
#include <LiquidCrystal.h>

// Inizializza la biblioteca LCD
LiquidCrystal LCD(12,11,5,4,3,2);

// definisce il pin per il sensore temperatura
int SensorTempPin=0;

// Definisce il pin per la temperatura bassa (BLU)
int AllertaTempBassa=10;
// Definisce il pin per la temperatura alta (ROSSO)
int AllertaTempAlta=8;
// definisce il pin per la temperatura corretta (VERDE)
int TemperaturaOK=13;

// Definisce il valore di temperatura bassa per l'accensione del led
int TempBassa=5;
// Definisce il valore di temperatura alta per l'accensione del led
int TempAlta=60;
// Definisce il valore di temperatura corretta per l'accensione del led
float TempOK=24.71;
void setup() {
	// Definisce come uscita il pin di temperatura bassa 
  	pinMode(AllertaTempBassa, OUTPUT);
	// Definisce come uscita il pin di temperatura alta
	pinMode(AllertaTempAlta, OUTPUT);
    // Definisce come uscita il pin di temperatura OK
    pinMode(TemperaturaOK, OUTPUT);
	// Definisce la quantita di collonne e linee del dislapy
	LCD.begin(16,2);
	// Scrive il messaggio tra "" sul display
	LCD.print("Temperatura:");
	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
	LCD.setCursor(0,1);
	// Scrive il messaggio tra "" sul diplay
	LCD.print("      C        F");
}

void loop() {
	// Legge la tensione sul sensore temperatura
	int SensorTempTens=analogRead(SensorTempPin);

  	// Converte la tensione letta
	float Tens=SensorTempTens*5;
	Tens/=1024;

  	// Converte la tensione letta in gradi celsius
	float TemperaturaC=(Tens-0.5)*100;

  	// Converte la temperatura da C a F
	float TemperaturaF=(TemperaturaC*9/5)+32;

  	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
  	LCD.setCursor(0,1);

  	// Scrive la temperatura in °C
	LCD.print(TemperaturaC);

  	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
	LCD.setCursor(9,1);

  	// Scrive la temperatura in °F
  	LCD.print(TemperaturaF);

	// Attiva e disattiva gli avvisi luminosi di bassa e alta 
    // temperatura
  	if (TemperaturaC>=TempAlta) {
        LCD.setCursor(13,0);
        LCD.print(">");
        digitalWrite(AllertaTempAlta, HIGH);
        digitalWrite(TemperaturaOK, LOW);
  		digitalWrite(AllertaTempBassa, LOW);
    }
  	else if (TemperaturaC<=TempBassa){
        LCD.setCursor(13,0);
        LCD.print("<");
  		digitalWrite(AllertaTempBassa, HIGH);
  		digitalWrite(AllertaTempAlta, LOW);
        digitalWrite(TemperaturaOK, LOW);
  	}
    else if (TemperaturaC=TempOK){
      LCD.setCursor(13,0);
      LCD.print("OK");
        digitalWrite(TemperaturaOK, HIGH);
  		digitalWrite(AllertaTempBassa, LOW);
  		digitalWrite(AllertaTempAlta, LOW);
    }
  	// Attende 1 secondo
  	delay(1000);
}

Nell'ultimo else devi usare == altrimenti fai un'assegnazione invece di un confronto.

Poi considera che con i float difficilmente avrai l'uguaglianza col tuo valore. Conviene che verifichi di essere entro un intervallo tipo > 24.7 e < 24.8

fratt:
Nell'ultimo else devi usare == altrimenti fai un'assegnazione invece di un confronto.

Poi considera che con i float difficilmente avrai l'uguaglianza col tuo valore. Conviene che verifichi di essere entro un intervallo tipo > 24.7 e < 24.8

Ok grazie adesso provo :slight_smile:
Avevo inserito il float perché per adesso sto simulando lo schema con tinkercad e come valore di partenza della simulazione mi da 24.7 quindi avevo pensato di usarlo per vedere il led verde acceso alla prtenza (a 24.7°) e poi spegnersi appeno lo sposto leggermente :wink:
Ora seguo il tuo consiglio sia per else che per il float

Ciao, ho provato ma ancora non va, ho anche fatto una piccola modifica al codice, ma adesso ho un problema che cambia in base all'ultimo else, se inserisco l'ultimo else, riesco ad avere acceso o spento solo il led della temperaturaOK, mentre se lo tolgo, i led accendono e rimangono accesi finché non arrivo alla temperatura per l'accensione di un altro led.
Non so se mi hai capito :frowning:

Ti faccio un esempio, se scendo sotto i 10° accende il led blu, se risalgo con la temperatura questo rimane acceso finché non accende il led verde, che a sua volta rimane acceso finché non accende il led rossore la temperatura troppo alta.

// Biblioteca LCD
#include <LiquidCrystal.h>

// Inizializza la biblioteca LCD
LiquidCrystal LCD(12,11,5,4,3,2);

// definisce il pin per il sensore temperatura
int SensorTempPin=0;

// Definisce il pin per la temperatura bassa (BLU)
int AllertaTempBassa=9;
// Definisce il pin per la temperatura alta (ROSSO)
int AllertaTempAlta=8;
// definisce il pin per la temperatura corretta (VERDE)
int TemperaturaOK=10;

// Definisce il valore di temperatura bassa per l'accensione del led
int TempBassa=5;
// Definisce il valore di temperatura alta per l'accensione del led
int TempAlta=60;
// Definisce il valore di temperatura corretta per l'accensione del led
int TempOK;
void setup() {
	// Definisce come uscita il pin di temperatura bassa 
  	pinMode(AllertaTempBassa, OUTPUT);
	// Definisce come uscita il pin di temperatura alta
	pinMode(AllertaTempAlta, OUTPUT);
    // Definisce come uscita il pin di temperatura OK
    pinMode(TemperaturaOK, OUTPUT);
	// Definisce la quantita di collonne e linee del dislapy
	LCD.begin(16,2);
	// Scrive il messaggio tra "" sul display
	LCD.print("Temperatura:");
	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
	LCD.setCursor(0,1);
	// Scrive il messaggio tra "" sul diplay
	LCD.print("      C        F");
}

void loop() {
	// Legge la tensione sul sensore temperatura
	int SensorTempTens=analogRead(SensorTempPin);

  	// Converte la tensione letta
	float Tens=SensorTempTens*5;
	Tens/=1024;

  	// Converte la tensione letta in gradi celsius
	float TemperaturaC=(Tens-0.5)*100;

  	// Converte la temperatura da C a F
	float TemperaturaF=(TemperaturaC*9/5)+32;

  	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
  	LCD.setCursor(0,1);

  	// Scrive la temperatura in °C
	LCD.print(TemperaturaC);

  	// Cambia il cursore nella prima colonna e nella seconda riga 
    // del display LCD
	LCD.setCursor(9,1);

  	// Scrive la temperatura in °F
  	LCD.print(TemperaturaF);

	// Attiva e disattiva gli avvisi luminosi di bassa e alta 
    // temperatura
  	if (TemperaturaC>=TempAlta) {
        LCD.setCursor(13,0);
        LCD.print(">");
        digitalWrite(AllertaTempAlta, HIGH);
        digitalWrite(TemperaturaOK, LOW);
  		digitalWrite(AllertaTempBassa, LOW);
    }
  	else if (TemperaturaC<=TempBassa){
        LCD.setCursor(13,0);
        LCD.print("<");
  		digitalWrite(AllertaTempBassa, HIGH);
  		digitalWrite(AllertaTempAlta, LOW);
        digitalWrite(TemperaturaOK, LOW);
  	}
    else if (TemperaturaC>=24 && TemperaturaC<=32){
      LCD.setCursor(13,0);
      LCD.print("OK");
        digitalWrite(TemperaturaOK, HIGH);
  		digitalWrite(AllertaTempBassa, LOW);
  		digitalWrite(AllertaTempAlta, LOW);  
    }
    else
        digitalWrite(TemperaturaOK, LOW);
  		digitalWrite(AllertaTempBassa, LOW);
  		digitalWrite(AllertaTempAlta, LOW);
  	// Attende 1 secondo
  	delay(1000);

Ciao,
Credo che tu ti sia dimenticato le parentesi {} nell'ultimo else, quindi solo la prima istruzione dopo l'else sarà condizionata dall' "else", mentre le altre saranno sempre eseguite!

Ti consiglio comunque di indentare meglio il codice per aumentare la leggibilità, diminuendo così le possibilità di errore :slight_smile:

Ciao,
Andrea!

Concordo

Grazie ragazzi adesso funziona, però non capisco se è un bug di tinkercad oppure sbagliavo io, in pratica pur avendo messo le {} dove mi avevate indicato voi, continuava a non funzionare come volevo.
Ho inserivo due variabili per gestire il range della temperatura ottimale ed adesso funziona.
Ancora grazie :slight_smile:

// Biblioteca LCD
#include <LiquidCrystal.h>
#define SensorTempPin 0  //Pin del sensore temperatura
#define AllertaTempBassa 9  //Pin del led temp. bassa (BLU)
#define AllertaTempAlta 8 // Pin led temp. Alta (ROSSO)
#define TemperaturaOK 10 //Pin led temp. ottimale (VERDE)

LiquidCrystal LCD(12,11,5,4,3,2);	// Inizializza la biblioteca LCD
int TempBassa=5; 	// Valore tmp. bassa
int TempAlta=60; 	// valore temp. alta
int TempOKmax=40;	// valore temp. ottimale max
int TempOKmin=10;	// valore temp. ottimale min

void setup() {

  // Definizione pin dei led
  	pinMode(AllertaTempBassa, OUTPUT);	
	pinMode(AllertaTempAlta, OUTPUT);
    pinMode(TemperaturaOK, OUTPUT);
  
  // Definizione parte LCD
	LCD.begin(16,2);  // Definisce la quantita di collonne e linee del dislapy
	LCD.print("Temp.:");
	LCD.setCursor(8,0);  // cursore colonna 8 riga 1
	LCD.print("      C");
}

void loop() {
	int VoltSensore=analogRead(SensorTempPin);  // Legge la tensione sul sensore temperatura
	float Tens=VoltSensore*5;  // Converte la tensione letta
	Tens/=1024;
	float TemperaturaC=(Tens-0.5)*100; 

  	LCD.setCursor(7,0);  
	LCD.print(TemperaturaC);

	// gestione led 
   if (TemperaturaC>=TempAlta) {
  		digitalWrite(AllertaTempBassa, LOW);
  		digitalWrite(AllertaTempAlta, HIGH);
        digitalWrite(TemperaturaOK, LOW);
    }
  	else if (TemperaturaC<=TempBassa){
  		digitalWrite(AllertaTempBassa, HIGH);
  		digitalWrite(AllertaTempAlta, LOW);
        digitalWrite(TemperaturaOK, LOW);
  	}
    else if(TemperaturaC>=TempOKmin && TemperaturaC<=TempOKmax){
        digitalWrite(TemperaturaOK, HIGH);
        digitalWrite(AllertaTempBassa, LOW);
        digitalWrite(AllertaTempAlta, LOW);
    }
  	else {
  		digitalWrite(AllertaTempBassa, LOW);
  		digitalWrite(AllertaTempAlta, LOW);
        digitalWrite(TemperaturaOK, LOW);
    }
   
  	// Attende 1 secondo
  	delay(1000);
}

Credo sia un baco di tinkercad...

Scusate ancora :frowning:

Ho notato che variando la temperatura soprattutto portandola ad uno dei due estremi e poi muovendo nuovamente il cursore per la temperatura, ottengo dei decimali a 3 cifre, ma credo che l'ultima cifra sia il dato della vecchia temperatura, perché non varia, confermate?

Ultima domanda, con LM35, che teoricamente è il sensore che da tinkercad come componente, non c'è modo di memorizzare la temperatura massima e minima rilevata?
Il codice gira non mi da errore ma non ottengo nessun dato sul display.

Grazie sempre per l'aiuto :slight_smile:

P.s. vi allego il link della simulazione

Hedaa:
... con LM35, che teoricamente è il sensore che da tinkercad come componente, non c'è modo di memorizzare la temperatura massima e minima rilevata?

Beh .. la cosa è totalmente indipendente dal sensore usato (che, ovviamente, non memorizza tali informazioni) ma dall'applicazione che deve gestire correttamente queste due variabili ... ::slight_smile:

Guglielmo

Ok, ho provato con un serial.print della temperatura minima e massima, ed effettivamente così i dati li ottengo.
Altro bug di tinkercad :slight_smile:
Sempre grazie per l'aiuto

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.