This is an old revision of the document!
Proiectul constă în realizarea unui ceas de birou inteligent bazat pe microcontrolerul ATmega328p (placă compatibilă Arduino UNO). Acest dispozitiv afișează ora curentă, temperatura și umiditatea mediului ambiant, toate prezentate pe un ecran LCD cu interfață I2C. De asemenea, ceasul este capabil să emită alarme sonore prin intermediul unui buzzer piezo, în funcție de condiții presetate sau ora programată.
Scopul principal al proiectului este de a crea un dispozitiv accesibil, funcțional și ușor de personalizat, care să îmbine mai multe funcții utile într-un format compact. Am pornit de la ideea de a îmbunătăți ceasurile clasice, adăugând funcții de monitorizare a mediului și posibilitatea alertelor sonore, fără a depinde de componente scumpe sau complexe.
Consider că acest proiect este util atât pentru mine, ca mod de aprofundare a cunoștințelor în domeniul sistemelor embedded, cât și pentru alți utilizatori care doresc un ceas inteligent personalizat, ideal pentru birou, casă sau chiar ca bază pentru proiecte mai avansate precum sisteme de automatizare sau stații meteo
Voi folosi microcontrolerul Arduino UNO (ATmega328p) care procesează datele de la senzori, controlează afișajul și buzzerul. LCD 1602 I2C se folosește pentru a afișa ora, temperatura și umiditatea, primește date de la Arduino prin protocol I2C. DHT22 este senzorul de temperatură și umiditate, trimite date către Arduino pentru a fi afișate. Folosesc buzzer-ul pentru semnal sonor (alarmă sau avertizare) și este controlat de Arduino cu funcția tone(). Butonul (opțional) poate seta ora sau declanșa manual alarma și este citit de Arduino ca intrare digitală Alimentare va fi prin USB/Baterie.
Fluxul de date:
Piese:
A fost conectat la pinii SDA și SCL ai microcontroller-ului, care corespund cu A4 (SDA) și A5 (SCL) pe placa Arduino UNO. Alimentarea display-ului este realizată prin conectarea pinului VCC la +5V și GND la GND. Comunicarea se face prin protocol I2C, ceea ce reduce semnificativ numărul de fire necesare comparativ cu conexiunea paralelă.
Pinul de date este conectat la unul dintre pinii digitali ai ATmega328P, de exemplu PD2 (D2). Pentru funcționarea corectă, este necesară o rezistență de pull-up de 10kΩ între pinul de date și VCC (așa cum este indicat în datasheet-ul senzorului). Alimentarea senzorului este asigurată prin conectarea pinului VCC la 5V și GND la masă.
Acesta este conectat la unul dintre pinii digitali de pe ATmega328P, de exemplu PD12 (D12) și la GND.
Toate componentele sunt alimentate la +5V, care poate proveni fie de la un cablu USB conectat la Arduino, fie de la o sursă externă (ex. baterie de 9V cu regulator onboard).
Pentru comunicarea între microcontroller și perifericele I2C (precum LCD-ul 1602 cu interfață I2C și, opțional, alți senzori compatibili), am decis să folosesc magistrala I2C/TWI integrată în ATmega328P. Protocolul I2C este ideal în acest context deoarece permite conectarea mai multor dispozitive pe aceleași două fire de semnal, reducând semnificativ complexitatea cablajului.
Am realizat conexiunile astfel: SDA (Date) → conectat la pinul A4 al ATmega328P. SCL (Clock) → conectat la pinul A5. VCC → alimentat la +5V, întrucât modulul LCD suportă această tensiune. GND → comun cu restul circuitului.
1. Firmware-ul controlează un sistem de afișare a orei pe un display cu 4 cifre 7-segmente, utilizând registrul de deplasare 74HC595 pentru controlul segmentelor și multiplexare pentru selecția cifrelor. În paralel, senzorul DHT22 măsoară temperatura și umiditatea, afișate pe un ecran LCD I2C 16×2. La pornire, buzzerul începe să cânte o melodie: „Twinkle, Twinkle, Little Star”.
Codul este structurat modular, incluzând funcții pentru:
2. Mediu de dezvoltare
3. Librării utilizate
4. Algoritmi și structuri implementate
Se activează secvențial fiecare cifră (DIG1–DIG4) cu semnal LOW, în timp ce se trimite către 74HC595 codul binar corespunzător cifrei dorite. Codificarea segmentelor este adaptată pentru cazul în care segmentul A este conectat la Q7 și DP (nefolosit) este pe Q0.
Timpul este menținut în software cu TimeLib. Se actualizează vectorul digits[4] cu ora curentă (hour() și minute()). Afișarea se face rapid și ciclic (~2ms per digit) pentru a păstra iluzia de imagine stabilă.
Se citește temperatura și umiditatea la fiecare 2 secunde. Se validează datele (isnan()) și se afișează pe LCD, sau se afișează un mesaj de eroare.
Buzzerul redă o melodie cu durate variabile pentru fiecare notă. La fiecare 500ms, se schimbă cifra activă, afișând 1→2→3→4 sincronizat vizual.
5. Surse și funcții implementate Funcție Descriere
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.