ARDUINO: Misuratore di temperatura e luminosità con display LCD

In questo progetto creeremo un dispositivo in grado di misurare la temperatura ambientale e la luce presente in un determinato luogo tramite due componenti fondamentali come il termistore e una fotoresistenza
 
I componenti necessari per la realizzazione del circuito sono:
  • Arduino (va bene qualsiasi versione)
  • Display LCD (Io ho usato il 16×2 ma va bene qualsiasi dimensione)
  • 2 Trimmer per la regolazione del contrasto e della luminosità del display
  • 2 LED
  • 2 Resistenze da 220 ohm
  • 1 Termistore da 5 kohm o da  10 kohm
  • 1 Fotoresistenza
  • 2 Resistenze da 4.7 Kohm (Giallo, Viola e Rosso)
  • 2 Resistenza da 10Kohm
  • Cavetteria

Per misurare la temperatura utilizzeremo un termistore da 10 o 5 kohm. Il termistore è una resistenza che varia in funzione della temperatura. In questo tutorial utilizzerò un termistore da 5k. Creiamo dunque un partitore di tensione con una resistenze da 4.7 kohm e il termistore Rt (se utilizzate un termistore da 10k bisogna creare il partitore di tensione con una resistenza da 10 kohm). La Vout come vediamo nello schema circuitale è dato da Vout=Vcc*R1/(R1+Rt) dove Vcc=5 V quindi mandiamo la Vout in un pin analogico di Arduino che la misura attraverso la funzione analogRead. Facendo un rapido calcolo si può stimare il valore della resistenza Rt, Infine utilizzando la formula di equazione di Steinhart-Hart che trovate su http://it.wikipedia.org/wiki/Termistore possiamo stimare la temperatura e farla stampare sul display. Mentre per misurare la luce presente nell’ambiente utilizzeremo una fotoresistenza. Così come abbiamo fatto con il termistore anche per misurare la luce creeremo un partitore di tensione con una resistenza da 10 kohm e la fotoresistenza.

Schema elettrico con Display LCD

Sketch Arduino

#include <LiquidCrystal.h>
#include <math.h>
#define LED1 8
#define LED2 9

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

int pin = A0;
int luce = A1;
double ValoreLuce;
double v;     // variabile adc tra 0 e 1023
double volt;  // variabile voltaggio reale tra 0V e 5V
double Rt;    // variabile resistenza del termistore
double R1 = 4700; // valore resistenza in ohm che abbiamo messo noi (sia per termistore da 5 che da 10 k)
double temp;  // variabile di temperatura espressa in Kelvin
double Temperatura;
int stato = 0;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  lcd.begin(16, 2);
}

void loop() {
  ValoreLuce = analogRead(luce);
  v = analogRead(pin);  // leggiamo il valore della tensione ai capi di R1
  volt = 5 * v / 1023;  // riportiamo la tensine tra 0V e 5V con una proporzione
  Rt = R1 * (5 / volt - 1); // ricaviamo la resistenza del termistore
  temp = 1 / (0.001319 + (0.000234125 * log(Rt)) + (0.0000000876741 * log(Rt) * log(Rt) * log(Rt))); // calcoliamo la temperatura con la formula di Steinhart-Hart
  Temperatura = temp - 273.15; // convertiamo in gradi Chelsius
  
  lcd.setCursor(0, 0);
  lcd.print("Luce: ");
  
  if (ValoreLuce <= 150) {
    digitalWrite(LED1, HIGH);
    lcd.print("Poca ");
  }

  if (ValoreLuce > 150 && ValoreLuce <= 700) {
    digitalWrite(LED1, LOW);
    lcd.print("Normale");
  }

  if (ValoreLuce > 700) {
    digitalWrite(LED1, LOW);
    lcd.print("Molta ");
  }

  if (Temperatura > 30) {
    digitalWrite(LED2, HIGH);
  }

  if (Temperatura < 30) {
    digitalWrite(LED2, LOW);
  }

  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print(Temperatura);
  
  delay(1000); //ritardo loop di un secondo
}

Schema elettrico con Monitor Seriale

Sketch Arduino

#include <math.h>
#define LED1 8
#define LED2 9

int pin = A0;
int luce = A1;
double ValoreLuce;
double v;     // variabile adc tra 0 e 1023
double volt;  // variabile voltaggio reale tra 0V e 5V
double Rt;    // variabile resistenza del termistore
double R1 = 4700; // valore resistenza in ohm che abbiamo messo noi (sia per termistore da 5 che da 10 k)
double temp;  // variabile di temperatura espressa in Kelvin
double Temperatura;
int stato = 0;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  ValoreLuce = analogRead(luce);
  v = analogRead(pin);  // leggiamo il valore della tensione ai capi di R1
  volt = 5 * v / 1023;  // riportiamo la tensine tra 0V e 5V con una proporzione
  Rt = R1 * (5 / volt - 1); // ricaviamo la resistenza del termistore
  temp = 1 / (0.001319 + (0.000234125 * log(Rt)) + (0.0000000876741 * log(Rt) * log(Rt) * log(Rt))); // calcoliamo la temperatura con la formula di Steinhart-Hart
  Temperatura = temp - 273.15; // convertiamo in gradi Chelsius

  Serial.print("Luce: ");

  if (ValoreLuce <= 150) {
    digitalWrite(LED1, HIGH);
    Serial.println("Poca ");
  }

  if (ValoreLuce > 150 && ValoreLuce <= 700) {
    digitalWrite(LED1, LOW);
    Serial.println("Normale");
  }

  if (ValoreLuce > 700) {
    digitalWrite(LED1, LOW);
    Serial.println("Molta ");
  }

  if (Temperatura > 30) {
    digitalWrite(LED2, HIGH);
  }

  if (Temperatura < 30) {
    digitalWrite(LED2, LOW);
  }

  Serial.print("Temp: ");
  Serial.println(Temperatura);

  delay(1000); //ritardo loop di un secondo
}

Video

Come potete vedere dal video quando la luce è poca il led verde si accende, invece se la luce è normale o molta il led rimane spento. Per quanto riguarda la temperatura ho fatto in modo che il led rosso si accendesse nel caso in cui essa raggiunga i 30°C o più, mentre se la temperatura è <30°C il led rimane spento.