Indicatore di temperatura con Arduino
Ho iniziato a sperimentare con Arduino realizzando un indicatore di temperatura con indicazione analogica.
Il circuito usa come sensore di temperatura un LM35 e come indicatore visivo di temperatura un servo per modellismo HXT500 che muove una lancetta.
Questo è il circuito di prova:e un dettaglio del servo:Per chi volesse realizzarlo, questo è lo schema di collegamento:con la pedinatura dell'LM35 e i collegamenti del servo:L'LM35 puo leggere temperature che vanno da -55 + 150 °C (gradi centigradi) e fornisce in uscita un segnale analogico proporzionale alla temperatura senza necessità di calibrazione. La sensibilità è di 10mV/°C ovvero ogni grado provoca una variazione di 10mV.
Come si vede in figura:
Il servo ha questi collegamenti:
Il servo è collegato all'Arduino sul pin 9, la prima uscita digitale che può funzionare anche in PWM (Pulse Width Modulation). Con questa tecnica si genera un segnale a onda quadra con frequenza costante dove la posizione del servo è controllata dal duty cicle ovvero il rapporto tra il periodo in cui l'onda è alta (+5V) rispetto a quando è Bassa (0V). Un duty cicle del 50% posiziona il servo al centro.
Per programmare l'Arduino per questo esempio è necessario scaricare l'editor dal sito e caricare questo codice:
Attivando il serial monitor è possibile vedere i valori di temperatura e posizione del servo:
Alcune info sull'LM35 le ho prese da questo sito http://www.adrirobot.it/sensori/lm35...no_lm35.htm.
Il circuito usa come sensore di temperatura un LM35 e come indicatore visivo di temperatura un servo per modellismo HXT500 che muove una lancetta.
Questo è il circuito di prova:e un dettaglio del servo:Per chi volesse realizzarlo, questo è lo schema di collegamento:con la pedinatura dell'LM35 e i collegamenti del servo:L'LM35 puo leggere temperature che vanno da -55 + 150 °C (gradi centigradi) e fornisce in uscita un segnale analogico proporzionale alla temperatura senza necessità di calibrazione. La sensibilità è di 10mV/°C ovvero ogni grado provoca una variazione di 10mV.
Come si vede in figura:
- il pin 1 va collegato ai +5V
- il pin 2 è l'uscita del segnale analogico
- il pin 3 è la massa (GND)
Il servo ha questi collegamenti:
- Cavo rosso alimentazione +5V
- Cavo arancione ingresso segnale PWM
- Cavo marrone massa (GND)
Il servo è collegato all'Arduino sul pin 9, la prima uscita digitale che può funzionare anche in PWM (Pulse Width Modulation). Con questa tecnica si genera un segnale a onda quadra con frequenza costante dove la posizione del servo è controllata dal duty cicle ovvero il rapporto tra il periodo in cui l'onda è alta (+5V) rispetto a quando è Bassa (0V). Un duty cicle del 50% posiziona il servo al centro.
Per programmare l'Arduino per questo esempio è necessario scaricare l'editor dal sito e caricare questo codice:
Arduino
// Legge la temperatura da un LM 35
// e la converte in un angolo del servo
// by Sgart.it
// http://www.sgart.it
#include <Servo.h>
/* definizione variabili */
Servo myservo; // creo l'oggetto servo
const int pinLM35 = 1; // pin analogico dove è collegato LM35
const int pinServo = 9; // pin uscita digitale per il servo (PWM)
const float vref = 1.1; // valore di riferimento per la lettura dell'LM35
//valori di temperatura minimo e massimo gestiti
const float tempMin = -10.0;
const float tempMax = 50.0;
// valori minimo e massimo in gradi relative escursione del servo
const int servoMin = 165;
const int servoMax = -30;
float tempPrec = -100; // memorizzo la lettura precedente
const float tempOffset = 0.2; // variazione minima prima di aggiornare il valore (evito pendolamenti)
void setup() {
analogReference( INTERNAL ); // per la conversione analogica digitale (ADC) uso il riferimento di tensione interno 1.1V
analogRead( pinLM35 ); // lettura a vuoto x assestamento
myservo.attach(pinServo); // aggancio l'oggetto servo sul pin 9
Serial.begin(9600); // imposto la seriale che userò per stampare i valori letti
}
void loop() {
Serial.println(""); // nuova linea
float temp = readTemp(); // leggo la temperatura
//temp= 20; // decommentare per tarare il circuito in base alle variabili servoMin e servoMax (provare vari valori)
temp = constrain(temp, tempMin, tempMax); // limito la temperatura ai valori min e max
int pos = map(temp, tempMin, tempMax, servoMin, servoMax); // converto la temperatura nella posizione del servo
myservo.write(pos); // aggiorno la posizione del servo
Serial.print("Pos: "); Serial.print(pos);
// aspetto che il servo vada in posizione (basterebbe un valore 15)
// essendo la temperatura una grandezza che non varia velocemente posso mettere un valore più elevato
delay(500);
}
// legge la temperatura
float readTemp() {
int val = analogRead(pinLM35); // legge il dato dall'LM35 [0÷1023]
float temp = ( 100.0 * vref * val ) / 1024.0; // lo converte in °C
Serial.print("Temp: "); Serial.print(temp); Serial.print(", ");
//per evitare pendolamenti faccio in modo che la temperatura vari solo se esce dalla finestra impostata (tempOffset)
if (temp > (tempPrec + tempOffset) || temp < (tempPrec - tempOffset)) {
tempPrec = temp;
}
Serial.print("TempPrec: "); Serial.print(tempPrec); Serial.print(", ");
return tempPrec;
}
Il servo dovrebbe avere una escursione di 180° ma in realtà ne ha molto meno. Per compensare questa limitazione ho introdotto le variabili servoMin e servoMax che vanno tarate in base al modello di servo
Attivando il serial monitor è possibile vedere i valori di temperatura e posizione del servo:
Alcune info sull'LM35 le ho prese da questo sito http://www.adrirobot.it/sensori/lm35...no_lm35.htm.