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?
#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
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
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 ????
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
// 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:
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.
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? ............
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.