vineri, 21 ianuarie 2011

Senzor de temperatura si lumina

Va voi prezenta cum puteti realiza un termometru digital cu mai multe functii.
Pentru asta folosesc:
  • sensor de temperature LM35Z
  • sensor de lumina( facut dintro fotorezistenta si un potentiometru)
  • LCD Serial 16x2
  • LED
  • Switch
  • Arduino Duemilanove
Pe LCD va fi afisata temperature in grade C pe primul rand si valoarea senzorului de lumina pe randul doi. Cand switch-ul este actionat, pe LCD va aparea temperature in grade C (pe linia de sus in stanga), temperature in grade F (pe randul de sus in dreapta), temperature maxima inregistrata( pe randul doi in stanga) si temperature minima inregistrata (pe randul doi dreapta).
Cand valoarea senzorului de lumina scade sub o anumita valoare se aprinde un LED.
Acest proiect poate fi imbunatatit, eu ofer un exemplu, de aici puteti ajunge oriunde; lasati imaginatia sa zboare:P .
(Afisarea datelor pe un ecran LCD Serial sper sa o intelegeti din explicatiile codului, daca nu lasati un comentariu si o sa postez afisarea datelor pe un LCD Serial cu Arduino Duemilanove)
Mai jos o sa scriu codul apoi voi posta un video.
COD:
/*
Este o aplicatie care foloseste un senzor de temperatura LM35Z, un senzor de lumina (alcatuit dintr-o fotorezistenta si un potentiometru), un intrerupator, un led si un LCDSerial. Aceasta aplicatie este deschisa imbunatatirii.
*/
#include // headeru-l interfetei serial pentru lcd
int tpin = 0; // declarare pin analog 2
int lpin = 1; // declarare pin analog 1
int tempc = 0, tempf = 0; // variabile pentru temperatura
int samples [ 8 ]; // variabila pentru a face o precizare mai buna a temperaturii
int maxi = - 100 , mini = 100; // temperatura maxima/minima
int i; // declarare i
int LED = 12; // declarare pin digital 12
boolean s = 4; // declarare pin digital 4
#define rxPin 2 // definire pin digital 2 pe Rx pentru a nu fi nevoit sa scot pinul cand upload-ez codlu
#define txPin 3 // definire pin digital 3 Tx --||--
SoftwareSerial LCD = SoftwareSerial(rxPin, txPin); // definire pinii Rx si Tx pentru interfata serial a lcd-ului
void setup ( ) // functia in care se stabileste ce rol are fiecare pin
{
pinMode(rxPin, INPUT); // stabileste pin-ul 2 ca intrare (nu este folosit, poate sa lipseasca din program si din aplicatie)
pinMode(txPin, OUTPUT); // stabileste pin-ul 3 ca iesire (este necesar afisarii lcd-ului
pinMode(s, INPUT); // stabileste pin-ul 4 ca intrare
pinMode(LED, OUTPUT); // stabileste pin-ul 12 ca iesire
LCD.begin(9600); // porneste comunicarea prin serial
}
void loop ( ) // corpul functiei
{
led();
for ( i = 0 ; i <= 7 ; i ++ ) // ia 8 valori de temperatura
{
samples [ i ] = (( 4.68 * analogRead( tpin ) * 70.6 ) / 1023.0); // temperatura = (voltajul senzorului * voltajul de intrare din senzor * valoarea echivalenta in milivolti a temperaturii) / 1023 de pasi
tempc = tempc + samples [ i ]; // variabila temperaturii tempc ia valoarea temperaturii calculata mai sus
delay ( 100 ); // asteapta 1 minut
}
tempc = tempc / 8.0; // se imparte la 8 pentru o precizie mai buna
tempf = ( tempc * 9 ) / 5 + 32; // transforma in fahrenheit
if ( tempc > maxi ) { maxi = tempc; } // seteaza temperatura maxima inregistrata
if ( tempc < mini) {mini= tempc;}
if (digitalRead(s)==LOW) // daca valoarea lui "s" este low
{
LCD.print("$CLEAR\n\r"); // sterge lcd-ul
LCD.print("$GO 1 1\n\r"); // muta cursorul pe randul 1 caracterul 1
LCD.print("$PRINT "); // afiseaza
LCD.print ( tempc ); // valoarea afisata
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 4\n\r"); // muta cursorul pe randul 1 caracterul 4
LCD.print("$PRINT C \n\r"); // afiseaza C (grade celsius)
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 8\n\r"); // muta cursorul pe randul 1 caracterul 8
LCD.print("$PRINT "); // afiseaza
LCD.print ( tempf ); // valoarea afisata
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 1 12\n\r"); // muta cursorul pe randul 1 caracterul 12
LCD.print("$PRINT F \n\r"); // afiseaza F
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 1\n\r"); // muta cursorul pe randul 2 caracterul 1
LCD.print("$PRINT "); // afiseaza maximul inregistrat in grade celsius
LCD.print ( maxi ); // afiseaza valoarea
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 4\n\r"); // muta cursorul pe randul 2 caracterul 4
LCD.print("$PRINT MAX \n\r"); // afiseaza MAX
LCD.print("\n\r"); // incheie randul
LCD.print("$GO 2 8\n\r");
LCD.print("$PRINT ");
LCD.print ( mini );
LCD.print("\n\r");
LCD.print("$GO 2 12\n\r");
LCD.print("$PRINT MIN \n\r");
LCD.print("\n\r");
delay ( 100 ); // intraziera pentru corpul functiei
}
else // daca valoarea lui "s" este high
{
LCD.print("$CLEAR\n\r");
LCD.print("$GO 1 1\n\r");
LCD.print("$PRINT ");
LCD.print ( tempc );
LCD.print("\n\r");
LCD.print("$GO 1 4\n\r");
LCD.print("$PRINT C \n\r");
LCD.print("\n\r");
LCD.print("$GO 2 1\n\r"); // muta cursorul pe randul 2 caracterul 1
LCD.print("$PRINT "); // afiseaza
LCD.print (analogRead(lpin) ); // valoarea citita la pinul analog 1
LCD.print("\n\r");
LCD.print("$GO 2 4\n\r");
LCD.print("$PRINT Candeli \n\r");
LCD.print("\n\r");
delay(100); // intarzie pentru corpul functiei
}
}
void led()
{
if (analogRead(lpin)<80) // daca valoarea citita la pinul analog 1 este mai mica de 80
digitalWrite(LED, HIGH); // aprinde ledu-ul
else //altfel
digitalWrite(LED, LOW); // stinge led-ul
}


Niciun comentariu:

Trimiteți un comentariu