Arduino sketchbook #1


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]