Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« on: April 27, 2012, 03:59:13 pm » |
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  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:  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. 
|
|
|
|
« Last Edit: April 27, 2012, 04:01:05 pm by arduinh3nk3r »
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15729
+39 349 2158303
|
 |
« Reply #1 on: April 27, 2012, 04:28:59 pm » |
Dacci per favore tutto il codice. Temo che sia un overflow di una variabile dichiarata troppo piccola ( int al posto di long) Ciao Uwe
|
|
|
|
« Last Edit: April 28, 2012, 03:01:14 am by uwefed »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #2 on: April 27, 2012, 05:08:40 pm » |
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 <br /></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("<br /></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("<br />"); //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
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3019
|
 |
« Reply #3 on: April 27, 2012, 05:26:48 pm » |
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. 
|
|
|
|
« Last Edit: April 27, 2012, 06:39:25 pm by PaoloP »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #4 on: April 27, 2012, 06:35:22 pm » |
intanto grazie delle risposte... in questo pdf http://physics.gallaudet.edu/rov/Temperature_sensor_tutorial_temp36.pdfviene 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 ????  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
|
|
|
|
« Last Edit: April 27, 2012, 06:40:08 pm by arduinh3nk3r »
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3019
|
 |
« Reply #5 on: April 27, 2012, 06:39:45 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #6 on: April 27, 2012, 06:41:09 pm » |
ho modificato testo di prima vedi appena sopra ..
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3019
|
 |
« Reply #7 on: April 27, 2012, 06:48:37 pm » |
// 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. 
|
|
|
|
« Last Edit: April 27, 2012, 06:50:46 pm by PaoloP »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #8 on: April 28, 2012, 09:47:26 am » |
grazie grazie provo e poi t'informo. 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #9 on: April 28, 2012, 10:15:30 am » |
allora ... risultato con condens. + modifica celsius = analogRead(inTemp) * 0.4883 - 50; temp = celsius; STATUS SENSORI TEMPERATURA = 377.26 C  CALDO LUCE = 228 LUCE AGGIORNA SENSORI: CHECK risultato con solo modifica celsius = analogRead(inTemp) * 0.4883 - 50; temp = celsius; TEMPERATURA = 346.01 C  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.
|
|
|
|
« Last Edit: April 28, 2012, 10:40:06 am by arduinh3nk3r »
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3019
|
 |
« Reply #10 on: April 29, 2012, 06:44:26 am » |
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.
|
|
|
|
« Last Edit: April 29, 2012, 07:07:13 am by PaoloP »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #11 on: April 29, 2012, 12:16:36 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #12 on: April 30, 2012, 08:00:46 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #13 on: April 30, 2012, 08:15:17 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3019
|
 |
« Reply #14 on: April 30, 2012, 08:29:27 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
|