This is an old revision of the document!


Smart desk clock

Introducere

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

Descriere generală

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:

  1. Senzorul DHT22 măsoară temperatura și umiditatea.
  2. Arduino preia aceste date și:
  • Le afișează pe LCD.
  • Activează buzzerul dacă sunt depășite praguri prestabilite (ex: >30°C).
  1. Butonul poate fi folosit pentru a seta ora sau porni o alarmă manual.
  2. Sistemul este alimentat fie prin USB, fie cu o baterie de 9V prin mufă DC.

Hardware Design

Piese:

  • DHT22
  • LCD 1602 I2C
  • Buzzer
  • Buton (opțional)
  • Arduino UNO (ATmega328p)
  • Alimentare (USB/Baterie)

Modul în care sunt conectate modulele la microcontroller-ul ATmega328P

LCD 1602 cu interfață I2C

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ă.

Senzorul de temperatură și umiditate DHT22

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ă.

Buzzer pasiv

Acesta este conectat la unul dintre pinii digitali de pe ATmega328P, de exemplu PD12 (D12) și la GND.

Alimentare

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).

Comunicare pe I2C

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.

hardware_mocanualexia.jpg

Software Design

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:

  • afișare a cifrelor prin 74HC595,
  • citirea senzorului DHT22,
  • afișarea valorilor pe LCD,
  • redarea unei melodii secvențiale sincronizate cu schimbarea cifrelor afișate.

2. Mediu de dezvoltare

  • PlatformIO în Visual Studio Code (cu platform = atmelavr)
  • Placă de dezvoltare: ATmega328P compatibil Arduino UNO R3
  • Upload și monitorizare prin USB

3. Librării utilizate

  • LiquidCrystal_I2C – pentru afișajul LCD 16×2
  • Adafruit DHT sensor library – pentru senzorul DHT22
  • Adafruit Unified Sensor – suport general pentru senzori
  • TimeLib.h – pentru menținerea timpului software (în lipsa unui modul RTC)
  • pitches.h – pentru definirea notelor muzicale (buzzer)

4. Algoritmi și structuri implementate

  • Multiplexare pentru 7-segmente

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.

  • Afișarea timpului (HHMM)

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ă.

  • Citirea senzorului DHT22

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.

  • Redare melodie pe buzzer + secvență vizuală

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

  • void shiftOutFast() Trimite rapid un octet spre 74HC595 folosind porturi directe.
  • void sendTo74HC595() Trimite date spre segment display prin latch.
  • void deactivateAllDigits() Dezactivează toate cele 4 cifre.
  • void updateDigitsFromTime() Actualizează vectorul digits[] cu ora și minutul curente.
  • void loop() Gestionează afișarea, timpul, senzorul și buzzerul.

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

pm/prj2025/ccristi/125741.1748570975.txt.gz · Last modified: 2025/05/30 05:09 by alexia.mocanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0