Un seplice esercizio per prendere confidenza con Arduino UNO. Lo scopo: far accendere i LED in base ad una soglia di temperatura misurata dal sensore e farci restituire il valore in Celsius sulla porta seriale. Necessario, oltre la solita breadboard e cavetteria di vario genere:
- 1 sensore di temperatura LM35
- 2 resistenze 220 Ohm
- 2 LED
Per scrivere lo sketch è possibile utilizzare l'IDE di Arduino (IDE - Arduino.cc) oppure scrivere e compilare tramite Emacs configurandolo come spiegato nei post precedenti. In entrambi i casi, si consiglia di utilizzare l'estensione .ino del file poiché dalla versione 1.0 è diventato lo standard per gli sketch di Arduino (Arduino 1.0 - ReleaseNotes).
La parte più sottile di tutto è la conversione del segnale ricevuto dal sensore LM35 in unità leggibili.
Se il pin Vin viene collegato alla tensione di 5V sulla scheda Arduino UNO allora la tensione in out Vout:
Tensione al pin [mV] = (valore letto dal ADC) * (5000/1024)
Pertanto, la temperatura sarà data:
T [°C] = (Tensione al pin [mV] - 500)/10
Il semplice schema circuitale che ho utilizzato e il codice per lo sketch di Arduino*:
/*
An open-source LM35DZ Temperature Sensor for Arduino. This project will be enhanced on a regular basis and based on work that is (cc) Daniel Spillere Andrade implementation.
(cc) Andrea Cirillo
*/
int pin = 0; // analog pin
float tempc = 0,tempf=0; // temperature variables
float samples[8]; // variables to make a better precision
int maxi = -100, mini = 100; // to start max/min temperature
int i;
//LED
const int G_LED = 9;
const int Y_LED = 10;
void setup()
{
Serial.begin(9600); // start serial communication
//LED
pinMode(G_LED, OUTPUT);
pinMode(Y_LED, OUTPUT);
}
void loop()
{
for(i = 0; i<8; i++){ // gets 8 samples of temperature
samples[i] = analogRead(pin) * (500.0 / 1024.0);
tempc = tempc + samples[i];
delay(100);
}
tempc = tempc/8.0; // better precision
if(tempc > maxi) {
maxi = tempc;
} // set max temperature
if(tempc < mini) {
mini = tempc;
} // set min temperature
//LED
if(analogRead(pin)<41){
analogWrite(G_LED, 255);
analogWrite(Y_LED, 0);
}
else {
analogWrite(G_LED, 0);
analogWrite(Y_LED, 255);
}
Serial.print(tempc,DEC);
Serial.print(" Celsius, ");
Serial.print(maxi,DEC);
Serial.print(" Max, ");
Serial.print(mini,DEC);
Serial.println(" Min");
Serial.print(" Analog Output = ");
Serial.println(analogRead(pin),DEC);
Serial.println("==============================");
tempc = 0;
delay(1000); // delay before loop
}
*Qualunque suggerimento o miglioria sono ovviamente più che apprezzati.
[Fonte:
http://www.ladyada.net/learn/sensors/tmp36.html]