Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:ccristi:125741 [2025/05/30 02:52]
alexia.mocanu [Software Design]
pm:prj2025:ccristi:125741 [2025/05/30 10:29] (current)
alexia.mocanu [Download]
Line 45: Line 45:
 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ă. 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 (Piezo 20mm) == +== Buzzer pasiv == 
-Acesta este conectat la unul dintre pinii digitali de pe ATmega328P, de exemplu ​PD3 (D3). Deoarece este un buzzer pasiv, trebuie comandat prin semnale PWM sau schimbări rapide de stare logică pentru a genera sunete. VCC și GND sunt conectate corespunzător la sursa de alimentare. +Acesta este conectat la unul dintre pinii digitali de pe ATmega328P, de exemplu ​PD12 (D12) și la GND.
- +
-== Buton de reset (opțional) == +
-Acesta este legat la pinul RESET al microcontrollerului,​ împreună cu o rezistență de pull-up de 10kΩ la VCC, pentru a evita resetările neintenționate. Apăsarea butonului trage pinul RESET la GND, repornind sistemul.+
  
 == Alimentare == == Alimentare ==
Line 63: Line 60:
 GND → comun cu restul circuitului. GND → comun cu restul circuitului.
  
 +== Ilustrație făcută pe TinkerCad ==
 [[http://​php.net|{{buzzer_screen_temperature.png?​1000}}]] [[http://​php.net|{{buzzer_screen_temperature.png?​1000}}]]
 +== Ilustrație luată din gidul Plusivo ==
 [[http://​php.net|{{7segment_display.png}}]] [[http://​php.net|{{7segment_display.png}}]]
 [[http://​php.net|{{hardware_MocanuAlexia.jpg?​1000}}]] [[http://​php.net|{{hardware_MocanuAlexia.jpg?​1000}}]]
Line 69: Line 68:
 ===== Software Design ===== ===== Software Design =====
  
-1. Descrierea codului aplicației (firmware) +Aplicația constă în implementarea unui ceas digital inteligent cu afișare pe LCD și display 7-segmente ​controlat prin shift register (74HC595)alături ​de măsurarea temperaturii ​și umidității folosind ​senzorul DHT22 și de redarea unei melodii la fiecare oră fixă.
-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 16x2. La pornire, buzzerul începe să cânte o melodie: „Twinkle, Twinkle, Little Star”.+
  
-Codul este structurat modular, incluzând funcții pentru+Componentele controlate de firmware
-  * afișare a cifrelor prin 74HC595, +  * Afișarea timpului curent (HH:MM:SS) pe LCD 16×2. 
-  * citirea senzorului DHT22, +  * Afișarea unei animații numerice 1-2-3-4 pe display 7-segmente sincronizat cu redarea melodiei. 
-  * afișarea valorilor pe LCD, +  * Citirea temperaturii ​și umidității de la senzorul DHT22. 
-  * redarea ​unei melodii ​secvențiale sincronizate cu schimbarea cifrelor afișate.+  * Trimiterea datelor către monitorul serial prin USART implementat manual. 
 +  * Redarea ​unei melodii ​("​Twinkle,​ Twinkle, Little Star") printr-un buzzer la ora fixă. 
 + 
 +Actualizarea timpului se face printr-un timer hardware (Timer1) configurat în mod CTC care declanșează întreruperi la fiecare 1 secundă. Afișarea se face ciclic în bucla principală,​ iar funcțiile sunt bine separate pentru lizibilitate ​și întreținere.
  
 2. Mediu de dezvoltare 2. Mediu de dezvoltare
   * PlatformIO în Visual Studio Code (cu platform = atmelavr)   * PlatformIO în Visual Studio Code (cu platform = atmelavr)
   * Placă de dezvoltare: ATmega328P compatibil Arduino UNO R3   * Placă de dezvoltare: ATmega328P compatibil Arduino UNO R3
-  * Upload ​și monitorizare prin USB+  * Upload ​via USB, monitorizare ​serială ​prin USART (implementată manual)
  
 3. Librării utilizate 3. Librării utilizate
Line 87: Line 88:
   * Adafruit DHT sensor library – pentru senzorul DHT22   * Adafruit DHT sensor library – pentru senzorul DHT22
   * Adafruit Unified Sensor – suport general pentru senzori   * 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)   * pitches.h – pentru definirea notelor muzicale (buzzer)
  
 4. Algoritmi și structuri implementate 4. Algoritmi și structuri implementate
-  ​Multiplexare pentru 7-segmente+  ​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. 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. Codificarea segmentelor este adaptată pentru cazul în care segmentul A este conectat la Q7 și DP (nefolosit) este pe Q0.
-  ​- Afișarea ​timpului ​(HHMM) +  ​* Menținerea ​timpului software cu Timer1 CTC + ISR: 
-Timpul este menținut în software cu TimeLib. +Timer1 este configurat la 1Hz (OCR1A = 15624 cu prescaler 1024) și incrementează seconds, minutes, hoursLa fiecare oră fixă, melodyShouldPlay este setat pe true
-Se actualizează vectorul digits[4] ​cu ora curentă (hour() și minute()). +  ​Citirea senzorului DHT22
-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 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. Se validează datele (isnan()) și se afișează pe LCD, sau se afișează un mesaj de eroare.
-  ​Redare melodie pe buzzer + secvență vizuală+  ​Redare melodie pe buzzer + secvență vizuală
 Buzzerul redă o melodie cu durate variabile pentru fiecare notă. 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. La fiecare 500ms, se schimbă cifra activă, afișând 1→2→3→4 sincronizat vizual.
 +  * Comunicație serială USART implementată direct:
 +Se configurează registrele UBRR/​UCSR0A/​B/​C pentru baudrate 9600. Se trimit mesaje text pentru ora curentă și senzor prin USART_sendString().
  
 5. Surse și funcții implementate 5. Surse și funcții implementate
 Funcție Descriere Funcție Descriere
-  * void shiftOutFast() Trimite rapid un octet spre 74HC595 folosind porturi directe. +  * void shiftOutFast() Trimite rapid un octet spre 74HC595 folosind porturi directe. 
-  * void sendTo74HC595() Trimite date spre segment display prin latch. +  * void sendTo74HC595() ​Trimite date spre segment display prin latch. 
-  * void deactivateAllDigits() Dezactivează toate cele 4 cifre. +  * void deactivateAllDigits() ​Dezactivează toate cele 4 cifre. 
-  * void updateDigitsFromTime() Actualizează vectorul digits[] cu ora și minutul curente. +  * void USART_init() = Configurează USART pentru 9600 baud 
-  * void loop() Gestionează afișarea, timpul, senzorul și buzzerul. +  * void USART_sendChar() = Trimite un caracter prin USART 
- +  * void USART_sendString() = Trimite un șir de caractere 
-<note tip> +  * void updateTemperatureAndHumidity() = Citește senzorul și afișează pe LCD și USART 
-Descrierea codului aplicaţiei ​(firmware): +  * void updateDigitDisplay() = Comută între cifrele 1-2-3-4 la fiecare 500ms 
-  * mediu de dezvoltare ​(if any) (e.g. AVR Studio, CodeVisionAVR+  * void playMelody() = Redă melodia notă cu notă și oprește după final 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib+  * ISR(TIMER1_COMPA_vect) = Actualizează timpul o dată pe secundă șdeclanșează melodia la fix 
-  * algoritmi şi structuri ​pe care plănuiţsă le implementaţi +  * void loop() = Afișează ora, actualizează senzorul, gestionează melodia șafișajul
-  * (etapa 3surse şfuncţii implementate +
-</​note>​+
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +== Serial Monitor == 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+[[http://​www.php.net|{{serial_monitor_MocanuAlexia.png}}]] 
-</note>+== Real life == 
 +[[http://​www.php.net|{{rezultat_MocanuAlexia.jpg?​1000}}]]
  
 +== Videoclip ==
 +https://​youtube.com/​shorts/​hlM-PZVYdmU?​feature=share
 ===== Concluzii ===== ===== Concluzii =====
  
 +În concluzie a fost foarte captivant să lucrez la acest proiect, a trebuit să învăț rapid cum să mă descurc, cum să-mi fac viața mai ușoară și codul mai frumos.
 ===== Download ===== ===== Download =====
  
-<note warning>​ +{{SmartClock_MocanuAlexia_333CD.zip}}
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etcUn 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**. +
-</​note>​ +
 ===== Jurnal ===== ===== Jurnal =====
  
pm/prj2025/ccristi/125741.1748562753.txt.gz · Last modified: 2025/05/30 02:52 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