sensore tmp36 gz

ho cercato nei forum ma non ho trovato risposta, quindi una (DUE) semplice domanda:

ho sviluppato questo http://www.giannifavilli.it/blog/arduino-controllo-remoto-http/ bellissimo progetto e funziona tutto ma, il sensore della temperatura che ho TMP36 GZ non mi da valori giusti:

sensortemp = analogRead(inTemp); //lettura dei dati nel pin analogico 1 
  voltage = (sensortemp*5000)/1024; // Conversione in millivolt
  voltage = voltage-500; //elimino offset
  celsius = voltage/10; // converto da millivolt a celsius
  temp = celsius; // assegno il valore alla variabile temp

mi da valori di: TEMPERATURA = 401.66 C :sweat_smile: :sweat_smile: :sweat_smile: :sweat_smile: CALDO LUCE = 800 (sensore luce va alla grande ) LUCE

non so se avete notato ma fa un po caldo e pensare che ho 20,7 in casa. quindi se notate qualcosa di strano nel calcolo fate un fischio.

PIccola domandina tecnica: :blush: attualmente arduino e collegato (a casa mia) al mio router e ho impostato su di un sito host un abbonamento (gratuito DynDNS) per assegnare IP ad un nome (URL) e qui tutto bene, funziona e mi posso collegare da qualsiasi posto dal mondo.

vorrei portare il progetto in un stabile dove ce un server amministratore che controlla altre stanze con altri PC server che controllano pc client e che qui VOGLIO COLLEGARE L'ARDUINO. se sino a quà vi è tutto chiaro, vengo alla domanda: come faccio a impostare IP nell'arduino e nel router?

credo che nell'arduino non si debba toccare niente perche basta ricordarsi ip arduino impostato nello sketch che poi ho usato per aprire porta nel router per farlo entrare. il problema vero e capire come accedere dall'esterno ad arduino e quindi che ip Riassegno nel sito host che mi ha dato un URL: dell'amministratore principale o dei server pc che anche loro hanno diritti di amministratore sui pc client?

Per capire questa cosa per cortesia se avete tempo, guardate lo sketck leggete i commenti nel sito del progetto iniziale http://www.giannifavilli.it/blog/arduino-controllo-remoto-http/.

intanto vi ringrazio e se non ci sentiamo prima buona festa del LAVORATORE. XD XD XD

Dacci per favore tutto il codice. Temo che sia un overflow di una variabile dichiarata troppo piccola ( int al posto di long) Ciao Uwe

superveloci qui … :%

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
 
/* ***
controllare un attuatore via web
con sensori di temperatura e luce
ARDUINO UNO
ETHERNET SHIELD
by GianniFavilli.it - www.giannifavilli.it
*** */
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip[] = { 192, 168, ***, *** }; // ip arduino internet in
byte gateway[] = { 192, 168, ***, *** }; // internet access via router
byte subnet[] = { 255, 255, ***, *** }; //subnet mask
Server server(80); //server port
 
int outPin = 9; // pin attuatore
//char link[]="http://www.giannifavilli.it"; //link
String readString; //string
boolean LEDON = false; // flag status attuatore
 
/*termistore*/ //variabili della prova con sensore MCP9700A
float temp; // variabile da calcolare
float volt; // variabile da calcolare sul sensore di temperatura
float tempPin = 1;   // pin analogico IN temperature sensor
int ledPintemp = 13; // pin led termistore
float tempreg = 25.0; // temperatura di controllo in celsius
      
//variabili della prova con sensore TMP 36GZ
      float sensortemp = 0;
       float voltage = 0;
        float celsius = 0;
/*end termistore*/
 
/*fotoresistore*/
int light; // variabile da calcolare
int ledPinlux = 12; // pin led fotoresistenza
int photoresistor = 0; // pin analogico IN fotoresistore
/*end fotoresistore*/
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(outPin, OUTPUT);
pinMode(ledPinlux, OUTPUT);
Serial.begin(9600);
}
 
void loop(){
 
  /*inizio calcolo temperatura*/
  //Temp = ((5 * analogRead(inTemp) * 100.0 ) / 1024) - 50; // Codice ottimizzato
 /*inizio calcolo temperatura*/ 
  // prova 1 dati non validi
  //temp = ((5 * analogRead(inTemp) * 100.0 ) / 1024) - 50; // Codice ottimizzato
  // altra possibilità ( ( 5 * analogRead(PIN) * 100.0  ) /  1024 ) * 0.325;
  
// prova con sensor temp 36gz
  sensortemp = analogRead(inTemp); //lettura dei dati nel pin analogico 1 
  voltage = (sensortemp*5000)/1024; // Conversione in millivolt
  voltage = voltage-500; //elimino offset
  celsius = voltage/10; // converto da millivolt a celsius
  temp = celsius; // assegno il valore alla variabile intemp

  /*
  (grazie giulio400 e jumpjack)
  volt = ( analogRead(tempPin) * 5) / 1024; // calcolo il valore letto e lo trasformo in valore di tensione
  temp = (volt - 0.5) * 100; // conversione MCP9700A
  */
  /*fine calcolo temperatura*/
 
  /*inizio luce*/
  light = analogRead(photoresistor);
  light = constrain(light, 0, 1023); // limiti dei valori tra 0 e 100
  light = map(light, 0, 150, 255, 0);
  /*fine luce*/
 
/*inizio client*/
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c); //store characters to string
      //if HTTP request has ended
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {// lettura del valore se il LED si deve accendere
          // il led sarà acceso
          digitalWrite(outPin, HIGH); // accendo il led
          LEDON = true;
          Serial.print("ON pin ");
          Serial.println(outPin);
          }
          else
          {
          //il led sarà spento
          digitalWrite(outPin, LOW); //sengo il led
          LEDON = false;
          Serial.print("OFF pin ");
          Serial.println(outPin);
        }
 
        // COSTRUZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        // inizializzo pagina (da togliere se uso ajax)
        client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        //inizai il body
        client.println("<div style='width:360px; height:640px;'>"); //risoluzione per nokia 5800 640x360
        client.println("<h1>STATUS SENSORI</h1><hr />");
        //Scrive sul browser il valore del termistore
        client.println("<p>TEMPERATURA = ");
        client.print(temp);
        client.println(" C 
</p>");
      if (temp < tempreg) {
        // scrive sul web freddo se il valore del termistore è basso
        client.print("<p><strong>FREDDO</strong></p>");
        }
      else {
        // scrive sul web caldo se il valore del termistore è alto
        client.print(" <p><strong>CALDO</strong></p>");
    } 
 
        //Scrive sul browser il valore della fotoresistenza
            client.println("<p>LUCE = ");
            client.print(analogRead(light));
            client.println("
</p>");
      if (light < 150) {
          // scrive sul web luce se il valore della fotoresistenza è alto
          client.print("<p><strong>LUCE</strong></p>");
        }
      else {
          // scrive sul web buio se il valore della fotoresistenza è basso
          client.print(" <p><strong>BUIO</strong></p>");
        }
        // link per aggiornare pagina e valori
        client.print("<h2>AGGIORNA SENSORI: <a href=''>CHECK</a></h2><hr />");
 
        client.println("<h1>CONTROLLO ATTUATORI via internet</h1>");
        client.println("<hr />");
        client.print("<h1>PIN control n. ");
        client.print(outPin);
        client.println("</h1>");
        client.println("
");
        //scrivo il LED status
        client.print("<font size='5'>PIN status: ");
          if (LEDON) {
              client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
            }
            else
            {
              client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
        client.print("<h2><a href='/?L=1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>");
 
        // firma
        client.println("<hr />");
        client.print("<h4>Visita <a href='http://www.giannifavilli.it' target='_blank' />www.giannifavilli.it</a></h4>");
        client.println("<hr />");
 
        // chiudo il div
        client.println("</div>");
        // chiudo pagina da togliere se uso ajax
        client.println("</body></html>");
 
        // pulisco la stringa per la successiva lettura
        readString="";
        //fermo il client
        client.stop();
 
        } //if c == /n
    } // if client available
  } // while client connesso
} // FINE if client
 
        if (temp < tempreg) { // accende o spengo un led se la temperatura è più bassa di quella di controllo
          digitalWrite(ledPintemp, HIGH); //accendo
          Serial.print("ON pin "); //scrivo in console
          Serial.println(ledPintemp); //scrivo in console
        }
        else {
          digitalWrite(ledPintemp, LOW); //spengo
          Serial.print("OFF pin "); //scrivo in console
          Serial.println(ledPintemp); //scrivo in console
        }
 
        if (light < 150) { // accende o spengo un led se la c'è luce
          digitalWrite(ledPinlux, HIGH); // accendo
          Serial.print("ON pin "); //scrivo in console
          Serial.println(ledPinlux); //scrivo in console
        }
        else {
          digitalWrite(ledPinlux, LOW); //spengo
          Serial.print("OFF pin "); //scrivo in console
          Serial.println(ledPinlux); //scrivo in console
        }
 
} // fine loop

Dal datasheet (http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf) pare serva un condensatore ceramico da 0,1 uF tra GND e V+.

Note the 0.1 ?F bypass capacitor on the input. This capacitor should be a ceramic type, have very short leads (surface-mount is preferable), and be located as close as possible in physical proximity to the temperature sensor supply pin. Because these temperature sensors operate on very little supply current and may be exposed to very hostile electrical environments, it is important to minimize the effects of radio frequency interference (RFI) on these devices. The effect of RFI on these temperature sensors specifically and on analog ICs in general is manifested as abnormal dc shifts in the output voltage due to the rectification of the high frequency ambient noise by the IC. When the devices are operated in the presence of high frequency radiated or conducted noise, a large value tantalum capacitor (±2.2 ?F) placed across the 0.1 ?F ceramic capacitor may offer additional noise immunity

Poi questi: float tempPin = 1; // pin analogico IN temperature sensor int ledPintemp = 13; // pin led termistore int outPin = 9; // pin attuatore li puoi sostituire con dei #define

float tempPin = 1 non si può vedere. :astonished: :astonished:

intanto grazie delle risposte...

in questo pdf http://physics.gallaudet.edu/rov/Temperature_sensor_tutorial_temp36.pdf viene spiegato bene come installare tmp36.

in merito al condensatore domani provo ma in vari tutorial in giro non lo mettono anche se il datasheet ne parla e funziona tutto alla grande. fista la grandezza della misura sembra non faccia la conversione in celsius. per quando riguarda float tempPin = 1 non si può vedere, mi sta venendo un dubbio ..... non è che ho assegnato due variabili al pin 1 ???? :fearful: :fearful: :fearful:

adesso sono fuso domani faccio le prove

grazie grazie ancora ...

........................................ aspettaaaaaaaaaaaa

ho trovato un esempio con codice, montaggio e video che funziona .... qui: http://tronixstuff.wordpress.com/2010/04/15/getting-started-with-arduino-chapter-two/

dimmi cosa ne pensi per cortesia. notte

Probabilmente è anche sbagliata la formula. Nel datasheet c'è scritto che questo sensore ha un passo di 10mV/°C con un valore di 25 °C a 750 mV e quindi -40 a 100mV e +125 a 1750mV

quindi avremo: millivolt = 5 * analogRead(pinTemp)/1024 * 1000 = analogRead(pinTemp) * 4.883 temperatura = millivolt/10 - 50

Con un solo passaggio --> Temperatura = analogRead(pinTemp) * 0.4883 -50

ho modificato testo di prima vedi appena sopra …

   // let's get measurin'
sensor = analogRead(0);
voltage = (sensor*5000)/1024; // convert raw sensor value to millivolts
voltage = voltage-500;        // remove voltage offset
celsius = voltage/10;         // convert millivolts to Celsius

E' lo stesso risultato che ho ottenuto io, ma usando più variabili. In questo modo è più legibile e si capiscono i passaggi ed è meglio debuggabile. Ma io lo so che scrivo programmi incasinati, quindi metterei:

celsius =  analogRead(pinTemp) * 0.4883 - 50;

e risolvo. :grin:

grazie grazie provo e poi t'informo. :) :)

allora ...

risultato con condens. + modifica celsius = analogRead(inTemp) * 0.4883 - 50; temp = celsius;

STATUS SENSORI

TEMPERATURA = 377.26 C :fearful: :fearful:

CALDO

LUCE = 228

LUCE AGGIORNA SENSORI: CHECK

risultato con solo modifica celsius = analogRead(inTemp) * 0.4883 - 50; temp = celsius; TEMPERATURA = 346.01 C :fearful: :fearful: :fearful:

CALDO

LUCE = 237

LUCE AGGIORNA SENSORI: CHECK

quindi punto a capo. ricontrollerò tutto.

questo e ultimo codice modificato:

int outPin = 9; // pin attuatore
//char link[]="http://www.itisarighi.com/html/home.htm"; //link
String readString; //string
boolean LEDON = false; // flag status attuatore

/*termistore*/ //variabili con sensor MCP9700A
float temp =0; // variabile da calcolare
float volt; // variabile da calcolare sul sensore di temperatura
float inTemp = 1;   // pin analogico IN temperature sensor 
int ledPintemp = 13; // pin led termistore
float tempreg = 25.0; // temperatura di controllo in celsius

 //variabili con sensor TMP 36GZ
  float sensortemp = 0;
  float voltage = 0;
  float celsius = 0;
/*end termistore*/

/*fotoresistore*/ 
int light; // variabile da calcolare
int ledPinlux = 12; // pin led fotoresistenza
int photoresistor = 0; // pin analogico IN fotoresistore

/*end fotoresistore*/

void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(outPin, OUTPUT);
pinMode(ledPinlux, OUTPUT);
Serial.begin(9600);
}

void loop(){

  /*inizio calcolo temperatura*/ //prova con sensor MCP9700A
  // prova 1 dati non validi
  //temp = ((5 * analogRead(inTemp) * 100.0 ) / 1024) - 50; // Codice ottimizzato
  // altra possibilità ( ( 5 * analogRead(PIN) * 100.0  ) /  1024 ) * 0.325;
  
  // prova con sensor temp 36gz
  //sensortemp = analogRead(inTemp); //lettura dei dati nel pin analogico 1 
  //voltage = (sensortemp*5000)/1024; // Conversione in millivolt
 // voltage = voltage-500; //elimino offset
  //celsius = voltage/10; // converto da millivolt a celsius
  //temp = celsius; // assegno il valore alla variabile intemp

  // prova con unico calcolo con sensor temp 36gz aggiunto condens.ceram. 0,5 uF come da datasheet
   celsius =  analogRead(inTemp) * 0.4883 - 50;
   temp = celsius;

sempre grazie.

Prova a includere queste righe e vedi che valori restituisce

  // prova con sensor temp 36gz
  sensortemp = analogRead(inTemp); //lettura dei dati nel pin analogico 1 
  Serial.print("Lettura AnalogRead: ";
  Serial.println(sensortemp);
  voltage = (sensortemp*5000)/1024; // Conversione in millivolt
  Serial.print("Millivolt: ";
  Serial.println(voltage);
  voltage = voltage-500; //elimino offset
  Serial.print("Senza OffSet: ";
  Serial.println(voltage);
  celsius = voltage/10; // converto da millivolt a celsius
 Serial.print("Temperatura: ";
  Serial.println(celsius);
  temp = celsius; // assegno il valore alla variabile intemp

Usando quella formula, la temperatura di 377 C si ottiene col valore di AnalogRead pari a 875 che corrisponde a 4272mV che è fuori specifica perché il sensore dovrebbe erogare massimo 2000mV. Presumo sia guasto.

proverò il tuo consiglio, nel fratempo ho modificato e :

/*fotoresistore*/ 
int light; // variabile da calcolare
int ledPinlux = 12; // pin led fotoresistenza
int photoresistor = 0; // pin analogico IN fotoresistore

/*end fotoresistore*/

void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(outPin, OUTPUT);
pinMode(ledPinlux, OUTPUT);
Serial.begin(9600);
}

void loop(){
  float inTemp = analogRead(1);   // pin analogico IN sensore temperatura 
  
   /*inizio calcolo temperatura*/
   // prova con unico calcolo con sensor temp 36gz. Aggiunto condens.ceram. 0,5 uF come da datasheet
   //celsius =  inTemp * 0.4883 - 50;
   //temp = celsius;
   
   //prova http://tronixstuff.wordpress.com/2010/04/15/getting-started-with-arduino-chapter-two/
   
   voltage = (inTemp*5000)/1024; // convert raw sensor value to millivolts
    voltage = voltage-500;        // remove voltage offset
     celsius = voltage/10;         // convert millivolts to Celsius

  /*fine calcolo temperatura*/

risultato soddisfacente. intanto e saltato fuori il decimale adesso devo capire come mai non legge il dato STATUS SENSORI

TEMPERATURA = 0.00 C :) :) :)

FREDDO

LUCE = 590

LUCE AGGIORNA SENSORI: CHECK

Risultato tuo consiglio:

Lettura AnalogRead: 1023.00 Millivolt: Senza OffSet: 4495.12 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 917.00 Millivolt: Senza OffSet: 3977.54 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 889.00 Millivolt: Senza OffSet: 3840.82 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 919.00 Millivolt: Senza OffSet: 3987.30 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 940.00 Millivolt: Senza OffSet: 4089.84 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 905.00 Millivolt: Senza OffSet: 3918.95 Temperatura: OFF pin 13


ON pin 12


Vista nel browser STATUS SENSORI

TEMPERATURA = 383.59 C

CALDO

LUCE = 574

LUCE AGGIORNA SENSORI: CHECK

preso il tester e controllato circuito ...... tmp36gz non era colegato a massa.

nuovi risultati, tuttooooooo okkkkkkkkkkkkkkkkkkkk (un po altina la temperatura ma va bene) Grazie @ PoloP

Lettura AnalogRead: 156.00 Millivolt: Senza OffSet: 261.72 Temperatura: OFF pin 13


ON pin 12


Lettura AnalogRead: 152.00 Millivolt: Senza OffSet: 242.19 Temperatura: ON pin 13


ON pin 12


Lettura AnalogRead: 153.00 Millivolt: Senza OffSet: 247.07 Temperatura: ON pin 13


ON pin 12


Lettura AnalogRead: 153.00 Millivolt: Senza OffSet: 247.07 Temperatura: ON pin 13


ON pin 12


Lettura AnalogRead: 151.00 Millivolt: Senza OffSet: 237.30 Temperatura: ON pin 13


ON pin 12


Lettura AnalogRead: 153.00 Millivolt: Senza OffSet: 247.07 Temperatura: ON pin 13


ON pin 12


Lettura AnalogRead: 153.00 Millivolt: Senza OffSet: 247.07 Temperatura: ON pin 13


ON pin 12 adesso creo in vb6 un'interfaccia che gestisca tutti questi dati che arrivano.

Prego. ;)

Controlla il codice perché ho dimenticato di chiudere le parentesi tonde dopo il serial.print senza offset e in quello successivo della temperatura.

La Temperatura dovrebbe essere di 24.7 C.

si si avevo visto grazie …

peccato che non ci sia il dabugin in linea col l’IDE di arduino, in modo da controllare il valore delle variabile “al volo”

grazie ancora

se ti va di rispondermi vedi il secondo quesito che chiedevo al primo post, riportato qui sotto.

…vorrei portare il progetto in un stabile dove ce un server amministratore che controlla altre stanze con altri PC server che controllano pc client e che qui VOGLIO COLLEGARE L’ARDUINO. se sino a quà vi è tutto chiaro, vengo alla domanda:
come faccio a impostare IP nell’arduino e nel router?

credo che nell’arduino non si debba toccare niente perche basta ricordarsi ip arduino impostato nello sketch che poi ho usato per aprire porta nel router per farlo entrare.
il problema vero e capire come accedere dall’esterno ad arduino e quindi che ip Riassegno nel sito host che mi ha dato un URL: dell’amministratore principale o dei server pc che anche loro hanno diritti di amministratore sui pc client? …

Per capire questa cosa per cortesia se avete tempo, guardate lo sketck leggete i commenti nel sito del progetto iniziale http://www.giannifavilli.it/blog/arduino-controllo-remoto-http/.
ciao

arduinh3nk3r: ......vorrei portare il progetto in un stabile dove ce un server amministratore che controlla altre stanze con altri PC server che controllano pc client e che qui VOGLIO COLLEGARE L'ARDUINO. se sino a quà vi è tutto chiaro, vengo alla domanda: come faccio a impostare IP nell'arduino e nel router? credo che nell'Arduino non si debba toccare niente perche basta ricordarsi ip arduino impostato nello sketch che poi ho usato per aprire porta nel router per farlo entrare. il problema vero e capire come accedere dall'esterno ad arduino e quindi che ip Riassegno nel sito host che mi ha dato un URL: dell'amministratore principale o dei server pc che anche loro hanno diritti di amministratore sui pc client?

In rete locale è semplice: tramite browser digiti l'indirizzo di arduino e lui ti risponde. Invece, per contattare Arduino da internet devi conoscere l'indirizzo ip del router che effettua il collegamento ad internet e programmarlo affinché rigiri la chiamata all'Arduino. Quindi nel router dovrai impostare l'ip e la porta utilizzati da Arduino che dovranno essere conformi a quelli utilizzati nella rete locale dove lo installi. Sul forum si è discusso della cosa in tanti altri post. fai una ricerca.

lui vuole automagicamente aggiornare l'ip in dydns in modo che sia raggiungibile attraverso un URL. in pratica devi retroingenierizzare il funzionamento di dydns lato PC e simularne il funzionamento via arduino. Se usa ssh (https o altre connessioni sicure) sei fregato :)

Non ho capito se lui è l'amministratore del sistema o no. Nel caso non lo fosse deve chiedere se gli ruotano una porta sull'ip di Arduino (sempre che abbiano un sistema ddns per essere rintracciati via internet). Nel caso lo fosse deve attivare il DDNS e ruotare una porta sul router. Per il DDNS su Arduino c'è: http://www.open-electronics.org/arduino-ddns-dynamic-dns/

grazie delle risposte.... @ PaoloP non sono amministratore della Lan ma non ci sono problemi per farmi dare l'accesso.

@ lesto si vorrei essere raggiungibile attraverso un URL, ma spero che la procedura di PaoloP di farmi ruotare una porta sull'IP di arduino sia solo una procedura di assegnazione e non di modifica con aggiunta di hardware. certo è che dovro cambiare IP arduino e internet e sub mask nello sketch perche cambia la rete e quindi:

byte mac[] = { 0x??, 0x??, 0x??, 0x??, 0x??, 0x?? }; // mac Arduino byte ip[] = { 192, 168, 0, 245 }; // ip arduino internet byte gateway[] = { 192, 168, 0, 1 }; // internet access via router byte subnet[] = { 255, 255, 255, 255 }; //subnet mask Server server(80); // porta del server

e poi impostare il servizio dydns in rete in modo che reindirizzi al nuovo ip della nuova Lan del mio lavoro.

spero sia come penso.