ragazzi, avrei pensato di costruire un piccolo termometro con dei led.
sono 6 per un intervallo di misurazione 0°/30°, per adesso uso un termistore, poi passerò all'lm35.
visto che il range di misurazione viene letto dall'ingresso analogico in un intervallo di 0/1023, volevo sapere che formula usare per calcolare la variabile e che range di lettura (es. 100/200; 200/100) usare per far illuminare più o meno led (ovviamente ogni led significano 5 gradi)
grazie mille e scusatemi il problemone gigante
usando un LM35 collegato al pin2 analogico la formula per ottenere la temperatura è:
temp= (analogRead(pin2)5.0100.0)/1024.0;
una volta calcolato temp la usi in blocchi condizionali in cascata per illuminare i tuoi 6 led a seconda del valore di temp ad esempio:
if(temp<0) //nessun led acceso
else if(temp<5) //primo led acceso
else if(temp<10) //secondo led acceso
else if(temp<15) //terzo led acceso
... e così via!
potrebbe funzionare con il termistore?
assolutamente si... sai già usarlo?
allora..cercando nei meandri della memoria del pc, ho trovato questo vecchio codice e ho pensato di riadattarlo..visto che sembra fatto apposta. mancano solo i valori delle variabili..visto che il termistore mi restituisce dei valori..alti (es temperatura 22° termistore= 33x per esempio)
comunque ecco il codice ..magari riesco a tirarci fuori qualcosa
int sensorPin = 0;
int sensorValue = 0;
int LED = 8;
int LED2 = 9;
int LED3 = 10;
int val = 0;
int LED4 = 11 ;
int LED5 = 12 ;
int LED6 = 13;
void setup() {
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
}
void loop() {
val= (analogRead(sensorPin)5.0100.0)/1024.0;
{
}
if (val >= && val <= ); {
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= && val <= ){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= && val <= ){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= && val <= ){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= && val <= ){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, LOW);
}
if (val >= && val <= ){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, HIGH);
}
Serial.begin(9600);
val = (analogRead(sensorPin)5.0100.0)/1024.0;
Serial.println(val);
}
ps: se non ricordo male lo usavo per leggere i valori di una fotoresistenza..che si non era "calibrata" ma indicativamente funzionava
si potrebbe andare.
ti consiglio questi articoli:
http://www.arduino.cc/playground/ComponentLib/Thermistor
http://www.stefanomanni.it/arduino/2008/12/17/thermometer/
il secondo è mio. Entrambi ti dicono come usare un termistore.
grazie mille..vedremo cosa ne uscirà fuori
int sensorPin = 0;
int sensorValue = 0;
int LED = 8;
int LED2 = 9;
int LED3 = 10;
int val = 0;
int LED4 = 11 ;
int LED5 = 12 ;
int LED6 = 13;
void setup() {
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
}
void loop() {
val = (analogRead(sensorPin)5.0100.0)/1024.0;
{
}
if (val >= 0 && val <= 91); {
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= 91 && val <= 182){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= 182 && val <= 273){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= 273 && val <= 364){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
if (val >= 364 && val <= 455){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, LOW);
}
if (val >= 455 && val <= 550){
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, HIGH);
}
Serial.begin(9600); // open the serial port to send
// data back to the computer at
// 9600 bits per second
val = (analogRead(sensorPin)5.0100.0)/1024.0;
// read the value from
// the sensor
Serial.println(val); // print the value to
// the serial port
delay(100); // wait 100ms between
// each send
}
questo sarebbe il codice completo..proviamo a vedere^^
così a colpo d'occhio (non ho controllato il codice):
- Serial.begin(9600) di solito si mette nel setup, così la comunicazione seriale rimane sempre attiva
- gli dai due volte la stessa istruzione
val = (analogRead(sensorPin)5.0100.0)/1024.0;
che non serve, poi val è dichiarata di tipo intero....non serve dividere e moltiplicarla per costanti con la virgola.
vero..ma se no non mi accettava la comunicazione se testavo il codice :-/
a meno che non usi l'LM35 è inutile che ci metti quel:
val = (analogRead(sensorPin)5.0100.0)/1024.0;
domani dovrebbe arrivarmi l'lm35..vedremo come andrà, comunque, grazie di tutto
Dopo un po' di assenza rieccomi qua.
Volevo fare qualche esperimento col termistore, quello dello starter kit per capirci.
Collegato come da playground sul pin analogico 0, per il primo test ho usato questa istruzione per leggere la temperatura:
val = (analogRead(sensorPin)5100)/1024;
Da quello che ho capito leggendo nel thread dovrebbe funzionare, ma il valore che visualizzo sulla seriale appena avvio la comunicazione è 29-30, nella stanza dove mi trovo fa caldo, e ci sono molte apparecchiature elettroniche che scaldano, ma 30° mi sembrano troppi, se poi avvicino troppo una fonte di calore i numeri visualizzati diventano addirittura negativi, sicuramente sto sbagliando qualcosa o le misurazioni del termistore non sono così precise? c'è modo di avere valori più simili alla realtà?
p.s. copiando lo sketch:
http://www.arduino.cc/playground/ComponentLib/Thermistor
ho valori a tre cifre tipo 45X - 44X evidentemente errati.
Grazie in anticipo e scusate la banalità.
F.
Beh se stampi su seriale direttamente "analogRead(sesorPin)" e ottieni valori intorno al 450 vuol dire che la temperatura che sta misurando è intorno ai 20°C (nel commento all'inizio dello sketch c'è appunto la tabella di confronto tra valori ADC e temperature).
ciao Francesco_MIRM
IL termistore che usi non é calibrato, significa che non sai che resistenza ha a certe temperature.
Misura la resistenza del Termistore. Il programma é scritto per uno da 10kOhm (a 20 gradi Centigradi).
I termistori possono essere con un coeficente positivo chiamati PTC (positive temperature coeficent) che aumentano la resistenza con la temperatura oppure con un coeficente negativo NTC (negative temperature coeficent) che diminuiscono la resistenza con la temperatura.
Inverti la posizione della resistenza e del termistore: metti il termistore tra pin del Arduino e massa e la resistenza tra Pin e polo positivo del alimentazione.
Poi misura delle temperature conosciute (acqua-giaccio ha 0 gradi) e acqua a diverse temperature, facendo riferimento a un altro termometro.
Cosí trovi la correspondenza della resistenza con la temperatura.
In modo aprossimativo puoi calcolarti una retta e con quella retta traduci il valore letto in tensione con la temperatura.
Ciao Uwe
prova ad usare dei Ds18b20 o simili...
secondo me rimani soddisfatto..