Proiectul ales consta in construirea unui sistem de gestiune a temperaturii dintr-o incapere, utilizand platforma Arduino. Scopul acestuia este de a controla in mod automat viteza de rotatie a unui motor folosit pe post de ventilator astfel incat temperatura din incapere sa ajunga la valoarea dorita de catre utilizator. Am dezvoltat acest sistem pornind de la ideea intreuintarilor lui practice in industria auto.
Modul de functionare a automatului va fi urmatorul:
Componentele alese pentru crearea sistemului sunt:
Mediu de dezvoltare: Arduino IDE
Functionalitatea programului
setup()
In functia setup() se citeste temperatura curenta si se afiseaza pe ecranul LCD. Se configureaza Timer0 pentru a genera intreruperi periodice prin care se va controla viteza motorului In consecinta am setat modul de functionare CTC, am stabilit valoarea de comparare a registrului OCR0A pentru a specifica intervalul intre intreruperi, am activat intreruperea la nivelul de comparare si am setat prescaler-ul.
controlMotor()
In functia controlMotor este calculata viteza de rotatie a motorului in functie de eroarea de temperatura si de constantele PID.
Primul pas consta in a citi temperatura curenta de la senzorul DHT si de a calcula eroarea dintre temperatura tinta si cea curenta. In continuare, se calculeaza termenii Proportional, Integral și Derivative utilizand valorile pentru eroarea calculata la pasul curent si eroarea calculata la pasul anterior. Se calculeaza viteza motorului in procente mapand valoarea vitezei calculata utilizand formula algoritmului PID in intervalul (0, 100).
Utilitatea intreruperilor
Am utilizat temporizatorul Timer0 care genereaza intreruperi periodice la un interval prestabilit de 1 minut. In cadrul functiei ISR(TIMER0_COMPA_vect), care este executata atunci cand Timer0 genereaza o intrerupere se verifica daca temperatura curenta nu are inca aceeasi valoare cu cea citita de senzor, iar in acest caz se mareste viteza motorului.
De asemenea, detectarea actiunii de apasare a butonului se realizeaza tot prin intermediul unei intreruperi. In cadrul functiei ISR(PCINT2_vect) starea motorului este alternata la fiecare apasare a butonului, iar motorul se opreste sau reporneste dupa caz.
Principala dificultate a realizarii proiectului a constat in calculul constantelor pentru implementarea algoritmului PID, intrucat, nu exista formule de calcul a acestora si valorile lor se stabilesc experimental. Cu toate acestea mi-a facut placere sa dezvolt acest proiect si planuiesc ca in viitor sa inlocuiesc motorul de servo folosit cu un motor DC pentru a putea atinge viteze de rotatii de valori mai mari.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.