Documente Academic
Documente Profesional
Documente Cultură
PROIECT MICROCONTROLERE
Montaj de tip termometru cu Atmega328p
Autori: Indrumator:
Bucuresti,2015
P a g e 1 | 12
CUPRINS :
1. Descrierea proiectului
2. Proiectare hardware
3. Proiectare software
4. Bibliografie
P a g e 2 | 12
1.Descrierea proiectului
Aplicatie care citeste temperatura folosind LM50. Se va genera semnal PWM controlat de valoare
temperaturii.Utilizatorul poate selecta doua frecvente pentru semnalul PWM.Pe LCD se va afisa
temperatura si factorul de umplere.
Folosim placa de dezvoltare ARDUINO UNO, cu microcontroler Atmega328p, senzor BRICK temperatura
care are in componenta un circuit integrat LM50, doua butoane, un led de culoare alba si un diplay
2x16.
Ca aplicatii practice se poate masura temperatura din interiorul carcasei unui PC, acest montaj poate
comanda un cooler pentru racirea eficienta a PC-ului.
2.Proiectare hardware
2.1.Schema bloc si prezentarea generala a modulelor
ATmega328p LCD
LM50
2X16
CLK
PUSH LED
16MHz PUSH
BUTTON BUTTON
ATMega 328P este un microcontroller RISC pe 8 biti realizat de firma Atmel(acesta are 28 pini
I/0).Principalele caracteristici ale acestuia sunt:
ATMega 328p contine 32 de register de uz general si 64 de register special pentru modulele I/O.
ATMega 328p dispune de 21 surse de intrerupere.Atunci cand una dintre ele devine active se suspenda
cursul normal de executie si se face salt automat la o adresa prestabilita din memoria program.
P a g e 4 | 12
LM50 este un circuit integrat de precizie cu functie de senzor de temperatura, ce poate inregistra valori
intre -40 pana la 125°C folosind o singura sursa de alimentare pozitiva.
Este impartit in 2 randuri, realizate din 16 campuri de caractere.Fiecare camp are o matrice de pixeli
tip (7x5).
Lista componente:
2 push butoane
3 rezistente(2x220 si una de 1k)
Microcontroller ATmega 328p
Quartz 16MHz
2 condensatoare (22pF)
2 porti inversoare
Sensor de temperature LM50
Un led
Un potentiometru de 10k
Un lcd 2x16
P a g e 5 | 12
2.3 Circuitul imprimat:
P a g e 6 | 12
3.0 Proiectare software
START
Setare porturi
Setare timer 2
Afiseaza LCD
Citeste
Da Seteaza frecventa
temperatura Se apasat
30,64Hz
buton 1?
Nu
Daca temp.
este sub
temp. min. Se apasa Da Seteaza frecventa
buton 2? 490,20Hz
Nu
Temp. Curenta este
egala cu Temp.
minima
Afiseaza LCD
Calculeaza
PWM
Genereaza tens.
Daca temp. Pin11
este peste Temp. Curenta
temp. max. este egala cu
Temp. maxima
P a g e 7 | 12
Mod de functionare:
Se citeste o tensiune de pe pinul 0, si cu ajutorul unui algoritm calculeaza temperatura in grade celsius.
Temperatura minima este 25°C iar cea maxima este 48°C.Daca se inregistreaza o temperatura mai mica
decat 25°C in calculul factorului de umplere se va folosi tot 25°C, in timp ce temperatura afisata pe
display va fi cea inregistrata; daca se inregistreaza o temperatura mai mare de 48°C in calculul factorului
de umplere se va folosi tot valoarea de 48°C, in timp ce pe display se va afisa temperatura inregistrata.
Pinul 11 este un pin pe care se poate genera un semnal PWM. In prima faza generam o tensiune
proportionala cu factorul de umplere avand posibilitatea de a schimba frecventa cu ajutorul celor doua
push butoane.
Cele doua push butoane sunt citite ca un pin de intrare. Se citeste butonul, daca valoarea este 0, seteaza
frecventa 30.64Hz. Pentru citirea celuilalt buton se face identic.
#include<LiquidCrystal.h>
LiquidCrystal lcd(12,10,5,4,3,2);
float Fan1Min = 0;
int button1State=0;
int button2State=0;
void setup()
{ pinMode(button1Pin, INPUT);
digitalWrite(button1Pin, HIGH);
P a g e 8 | 12
pinMode(button2Pin, INPUT);
digitalWrite(button2Pin, HIGH);
pinMode(9, OUTPUT);
lcd.begin(16,2);
setPwmFrequency(11, 1);
void loop()
lcd.setCursor(2,1);
lcd.print("Temp: ");
lcd.print ( citesteTempInCelsius());
lcd.setCursor(14,1);
lcd.print( "C");
button1State = digitalRead(button1Pin);
if (button1State ==LOW) {
setPwmFrequency(11,1024);
} button2State = digitalRead(button2Pin);
if (button2State ==LOW) {
setPwmFrequency(11,64);
float T =citesteTempInCelsius();
if (T < TempMin)
T = TempMin;
if (T > TempMax)
T= TempMax;
lcd.print ( Pwm );
lcd.setCursor(14,0);
lcd.print( "%" );
analogWrite(pinA,Pwm );
delay(1500);
float citesteTempInCelsius(){
float temperaturaMediata=0;
float sumaTemperatura;
for(int i=0;i<10;i++){
voltage/=1024.0;
sumaTemperatura=sumaTemperatura+temperatureCelsius;
return sumaTemperatura/10;}
{byte mode;
switch(divisor) {
if(pin == 5 || pin == 6) {
else {
switch(divisor) {
default: return;
P a g e 11 | 12
4.Bibliografie:
www.alldatasheet.com
www.atmel.com
https://www.arduino.cc/en/Tutorial/HelloWorld
http://playground.arduino.cc/Main/TimerPWMCheatsheet
http://playground.arduino.cc/Code/PwmFrequency
https://www.arduino.cc/en/Tutorial/Button
http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
P a g e 12 | 12