This shows you the differences between two versions of the page.
pm:prj2025:ccristi:125741 [2025/05/30 02:37] alexia.mocanu [Hardware 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}}]] | ||
+ | == Ilustrație luată din gidul Plusivo == | ||
+ | [[http://php.net|{{7segment_display.png}}]] | ||
+ | [[http://php.net|{{hardware_MocanuAlexia.jpg?1000}}]] | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | 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ă. | ||
- | <note tip> | + | Componentele controlate de firmware: |
- | Descrierea codului aplicaţiei (firmware): | + | * Afișarea timpului curent (HH:MM:SS) pe LCD 16×2. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Afișarea unei animații numerice 1-2-3-4 pe display 7-segmente sincronizat cu redarea melodiei. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * Citirea temperaturii și umidității de la senzorul DHT22. |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * Trimiterea datelor către monitorul serial prin USART implementat manual. |
- | * (etapa 3) surse şi funcţii implementate | + | * Redarea unei melodii ("Twinkle, Twinkle, Little Star") printr-un buzzer la ora fixă. |
- | </note> | + | |
+ | 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 | ||
+ | * PlatformIO în Visual Studio Code (cu platform = atmelavr) | ||
+ | * Placă de dezvoltare: ATmega328P compatibil Arduino UNO R3 | ||
+ | * Upload via USB, monitorizare serială prin USART (implementată manual) | ||
+ | |||
+ | 3. Librării utilizate | ||
+ | * LiquidCrystal_I2C – pentru afișajul LCD 16x2 | ||
+ | * Adafruit DHT sensor library – pentru senzorul DHT22 | ||
+ | * Adafruit Unified Sensor – suport general pentru senzori | ||
+ | * 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. | ||
+ | * Menținerea timpului software cu Timer1 CTC + ISR: | ||
+ | Timer1 este configurat la 1Hz (OCR1A = 15624 cu prescaler 1024) și incrementează seconds, minutes, hours. La fiecare oră fixă, melodyShouldPlay este setat pe true. | ||
+ | * 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. | ||
+ | * 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 | ||
+ | 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 USART_init() = Configurează USART pentru 9600 baud | ||
+ | * void USART_sendChar() = Trimite un caracter prin USART | ||
+ | * void USART_sendString() = Trimite un șir de caractere | ||
+ | * void updateTemperatureAndHumidity() = Citește senzorul și afișează pe LCD și USART | ||
+ | * void updateDigitDisplay() = Comută între cifrele 1-2-3-4 la fiecare 500ms | ||
+ | * void playMelody() = Redă melodia notă cu notă și oprește după final | ||
+ | * ISR(TIMER1_COMPA_vect) = Actualizează timpul o dată pe secundă și declanșează melodia la fix | ||
+ | * void loop() = Afișează ora, actualizează senzorul, gestionează melodia și afișajul | ||
===== 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 ===== | ||