Differences

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

Link to this comparison view

pm:prj2026:atoader:anicolaescu2602 [2026/05/23 18:16]
anicolaescu2602 [Software Design]
pm:prj2026:atoader:anicolaescu2602 [2026/05/25 10:39] (current)
anicolaescu2602 [Download]
Line 13: Line 13:
  
 {{ :​pm:​prj2026:​atoader:​anicolaescu2602_schema_bloc.png?​300 |}} {{ :​pm:​prj2026:​atoader:​anicolaescu2602_schema_bloc.png?​300 |}}
 +
 +Demo video: [[https://​youtu.be/​plcSe06cdxU|youtube.com]]
 ===== Descriere generală ===== ===== Descriere generală =====
  
Line 193: Line 195:
 </​code>​{{ :​pm:​prj2026:​atoader:​anicolaescu2602_functionare1.jpeg?​300 |}}{{ :​pm:​prj2026:​atoader:​anicolaescu2602_functionare2.jpeg?​300 |}} </​code>​{{ :​pm:​prj2026:​atoader:​anicolaescu2602_functionare1.jpeg?​300 |}}{{ :​pm:​prj2026:​atoader:​anicolaescu2602_functionare2.jpeg?​300 |}}
  
-===== Software Design ===== +====== Software Design ======
-Stadiul actual al implementării software +
-Implementarea firmware-ului pentru ministatia meteo este completa si complet functionala. Toate modulele software descrise sunt integrate intr-o masina de stari stabila, de tip non-blocking. Achizitia de la senzori (AHT20, BMP280, TEMT6000), algoritmul de filtrare a datelor, calculul punctului de roua, controlul PWM proportional pentru LED/Buzzer, interfata de navigare prin pagini si meniul interactiv cu salvare in EEPROM ruleaza asincron, fara blocaje ale buclei principale. +
- +
-Motivarea alegerii bibliotecilor folosite +
-Pentru a asigura o amprenta minima de memorie si o executie de mare viteza, s-a optat pentru evitarea completa a bibliotecilor comerciale 3rd-party (cum ar fi cele de la Adafruit sau SparkFun) care introduc un overhead masiv de software. +
- +
-avr/​interrupt.h:​ A fost aleasa pentru a permite gestionarea asincrona a butoanelor, eliminand fenomenele de ratare a apasarii specifice tehnicilor de polling. +
- +
-avr/​eeprom.h:​ Utilizata pentru macro-urile native extrem de eficiente de citire/​scriere la nivel de bloc (''​eeprom_read_block'',​ ''​eeprom_update_block''​). +
- +
-math.h: Indispensabila pentru functiile matematice complexe (''​log''​ si ''​powf''​) necesare algoritmilor meteorologici. +
- +
-Driver I2C/TWI Custom: Dezvoltat direct pe registrele microcontrolerului pentru a elimina latentele bibliotecii standard ''​Wire''​. +
- +
-Elementul de noutate al proiectului +
-Spre deosebire de statiile meteo conventionale de nivel hobby care doar afiseaza valori brute, acest proiect aduce ca elemente de noutate: +
- +
-Feedback-ul acustic si vizual proportional:​ Intensitatea buzzer-ului si tranzitiile cromatice ale LED-ului RGB nu sunt binare (ON/OFF), ci sunt mapate matematic utilizand gradul de severitate al abaterii termice fata de limitele de confort. +
- +
-Sistemul Smart Mute adaptiv: Dispozitivul integreaza o functie autonoma de diminuare a deranjului fonic; daca senzorul TEMT6000 indica o valoare sub 10 lx (Mod Noapte), buzzerul se dezactiveaza automat, prioritatea trecand pe indicarea optica. +
- +
-Meniu de calibrare hardware persistent: Permite calibrarea offset-ului de altitudine direct din butoane, fara reinnoirea firmware-ului. +
- +
-Justificarea utilizării funcționalităților din laborator +
-^ Laborator ^ Functionalitate in Proiect ^ Justificare Tehnica ^ +
-| GPIO | Directia pinilor si pull-up | Configurația directă a regiștrilor ''​DDRB'',​ ''​DDRD''​ și ''​PORTD''​ pentru controlul LED-urilor discrete de umiditate și activarea pull-up-urilor interne pentru butoane. | +
-| Intreruperi | ''​INT1''​ si ''​PCINT2''​ | Folosite pentru detectarea apasarii butoanelor de pe pinii D3 si D4. Asigura comutarea unitatilor si modificarea pragurilor in mod asincron, cu debouncing software de 250ms. | +
-| I2C (TWI) | Comunicatie master-slave | Implementarea masinii de stari pentru controlul magistralei hardware (regisitrii ''​TWCR'',​ ''​TWDR'',​ ''​TWSR''​) la 100kHz pentru citirea senzorilor si scrierea datelor pe LCD-ul cu expandor PCF8574. | +
-| PWM & Timere | Fast PWM pe 8 biti | Utilizarea ''​Timer0''​ (canalele A si B pentru Blue LED si Buzzer) si ''​Timer1''​ (canalele A si B pentru Red si Green LED) in mod Fast PWM pentru controlul intensitatii si al culorilor. | +
-| ADC | Citire analogica | Configurat pe pinul A3 (regisitrii ''​ADMUX'',​ ''​ADCSRA''​) cu prescaler de 128 pentru conversia semnalului generat de TEMT6000 in unitati de luxi. | +
- +
-Scheletul proiectului și interacțiunea funcționalităților +
-Sistemul este structurat sub forma unei arhitecturi conduse de evenimente combinata cu o masina de stari ciclica. Interactiunea se realizeaza astfel:+
  
-Gestiunea intrarilor ​(Evenimente): Apasarea butoanelor genereaza intreruperi care modifica variabilele globale volatile ​(''​temp_unit'', ​''​display_page'',​ ''​manual_mute''​) sau incrementeaza/​decrementeaza pragurile in mod direct daca ''​in_menu''​ este activ.+===== 1. Mediu de dezvoltare ===== 
 +[[https://​github.com/​alexsilviu26/​pm-project|GITHUB]] 
 +Proiectul a fost dezvoltat utilizând **PlatformIO** ​(în cadrul VS Codeși framework-ul **Arduino**,​ dar cu o abordare orientată către programarea la nivel de regiștri specifică **AVR-GCC**. Această combinație a permis utilizarea unor funcții utilitare de sistem ​(precum ​''​millis()''​)păstrând în același timp controlul total asupra perifericelor microcontrolerului ATmega328P.
  
-Masina ​de stari din bucla principala ​(loop):+===== 2. Librării și surse 3rd-party ===== 
 +Pentru a maximiza eficiența și a reduce amprenta ​de memorie, codul **nu utilizează biblioteci comerciale grele** ​(precum cele de la Adafruit sau SparkFun). În schimb, s-au folosit: 
 +  * **avr/​interrupt.h:​** Pentru gestionarea vectorilor de întrerupere (butoane). 
 +  * **avr/​eeprom.h:​** Pentru stocarea permanentă a pragurilor de alertă în mod eficient prin ''​eeprom_read_block''​ și ''​eeprom_update_block''​. 
 +  * **math.h:** Pentru implementarea formulelor logaritmice (punct de rouă) și a puterilor (altitudine). 
 +  * **Driver I2C Custom:** Implementare proprie pentru protocolul Two-Wire Interface (TWI) pentru comunicarea cu senzorii și LCD-ul, bazată pe manipularea directă a regiștrilor ''​TWDR'',​ ''​TWCR'',​ ''​TWSR''​.
  
-Daca ''​in_menu ​== true''​, sistemul opreste citirea senzorilor si afiseaza ​pe LCD interfata ​de editare, preluand valorile din structura ​''​settings''​. ​La iesire, se apeleaza ''​save_to_eeprom()''​.+===== 3. Algoritmi și structuri de date ===== 
 +  * **Filtru de Medie Mobilă (Moving Average):** Implementat în funcția ​''​smooth_pressure''​ folosind un buffer circular de 10 eșantioane pentru a stabiliza citirile barometrice și a evita fluctuațiile cauzate de zgomot. 
 +  * **Algoritmul Magnus-Tetens:​** Utilizat pentru calcularea punctului de rouă pe baza temperaturii și umidității. 
 +  * **Formula Barometrică:​** Calculul altitudinii relative folosind raportul dintre presiunea curentă și o presiune ​de referință ($P_0$). 
 +  * **Structura DeviceSettings:​** O structură de date care grupează toate pragurile de mediu și un ''​Magic Number'' ​(0x44) pentru validarea integrității datelor citite din EEPROM la startup. 
 +  * **Mapare PWM Proporțională:​** Un algoritm care calculează severitatea abaterii termice și ajustează factorul de umplere ​(Duty Cyclepentru buzzer și culorile LED-ului RGB.
  
-Daca ''​in_menu ​== false'',​ se initiaza secvential citirea prin I2CDatele brute de presiune sunt trimise catre filtrul ''​smooth_pressure()''​iar temperatura si umiditatea sunt folosite ca argumente pentru ''​calculate_dew_point()''​.+===== 4Surse și funcții implementate ===== 
 +Codul este modularizat pe funcționalități cheiecele mai importante fiind:
  
-Controlul iesirilor: Datele procesate sunt trimise catre functiile ​''​update_leds()'' ​si ''​dynamic_buzzer()'' ​care modifica direct regisitrii de comparare PWM (''​OCR0A'',​ ''​OCR0B''​''​OCR1A'',​ ''​OCR1B''​), in timp ce ecranul LCD este actualizat cu noile string-uri formatate prin ''​dtostrf()''​.+==== Gestionarea Hardware (Low-Level) ==== 
 +  * ''​i2c_init()''​''​i2c_start()''​''​i2c_write()'',​ ''​i2c_read()''​: Setul de funcții care gestionează magistrala I2C la frecvența de 100kHz. 
 +  * ''​lcd_send()'',​ ''​lcd_init()''​: Driverul pentru ​ecranul LCD 1602, care traduce comenzile în nibbles (4 biți) pentru interfața I2C a modulului PCF8574. 
 +  * **Timere (PWM):** Configurare manuală a ''​Timer0''​ (pentru Buzzer și Blue LEDși ''​Timer1''​ (pentru Red și Green LED) în modul Fast PWM.
  
-Validarea functionariiSistemul a fost validat prin monitorizarea datelor trimise in paralel pe un port serial simulat, cat si prin introducerea statiei in medii cu parametri controlati ​(sursa de caldura ​pentru ​testarea tranzitiei RGB in rosu si pornirea buzzeruluirespectiv acoperirea senzorului LDR pentru validarea modului ​de noapte).+==== Achiziție și Procesare Date ==== 
 +  * ''​bmp_read_calibration()''​Funcție critică ce citește coeficienții unici de calibrare din memoria senzorului BMP280. 
 +  * ''​bmp_compensate_temp()''​ & ''​bmp_compensate_pressure()'':​ Implementarea calculelor matematice pe 32 și 64 de biți conform specificațiilor Bosch pentru ​obținerea datelor brute. 
 +  * ''​update_leds(th)'':​ Logica ​de control a culorilor, care decide tranziția între albastru-verde-roșu în funcție de confortul termic. 
 +  * ''​dynamic_buzzer(t,​ lux)'':​ Funcția de siguranță care modulează sunetul și verifică starea de Mute (manuală sau nocturnă).
  
-Calibrarea elementelor ​de senzoristică +==== Interfață și Întreruperi ==== 
-Pentru ​asigura acuratetea datelor afisate si a compensa erorile ​de pozitionare sau tolerantele componentelor hardware, s-au implementat trei niveluri ​de calibrare:+  * ''​ISR(INT1_vect)'':​ Gestionează butonul ​de "Plus / Mute"​. 
 +  * ''​ISR(PCINT2_vect)'':​ Gestionează butonul de "Minus / Schimbare Unități"​. 
 +  * **Logică Meniu:** Implementată în ''​loop()'',​ gestionează starea de Long Press (2 secunde) pe pinul D2 pentru ​comuta între modul de afișare și cel de editare a pragurilor salvate în EEPROM.
  
-Calibrare software fixa (Offsets): S-au definit constantele ''​AHT20_T_OFFSET ​-0.8f'' ​(pentru a corecta caldura radiata ​de componentele din jur pe breadboardsi ''​BMP280_P_OFFSET = 600.0f'' ​(pentru alinierea cu presiunea statiei de referinta).+==== Fluxul Principal ​(loop) ==== 
 +Programul urmează o structură de tip mașină de stări: 
 +  1Verifică starea butoanelor ​(prin întreruperi). 
 +  2. Achiziționează date de la AHT20, BMP280 și ADC (LDR). 
 +  3. Procesează datele ​(filtrare, conversii)
 +  4. Actualizează ieșirile PWM (LED-uri, Buzzer). 
 +  5. Actualizează afișajul LCD în funcție de pagina selectată sau meniul activ.
  
-Compensare dinamica din Datasheet (BMP280): In functia ''​bmp_read_calibration()'',​ la pornirea sistemului sunt cititi din memoria nevolatila a senzorului cei 11 coeficienti unici de calibrare din fabrica (''​dig_T1-T3'',​ ''​dig_P1-P9''​). Functiile ''​bmp_compensate_temp()''​ si ''​bmp_compensate_pressure()''​ aplica ecuatiile de compensare pe 32 si 64 de biti conform specificatiilor Bosch.+---
  
-Calibrare interactiva (Altitudine):​ Deoarece presiunea ​de referinta la nivelul marii se modifica zilnics-a introdus in meniu parametrul ''​altitude_offset''​permitand utilizatorului sa introduca altitudinea exacta ​locatiei curente pentru calibrarea ​punctului ​zero al algoritmului barometric.+===== 5. Stadiul actual al implementării software ===== 
 +Implementarea firmware-ului pentru ministația meteo este **completă și complet funcțională**. Toate modulele software descrise sunt integrate într-o mașină ​de stări stabilăde tip non-blocking. Achiziția de la senzorialgoritmul de filtrare ​datelor, calculul ​punctului ​de rouă, controlul PWM proporțional pentru LED/Buzzer, interfața de navigare prin pagini și meniul interactiv cu salvare în EEPROM rulează asincron, fără blocaje ale buclei principale.
  
-Optimizări realizate: CumDe ce și Unde +===== 6. Elementul de noutate al proiectului ===== 
-UndeIn implementarea driverelor I2C si LCD.+Spre deosebire de stațiile meteo convenționale de nivel hobby care doar afișează valori bruteacest proiect aduce ca elemente de noutate: 
 +  * **Feedback-ul acustic ​și vizual proporțional:​** Intensitatea buzzer-ului și tranzițiile cromatice ale LED-ului RGB nu sunt binare (ON/OFF), ci sunt mapate matematic utilizând gradul de severitate al abaterii termice față de limitele de confort. 
 +  * **Sistemul Smart Mute adaptiv:** Dispozitivul integrează o funcție autonomă de diminuare a deranjului fonic; dacă senzorul TEMT6000 indică o valoare sub 10 lx (**Mod Noapte**), buzzerul se dezactivează automat, prioritatea trecând pe indicarea optică. 
 +  * **Meniu de calibrare hardware persistent:​** Permite calibrarea offset-ului de altitudine direct din butoane, fără necesitatea rescrierii firmware-ului.
  
-Cum: Inlocuirea functiilor din biblioteca standard Arduino cu functii custom bazate pe manipulare de biti si asteptare pe flag-ul hardware ''​TWINT''​.+===== 7Justificarea utilizării funcționalităților din laborator =====
  
-De ce: Reduce dimensiunea codului compilat ​(Flash) cu aproximativ 4KB si mareste viteza ​de reimprospatare a ecranului.+^ Laborator ^ Funcționalitate în Proiect ^ Justificare Tehnică ^ 
 +| **GPIO** | Direcția pinilor și pull-up | Configurația directă a regiștrilor ''​DDRB'',​ ''​DDRD''​ și ''​PORTD''​ pentru controlul LED-urilor discrete de umiditate și activarea pull-up-urilor interne pentru butoane. | 
 +| **Întreruperi** | ''​INT1''​ și ''​PCINT2''​ | Folosite pentru detectarea apăsării butoanelor de pe pinii D3 și D4. Asigură comutarea unităților și modificarea pragurilor în mod asincron, cu debouncing software de 250ms. | 
 +| **I2C (TWI)** | Comunicație master-slave | Implementarea mașinii de stări pentru controlul magistralei hardware (regiștrii ''​TWCR'',​ ''​TWDR'',​ ''​TWSR''​) la 100kHz pentru citirea senzorilor și scrierea datelor pe LCD-ul ​cu expandor PCF8574. | 
 +| **PWM & Timere** | Fast PWM pe 8 biți | Utilizarea ''​Timer0''​ (canalele A și B pentru Blue LED și Buzzer) și ''​Timer1''​ (canalele A și B pentru Red și Green LED) în mod Fast PWM pentru controlul intensității și al culorilor. | 
 +| **ADC** | Citire analogică | Configurat pe pinul A3 (regiștrii ''​ADMUX'',​ ''​ADCSRA''​) cu prescaler ​de 128 pentru conversia semnalului generat de TEMT6000 în unități de luxi|
  
-UndeIn bucla principala ​(loop) ​si functiile ​de afisare.+===== 8. Scheletul proiectului și interacțiunea funcționalităților ===== 
 +Sistemul este structurat sub forma unei arhitecturi conduse de evenimente combinată cu o mașină de stări ciclică. Interacțiunea se realizează astfel: 
 +  * **Gestiunea intrărilor ​(Evenimente):​** Apăsarea butoanelor generează întreruperi care modifică variabilele globale volatile (''​temp_unit'',​ ''​display_page'',​ ''​manual_mute''​) sau modifică pragurile în mod direct dacă ''​in_menu''​ este activ. 
 +  * **Mașina de stări din loop:** Dacă ''​in_menu''​ este activ, sistemul oprește citirea senzorilor și afișează interfața de editare. La ieșire, se apelează automat ''​save_to_eeprom()''​. Dacă ''​in_menu''​ este fals, se inițiază secvențial citirea I2C. Datele ​de presiune sunt trimise către filtrul ''​smooth_pressure()'',​ iar temperatura și umiditatea sunt folosite ca argumente pentru ''​calculate_dew_point()''​. 
 +  * **Controlul ieșirilor:​** Datele procesate sunt trimise către ''​update_leds()''​ și ''​dynamic_buzzer()''​ care modifică regiștrii de comparare PWM (''​OCR0A'',​ ''​OCR0B'',​ ''​OCR1A'',​ ''​OCR1B''​),​ în timp ce ecranul LCD este actualizat cu string-urile formatate prin ''​dtostrf()''​.
  
-CumInlocuirea functiei standard ''​sprinf''​ (care contine ​un overhead imens pentru parsarea tipurilor float) ​cu functia ​de sistem mult mai rapida ''​dtostrf()'' ​pentru ​conversia valorilor ''​float''​ in siruri ​de caractere (''​char buffers''​).+**Validarea funcționării:** Sistemul a fost validat prin monitorizarea datelor trimise în paralel pe un port serial virtual, cât și prin introducerea stației în medii cu parametri controlați (sursă ​de căldură ​pentru ​testarea tranziției RGB în rosu și pornirea buzzerului, respectiv acoperirea senzorului LDR pentru validarea modului ​de noapte).
  
-De ceMicrocontrolerul ATmega328P nu are unitate ​de calcul in virgula flotanta ​(FPUhardware; optimizarea reduce timpul ​de executie ​al buclei cu peste 60%.+===== 9. Calibrarea elementelor de senzoristică ===== 
 +Pentru a asigura acuratețea datelor afișate și a compensa erorile de poziționare sau toleranțele componentelor hardware, s-au implementat trei niveluri de calibrare: 
 +  * **Calibrare software fixă (Offsets):​** S-au definit constantele ''​AHT20_T_OFFSET = -0.8f''​ (pentru a corecta căldura radiată ​de componentele din jur pe breadboard) și ''​BMP280_P_OFFSET = 600.0f'' ​(pentru alinierea cu presiunea stației de referință)
 +  * **Compensare dinamică din Datasheet (BMP280):** În funcția ''​bmp_read_calibration()'',​ la pornirea sistemului sunt citiți din memoria nevolatilă a senzorului cei 11 coeficienți unici de calibrare din fabrică (''​dig_T1-T3'',​ ''​dig_P1-P9''​). Funcțiile ''​bmp_compensate_temp()''​ și ''​bmp_compensate_pressure()''​ aplică ecuațiile de compensare pe 32 și 64 de biți conform specificațiilor Bosch. 
 +  * **Calibrare interactivă (Altitudine):​** Deoarece presiunea la nivelul mării se modifică zilnic, s-a introdus în meniu parametrul ''​altitude_offset'',​ permițând utilizatorului să introducă altitudinea exactă a locației curente pentru calibrarea punctului zero al algoritmului barometric.
  
-UndeIn scrierea ​parametrilor in EEPROM.+===== 10. Optimizări realizate ===== 
 +  * **I2C și LCD:** Înlocuirea funcțiilor din biblioteca standard Arduino cu funcții custom bazate pe manipulare de biți și așteptare pe flag-ul hardware ''​TWINT''​. **De ce:** Reduce dimensiunea codului compilat (Flash) cu aproximativ 4KB și mărește viteza de reîmprospătare a ecranului. 
 +  * **Funcțiile de afișare:** Înlocuirea funcției standard ''​sprintf''​ (care conține un overhead imens pentru parsarea tipurilor float) cu funcția de sistem mult mai rapidă ''​dtostrf()''​ pentru conversia valorilor float în siruri de caractere. **De ce:** Microcontrolerul nu are unitate de calcul în virgulă flotantă (FPU) hardware; optimizarea reduce semnificativ timpul de execuție al buclei. 
 +  * **Scrierea în EEPROM:** Utilizarea funcției ''​eeprom_update_block''​ în loc de ''​eeprom_write_block''​. **De ce:** Funcția de update verifică dacă noua valoare diferă de cea deja salvată și efectuează ​scrierea ​doar dacă este necesar, protejând durata de viață a celulelor ​EEPROM ​(limitate la 100.000 de cicluri de scriere).
  
-Cum: Utilizarea functiei ''​eeprom_update_block''​ in loc de ''​eeprom_write_block''​.+===== 11. Demo Video Proiect ===== 
 +Deoarece site-ul este public, prezentarea video și demonstrarea funcționalităților complete au fost încărcate în platforma securizată ​de stocare a facultății.
  
-De ceFunctia ​de update verifica daca noua valoare difera ​de cea deja salvata si efectueaza scrierea doar daca este necesarprotejand durata ​de viata a celulelor EEPROM ​(limitate la 100.000 de cicluri ​de scriere).+**Explicații conținut video:** 
 +  - **Inițializare:​** Se observă afișarea ecranului ​de bun venit timp de 1.5 secunde. 
 +  - **Navigare:​** Se prezintă apăsarea scurtă a butonului D2 pentru a trece prin cele 3 pagini de date. 
 +  - **Schimbarea unităților:​** Se demonstrează apăsarea butonului D4 care schimbă unitățile (C/F/Krespectiv mmHg/​hPa). 
 +  - **Meniu ​de setări:** Se evidențiază apăsarea lungă ​(2s) pe D2, modificarea pragului ''​T_max''​ folosind butoanele D3 și D4, urmată de salvarea automată în EEPROM. 
 +  - **Declanșarea alertelor:​** Se apropie o sursă ​de căldură ​de senzor; se observă tranziția fluidă a LED-ului RGB din verde în roșu și intensificarea sunetului PWM pe măsură ce temperatura depășește pragul limită. Apăsarea butonului Mute oprește imediat alerta acustică (apare indicatorul ''​[M]''​).
 ====== Rezultate Obținute ====== ====== Rezultate Obținute ======
  
pm/prj2026/atoader/anicolaescu2602.1779549400.txt.gz · Last modified: 2026/05/23 18:16 by anicolaescu2602
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