This shows you the differences between two versions of the page.
|
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 Cycle) pentru buzzer și culorile LED-ului RGB. | ||
| - | Daca ''in_menu == false'', se initiaza secvential citirea prin I2C. Datele brute de presiune sunt trimise catre filtrul ''smooth_pressure()'', iar temperatura si umiditatea sunt folosite ca argumente pentru ''calculate_dew_point()''. | + | ===== 4. Surse și funcții implementate ===== |
| + | Codul este modularizat pe funcționalități cheie, cele 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 functionarii: Sistemul 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 buzzerului, respectiv 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(t, h)'': 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 a 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 a 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 breadboard) si ''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: | ||
| + | 1. Verifică 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 zilnic, s-a introdus in meniu parametrul ''altitude_offset'', permitand utilizatorului sa introduca altitudinea exacta a 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 senzori, algoritmul de filtrare a 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: Cum, De ce și Unde | + | ===== 6. Elementul de noutate al proiectului ===== |
| - | Unde: In implementarea driverelor I2C si LCD. | + | Spre deosebire de stațiile meteo convenționale de nivel hobby care doar afișează valori brute, acest 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''. | + | ===== 7. Justificarea 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. | | ||
| - | Unde: In 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()''. | ||
| - | Cum: Inlocuirea 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 ce: Microcontrolerul ATmega328P nu are unitate de calcul in virgula flotanta (FPU) hardware; 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. | ||
| - | Unde: In 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 ce: Functia de update verifica daca noua valoare difera de cea deja salvata si efectueaza scrierea doar daca este necesar, protejand 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/K, respectiv 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 ====== | ||