This shows you the differences between two versions of the page.
pm:prj2025:ccristi:125741 [2025/05/30 02:53] 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. 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”. | + | 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ă. |
- | 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 86: | 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) | ||
Line 93: | Line 94: | ||
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, hours. La fiecare oră fixă, melodyShouldPlay este setat pe true. |
- | 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 | * Citirea senzorului DHT22 | ||
Se citește temperatura și umiditatea la fiecare 2 secunde. | Se citește temperatura și umiditatea la fiecare 2 secunde. | ||
Line 103: | Line 102: | ||
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ă și declanșează melodia la fix |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * void loop() = Afișează ora, actualizează senzorul, gestionează melodia și afișajul |
- | * (etapa 3) surse şi 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, 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**. | + | |
- | </note> | + | |
===== Jurnal ===== | ===== Jurnal ===== | ||