TMP36 valore analogico costante 0,668V - 0,700 Volt mentre SensorVal Variabile

Ciao a tutti
ho provato a cercare la soluzione in "FORUM" ma non sono riuscito e cerco un aiuto.
dal progetto 03 AMOROMETRO ho semplicemente aggiunto due Led di conferma temperatura e mi succede che:

  1. leggendo del TMP36 il valore analogico del pin centrale la tensione si mantiene costante tra 0,668V -
    0,700 Volt

  2. il valore della prima stringa del Monitor seriale:
    Base Line: 20.00, Sensor Value : 147, Volts;0.72, Temperatura C: 21.78
    come si vede dall'allegato MONITOR 1 le letture successive ogni 10 secondi continuano ad aumentare
    fino a stabilizzarsi su valori che non hanno niente a che fare con il valore analogico del pin centrale e
    della temperatura della stanza che da di 21,0 C°
    detto il valore analogico NO

  3. Se chiudo e riapro MONITOR la prima riga:
    Base Line: 20.00, Sensor Value : 148, Volts;0.72, Temperatura C: 22.27
    come si vee ripropone un valore di temperuatura di un grado differente rispetto a Monitor-1

  4. praticamente chiudendo aprendo MONITOR la prima riga si ripete sempre corretta e poi riprende
    l'aumento

E' come se resettando il programma la prima lettura è OK.

Grazie ancora per il vostro contributo.
Ciao
patverg

Spero proprio di aver Rispettato le regole

[const int sensorPin = A0;
const float baselineTemp = 20.0;                                                                                                                                                                    


void setup() {

// Richiesta lettura SetUp
pinMode(7,INPUT);
// Fine Richiesta Lettura SetUp



Serial.begin(9600);  // apri una porta seriale

for(int pinNumber = 2; pinNumber<7; pinNumber++){
pinMode(pinNumber,OUTPUT);
digitalWrite(pinNumber,LOW);
}                                                                                                                                                              
}
void loop() {
int sensorVal = analogRead(sensorPin);
Serial.print(" Base Line: ");
Serial.print(baselineTemp);
Serial.print(", Sensor Value : ");
Serial.print(sensorVal);
// converti la lettura ADC in tensione
float voltage = (sensorVal/1024.0)* 5.0;
Serial.print(", Volts;");
Serial.print(voltage);
Serial.print (", Temperatura C: ");                                                                                                                                                                                               
// converti la tensione in temperatura
float temperature = (voltage -.5)*100;
Serial.println(temperature);

if(temperature<baselineTemp){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);                                                                                                                                               
} else if (temperature >baselineTemp+2 && temperature < baselineTemp+4){
digitalWrite(2,HIGH); 
digitalWrite(3,LOW);
digitalWrite(4,LOW); 
} else if (temperature >baselineTemp+4 && temperature < baselineTemp+6){ 
digitalWrite(2,HIGH); 
digitalWrite(3,HIGH); 
digitalWrite(4,LOW); 
}else if (temperature >baselineTemp+6){                                                                                  
digitalWrite(2,HIGH); 
digitalWrite(3,HIGH); 
digitalWrite(4,HIGH);  
//verifica uguale
}else if(temperature = baselineTemp){
digitalWrite(6,HIGH); //Led Azzurro
digitalWrite(7,LOW); //Led Giallo
} else if (temperature = baselineTemp+6) {
digitalWrite(6,LOW); //Led Azzurro
digitalWrite(7,HIGH); //Led Giallo
}
//fine verifica uguale

delay(10000);
}]

Ho continuato a testare lo schizzo sezionandolo e ho creato tre schizzi diversi:

  1. chiamato NewAmorometroPV.noLed dove controllavo solo il TMP36 con monitor disattivando i LED
[/const int sensorPin = A0;
const float baselineTemp = 20.0;                                                                                                                                                                    

void setup() {
pinMode(7,INPUT); // PV Richiesta lettura SetUp

Serial.begin(9600);  // apri una porta seriale
for(int pinNumber = 2; pinNumber<7; pinNumber++){
pinMode(pinNumber,OUTPUT);
digitalWrite(pinNumber,LOW);
}                                                                                                                                                              
}

void loop() {
Serial.print(" Base Line: ");
Serial.print(baselineTemp);

int sensorVal = analogRead(sensorPin);
Serial.print(", Sensor Value : ");
Serial.print(sensorVal);

float voltage = (sensorVal/1024.0)* 5.0; // converti la lettura ADC in tensione
Serial.print(", Volts;");
Serial.print(voltage);

float temperature = (voltage -.5)*100; // converti la tensione in temperatura
Serial.print (", Temperatura C: ");  
Serial.println(temperature);                                                                                                                                                                         

delay(5000); ]

e come si vede dall'allegato Monitor-noLed il valore della tensione di uscita è stabile

2) chiamato NewAmorometroPV.onOff  dove ho aggiunto DUE LED con un controllo sotto o sopra la 
  baselineTemp = 20.0;  

[code][//verifica ON/OFF
if(temperature < baselineTemp){
digitalWrite(5,HIGH); //Led Azzurro
digitalWrite(6,LOW); //Led Giallo
} else if (temperature > baselineTemp) {
digitalWrite(5,LOW); //Led Azzurro
digitalWrite(6,HIGH); //Led Giallo
}
//fine verifica ON/OFF]

e il Monitor segnala un aumento della tensione dopo la prima lettura di circa 10 Volt. !!! allegato Monitor-OnOff


3) ho chiamato NewAmorometroPV. completo  dove ho aggiunto il controllo degli altre 3 LED con indicazione  sequenziale dell'aumento della temperatora
 [code][//Verifica progressività
if(temperature<baselineTemp){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);                                                                                                                                               
} else if (temperature >baselineTemp && temperature < baselineTemp+2){ 
digitalWrite(2,HIGH); 
digitalWrite(3,LOW);
digitalWrite(4,LOW); 
} else if (temperature >baselineTemp+2 && temperature < baselineTemp+4){ 
digitalWrite(2,HIGH); 
digitalWrite(3,HIGH); 
digitalWrite(4,LOW); 
}else if (temperature >baselineTemp +4){                                                                                  
digitalWrite(2,HIGH); 
digitalWrite(3,HIGH); 
digitalWrite(4,HIGH);  
}
//Fine Verifica progressività]

analizzando il Monitor allegato Monitor-All e la temperatura dopo la prima lettuta aument  velocemente fino a 60 Volt mentre il piedino centrale rimane sempre con una tensione costante di .660 . 700 Volt.

ho scoperto il MOTIVO ma non ho la più pallida idea della CAUSA.
Ho ripetuto più volte io schizzi ma il risultato veniva confermato

Vi ringrazio della pazienza e mi auguro di non aver ingarbugliato la spiegazione.

Grazie e ciao a tutti
patverg
                                                                                                                                       0

Monitor-1.JPG

Monitor-2.JPG

Monitor-noLed.JPG

Monitor-OnOff.JPG

Monitor-All.JPG

patverg:
Ciao a tutti
ho provato a cercare la soluzione in "FORUM" ma non sono riuscito e cerco un aiuto.
dal progetto 03 AMOROMETRO ho semplicemente aggiunto due Led di conferma temperatura e mi succede che:

  1. leggendo del TMP36 il valore analogico del pin centrale la tensione si mantiene costante tra 0,668V -
    0,700 Volt

  2. il valore della prima stringa del Monitor seriale:
    Base Line: 20.00, Sensor Value : 147, Volts;0.72, Temperatura C: 21.78
    come si vede dall'allegato MONITOR 1 le letture successive ogni 10 secondi continuano ad aumentare
    fino a stabilizzarsi su valori che non hanno niente a che fare con il valore analogico del pin centrale e
    della temperatura della stanza che da di 21,0 C°
    detto il valore analogico NO

  3. Se chiudo e riapro MONITOR la prima riga:
    Base Line: 20.00, Sensor Value : 148, Volts;0.72, Temperatura C: 22.27
    come si vee ripropone un valore di temperuatura di un grado differente rispetto a Monitor-1

  4. praticamente chiudendo aprendo MONITOR la prima riga si ripete sempre corretta e poi riprende
    l'aumento

E' come se resettando il programma la prima lettura è OK.

Grazie ancora per il vostro contributo.
Ciao
patverg

Spero proprio di aver Rispettato le regole

[const int sensorPin = A0;

const float baselineTemp = 20.0;

void setup() {

// Richiesta lettura SetUp
pinMode(7,INPUT);
// Fine Richiesta Lettura SetUp

Serial.begin(9600);  // apri una porta seriale

for(int pinNumber = 2; pinNumber<7; pinNumber++){
pinMode(pinNumber,OUTPUT);
digitalWrite(pinNumber,LOW);
}                                                                                                                                                             
}
void loop() {
int sensorVal = analogRead(sensorPin);
Serial.print(" Base Line: ");
Serial.print(baselineTemp);
Serial.print(", Sensor Value : ");
Serial.print(sensorVal);
// converti la lettura ADC in tensione
float voltage = (sensorVal/1024.0)* 5.0;
Serial.print(", Volts;");
Serial.print(voltage);
Serial.print (", Temperatura C: ");                                                                                                                                                                                             
// converti la tensione in temperatura
float temperature = (voltage -.5)*100;
Serial.println(temperature);

if(temperature<baselineTemp){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);                                                                                                                                             
} else if (temperature >baselineTemp+2 && temperature < baselineTemp+4){
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
} else if (temperature >baselineTemp+4 && temperature < baselineTemp+6){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
}else if (temperature >baselineTemp+6){                                                                                 
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH); 
//verifica uguale
}else if(temperature = baselineTemp){
digitalWrite(6,HIGH); //Led Azzurro
digitalWrite(7,LOW); //Led Giallo
} else if (temperature = baselineTemp+6) {
digitalWrite(6,LOW); //Led Azzurro
digitalWrite(7,HIGH); //Led Giallo
}
//fine verifica uguale

delay(10000);
}]



[/]

Spero proprio di aver Rispettato le regole

mmmm.. mica tanto, comunque il problema non sono le regole in se ma il fatto che per leggere e capire ci ho più tempo del necessario e ciò è dovuto all'uso non convenzionale di Quote. e Code e alla mancata formattazione del codice.

Riguardo alla formattazione del codice nel programma arduino IDE c'è una opzione per copiare il codice e auto formattarlo, purtroppo non ho al momento il programma sotto mano per cui dovrai documentarti.

La corretta formattazione del codice aiuta la lettura e comprensione delle stesso per cui è fondamentale sia per scrivere che per leggere il codice.

Quote va usato per le citazioni come ho fatto in questo post, dove la frase "Spero proprio di aver Rispettato le regole" l'hai scritta tu e io la cito copiandola dal tuo post in quello che sto scrivendo, poi la seleziono e premo il tasto Quote

Mentre l'icona Code serve solo a contenere il codice del tuo programma.

ho provato a cercare la soluzione in "FORUM" ma non sono riuscito e cerco un aiuto.

In verità non ricordo se si è già parlato ampiamente di "amorometro", comunque si è tanto parlato di lettura della temperatura e conversione ADC (Analog Digital Conversion). Conversione ADC che serve per leggere il valore della tensione di uscita del TMP36 nel caso in questione.

Il problema che evidenzi mi sembra di capire che sia legato alla variazione repentina del valore letto dal pin
A0. Se questo è il problema è risolvibile almeno in due modi: Via software o Via hardware.

Oppure in entrambe i modi a seconda di quanta precisione e ripetibilità si desidera ricavare dalla lettura
del pin A0.

Via hardware
Un condensatore da 100nF (nano Farad) tra A0 e GND dovrebbe migliorare la stabilità della lettura.
Alimentare il TMP36 attraverso uno stabilizzatore di tensione indipendente migliora anche il funzionamento.
Altri accorgimento li rimando per adesso.

Via Software
Anziché acquisire una sola lettura con analogRead() ne eseguiamo 8, gli 8 valori ricavati li sommiamo in una variabile accumulatore e poi eseguiamo la divisione per 8, ottenendo una media aritmetica.

int sensorVal;                     // contiene un valore intero nel 0÷1023 
for (byte n=0; n<8; n++) {
    sensorVal += analogRead(sensorPin);   // accumula 
}
sensorVal /= 8;        // divide per 8

Ti consiglio di andare avanti con gli altri esempi annotandoti l'anomalia che hai riscontrato, cosi da continuare
e completare questa fase di apprendimento. In seguito sarai in grado di creare un tuo programma che legge la temperatura del TMP36 e potrai dedicarti a risolvere i problemi di instabilità e ripetibilità che hai constatato.

PS: l'alimentazione via USB non è stabile come si possa immaginare e può variare in base alla corrente che assorbe il circuito, ovviamente facendo accendere dei led aumenta l'assorbimento e pertanto varia anche la tensione e ciò influisce sulla lettura ADC.

Ciao.

Grazie in effetti le cose da memorizzare sono tante ci provo
ciao

Si fa fatica a comunicare così.

Quando scrivi un messaggio prima di cliccare su Post clicca su quello accanto Preview, il quale ti mostra come apparirà il messaggio, questo aiuta a sistemare l'impostazione e a correggere eventuali sviste.

Nota che puoi anche modificare i tuoi precedenti messaggi in modo da renderli più leggibili.

Inoltre non serve citare (con Quote) tutto il messaggio sempre e comunque e non è obbligatorio.

Inoltre questa tua risposta,

Grazie in effetti le cose da memorizzare sono tante ci provo
ciao

dovrebbe stare fuori dal quote.

Ciao.

>patverg: quando rispondi ad una cosa scritta nell'ultimo post, NON serve il QUOTE, è ovvio a cosa ti riferisci.

Se invece quoti qualche cosa NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia :wink:

Guglielmo

Ciao
Grazie per i suggerimenti, in effetti sto imparando un poco per volta, ma la difficoltà che sto incontrando è legata probabilmente a una mia configurazione mentale che cerca sempre un HELP in linea e non ho ancora ben capito come ottenerlo :o .

Ringrazio
patverg

un HELP in linea

Ti riferisci al forum o all' IDE arduino?
Comunque per entrambe effettivamente non c'è un help in linea. Un help in linea nell'IDE sarebbe davvero comodo. Io personalmente con altri IDE slegati da arduino l'help in linea lo uso tantissimo perché la mia memoria a breve termine non lavora come vorrei, in sostanza sono smemorato a breve termine. :slight_smile:

PS: Gli esempio di codice che stai seguendo servono solo per prendere confidenza, pertanto per semplificare sia il codice che gli schemi sono essenziali. Ad esempio la MCU (atmega328 nella UNO) offre la possibilità di specificare il valore di riferimento che il convertitore userà. Il riferimento può essere interno o esterno, questa flessibilità non viene menzionata negli esempi per semplificare l'apprendimento. Tradotto in altre parole: Datti tempo e affronta una cosa per volta.

Ciao.

Io in genere uso i motori di ricerca, scrivo Arduino e l'istruzione di cui voglio ricordare come si usa e in genere il primo risultato appartiene alla guida di riferimento.