Differences

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

Link to this comparison view

pm:prj2026:atoader:anicolaescu2602 [2026/05/16 23:37]
anicolaescu2602 [Hardware 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 63: Line 65:
 ===== Hardware Design ===== ===== Hardware Design =====
  
-1. Stadiul actual al implementării+**1. Stadiul actual al implementării**
  
 Proiectul este funcțional la nivel hardware, toate componentele fiind Proiectul este funcțional la nivel hardware, toate componentele fiind
Line 78: Line 80:
 |Modul cu buton|[[https://​www.optimusdigital.ro/​ro/​altele/​179-modul-cu-buton.html?​search_query=push+button+Arduino+modul&​results=6|Modul cu buton]]|GPIO,​ Intreruperi| |Modul cu buton|[[https://​www.optimusdigital.ro/​ro/​altele/​179-modul-cu-buton.html?​search_query=push+button+Arduino+modul&​results=6|Modul cu buton]]|GPIO,​ Intreruperi|
 |Led RGB cu catod comun|[[https://​www.optimusdigital.ro/​ro/​optoelectronice-led-uri/​483-led-rgb-catod-comun.html?​search_query=Led&​results=647|Leg RGB cu catod comun]] |GPIO (posibila modificare spre PWM)| |Led RGB cu catod comun|[[https://​www.optimusdigital.ro/​ro/​optoelectronice-led-uri/​483-led-rgb-catod-comun.html?​search_query=Led&​results=647|Leg RGB cu catod comun]] |GPIO (posibila modificare spre PWM)|
 +
 +Pentru a evita posibilele riscuri de scurt circuit pentru fiecare led legat am folosit in serie cate o rezistenta de 470Ω, iar pentru butoane o rezistenta de pull-up de 10kΩ, iar pentru o conectare facila a diverselor piese componente am folosit un breadboard de 800 de puncte si fire de legatura mama-tata si tata-tata alaturi de pini.
 +
 +**3. Descrierea detaliată a pinilor folosiți**
 +
 +**Magistrala I2C — A4 (SDA) și A5 (SCL)**
 +
 +Pinii A4/A5 si SDA/SCL sunt pini hardware I2C ai ATmega328P,
 +ceea ce permit comunicarea simultană cu trei dispozitive pe aceeași magistrală:​
 +
 +^ Dispozitiv ^ Adresă I2C ^
 +| LCD 16×2 cu convertor I2C | 0x27 |
 +| Senzor AHT20 (temperatură/​umiditate) | 0x38 |
 +| Senzor BMP280 (presiune) | 0x77 |
 +
 +Adresele distincte permit coexistența fără conflicte și fără consum
 +suplimentar de pini digitali.
 +
 +**Butoane — D2, D3, D4**
 +
 +^ Pin ^ Funcție ^ Tip întrerupere ^ Rol ^
 +| D2 | Navigare / Meniu (apăsare lungă 2s) | GPIO polling | Schimbare pagină sau intrare/​ieșire meniu setări |
 +| D3 | Plus / Mute | INT1 — front descendent (ISC11=1) | Incrementare valori în meniu sau activare/​dezactivare sunet |
 +| D4 | Minus / Schimbare unități | PCINT20 — Pin Change Interrupt | Decrementare valori în meniu sau comutare unități de măsură |
 +
 +D3 este conectat la **INT1** (întrerupere externă dedicată) pentru reacție
 +imediată. D4 folosește **PCINT2** deoarece INT0 este rezervat pentru D2.
 +Fiecare buton are rezistență pull-up de 10kΩ în circuit și pull-up intern
 +activat în firmware:
 +
 +<code c>
 +PORTD |= (1 << PORTD2) | (1 << PORTD3) | (1 << PORTD4);
 +</​code>​
 +
 +**PWM — D5, D6, D9, D10**
 +
 +^ Pin ^ Registru ^ Periferic ^ Justificare ^
 +| D5 (PD5) | Timer0, OC0B | Buzzer pasiv | Intensitatea sunetului proporțională cu severitatea temperaturii |
 +| D6 (PD6) | Timer0, OC0A | LED Albastru (canal B al RGB) | Timer0 partajat cu buzzerul, economisind un timer |
 +| D9 (PB1) | Timer1, OC1A | LED Verde (canal G al RGB) | Timer1 pe 16 biți — rezoluție mai bună pentru tranziții de culoare |
 +| D10 (PB2) | Timer1, OC1B | LED Roșu (canal R al RGB) | Timer1 pe 16 biți, canal B |
 +
 +Intensitatea buzzerului se calculează astfel:
 +
 +<code c>
 +float severity = (t >= settings.t_max) ? (t - settings.t_max) : (settings.t_min - t);
 +if (severity > 10.0f) severity = 10.0f;
 +OCR0B = (uint8_t)((severity / 10.0f) * 255.0f);
 +</​code>​
 +
 +**LED-uri discrete umiditate — D11, D12, D13 (PB3, PB4, PB5)**
 +
 +Pini GPIO simpli pe portul B, comutați direct prin registrul ''​PORTB''​.
 +Nu necesită PWM, doar stări on/off în funcție de pragurile ''​h_low''​ și ''​h_high'':​
 +
 +^ Pin ^ Culoare LED ^ Condiție de activare ^
 +| D11 (PB3) | Albastru | ''​h < settings.h_low''​ — umiditate scăzută |
 +| D12 (PB4) | Verde | ''​h_low ≤ h ≤ h_high''​ — umiditate optimă |
 +| D13 (PB5) | Roșu | ''​h > settings.h_high''​ — umiditate ridicată |
 +
 +**ADC — A3**
 +Senzorul TEMT6000 produce o tensiune analogică proporțională cu luminozitatea.
 +
 +<code c>
 +ADMUX  = (1 << REFS0) | (1 << MUX1) | (1 << MUX0); // Ref AVcc, canal ADC3
 +ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Prescaler 128
 +</​code>​
 +
 +Valoarea citită este convertită în lux:
 +
 +<code c>
 +float lux = (float)ADC * 0.9765f;
 +</​code>​
 +
 +Luminozitatea sub 10 lux activează modul nocturn (''​night_mute''​),​ care
 +dezactivează automat buzzerul și afișează indicatorul ''​[N]''​ pe LCD.
 +
 +**4. Schema electrică**
 +
 +Schema a fost realizată în **Cirkit Designer** și prezintă toate componentele
 +conectate pe breadboard-ul de 800 de puncte.
  
 {{ :​pm:​prj2026:​atoader:​anicolaescu2602_circuit.png?​300 |}} {{ :​pm:​prj2026:​atoader:​anicolaescu2602_circuit.png?​300 |}}
  
-Pentru a evita posibilele riscuri de scurt circuit pentru fiecare led legat am folosit in serie cate o rezistenta de 470Ω, iar pentru butoane o rezistenta de pull-up de 10kΩiar pentru o conectare facila a diverselor piese componente am folosit un breadboard de 800 de puncte si fire de legatura mama-tata si tata-tata alaturi de pini. +**Magistrala I2C**  leagă în paralel modulul 
-===== Software Design =====+AHT20+BMP280 și LCD-ul 16×2 prin 
 +pinii GNDVCC, SDA, SCL.
  
-**1. Mediu de dezvoltare**+**Butoanele**sunt conectate cu rezistențe pull-up 
 +de 10kΩ între VCC și pinul butonului,​ 
 +celălalt capăt la GND.
  
-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.+**LED-urile** au rezistențde 470Ω în serie pe fiecare 
 +anodlimitând curentul la ~10mA la 5V.
  
-** 2. Librării și surse 3rd-party**+**Buzzerul pasiv** este conectat direct la D5 cu GND comun.
  
-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:+**TEMT6000** are ieșirea analogică conectată ​la A3.
  
- **avr/​interrupt.h**: Pentru gestionarea vectorilor ​de întrerupere (butoane). +**5Dovezi ​de funcționare**
- **avr/​eeprom.h**:​ Pentru stocarea permanentă a pragurilor de alertă. +
- ​**math.h**:​ Pentru implementarea formulelor logaritmice (punct de rouă) și a puterilor (altitudine). +
- ​**Drivre 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`.+
  
-** 3Algoritmi ​și structuri de date**+Schema din Cirkit Designer confirmă conectarea corectă a tuturor componentelor. 
 +Dovada funcționării magistralei I2C este dată de prezența celor trei dispozitive 
 +cu adrese distincte (0x27, 0x38, 0x77) pe aceleași linii SDA/SCL, fără conflicte.
  
- ​**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.+La alimentarea circuitului,​ secvența ​de boot din firmware afișează mesajul 
 +de bun venit pe LCD timp de 1,5 secunde, confirmând ​funcționarea comunicației I2C:
  
- **Algoritmul Magnus-Tetens:** Utilizat pentru calcularea punctului de rouă pe baza temperaturii și umidității.+<code c> 
 +lcd_print(" ​ Statie Meteo  "); 
 +lcd_send(0xC0,​ LCD_CMD); 
 +lcd_print("​Nicolaescu Alex"​);​ 
 +delay(1500);​ 
 +</​code>​{{ :​pm:​prj2026:​atoader:​anicolaescu2602_functionare1.jpeg?​300 |}}{{ :​pm:​prj2026:​atoader:anicolaescu2602_functionare2.jpeg?300 |}}
  
- ​**Formula Barometrică:​** Calculul altitudinii relative folosind raportul dintre presiunea curentă și o presiune de referință ($P_0$).+====== Software Design ======
  
- **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.+===== 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.
  
- **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.+===== 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''​.
  
-** 4Surse și funcții implementate ​(Etapa 3) **+===== 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.
  
 +===== 4. Surse și funcții implementate =====
 Codul este modularizat pe funcționalități cheie, cele mai importante fiind: Codul este modularizat pe funcționalități cheie, cele mai importante fiind:
  
-** Gestionarea Hardware (Low-Level) **+==== 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.
  
- `i2c_init()`,​ `i2c_start()`,​ `i2c_write()`, `i2c_read()`Setul de funcții care gestionează magistrala I2C la frecvențde 100kHz+==== Achiziție și Procesare Date ==== 
- `lcd_send()`, `lcd_init()`Driverul pentru ecranul LCD 1602, care traduce comenzile în nibbles (4 bițipentru ​interfața I2C a modulului PCF8574+  * ''​bmp_read_calibration()''​Funcție critică ce citește coeficienții unici de calibrare din memoria senzorului BMP280
- **Timere ​(PWM):** Configurare manuală ​`Timer0` (pentru Buzzer ​și Blue LED) și `Timer1` ​(pentru Red și Green LEDîn modul Fast PWM.+  * ''​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 ​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ă).
  
-** Achiziție șProcesare Date **+==== Interfață și Întreruperi ==== 
 +  ​''​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.
  
- ​`bmp_read_calibration()`: Funcție critică ce citește coeficienții unici de calibrare din memoria senzorului BMP280. +==== Fluxul Principal ​(loop==== 
- `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+Programul urmează o structură de tip mașină de stări: 
- `update_leds(th)`: Logica de control a culorilor, care decide tranziția între albastru-verde-roșu în funcție de confortul termic+  1. Verifică starea butoanelor ​(prin întreruperi)
- `dynamic_buzzer(tlux)`: Funcția de siguranță care modulează sunetul ​și verifică starea ​de "​Mute"​ (manuală sau nocturnă).+  2. Achiziționează date de la AHT20, BMP280 ​și ADC (LDR)
 +  3. Procesează datele ​(filtrareconversii). 
 +  4. Actualizează ieșirile PWM (LED-uriBuzzer)
 +  5. Actualizează afișajul LCD în funcție ​de pagina selectată sau meniul activ.
  
-** Interfață și Întreruperi **+---
  
-`ISR(INT1_vect)`:​ Gestionează butonul de "Plus / Mute"+===== 5Stadiul actual al implementării software ===== 
-`ISR(PCINT2_vect)`:​ Gestionează butonul ​de "Minus / Schimbare Unități".+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 șmeniul interactiv cu salvare în EEPROM rulează asincron, fără blocaje ale buclei principale.
  
-**Logicã Meniu:**  +===== 6. Elementul de noutate al proiectului ===== 
-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.+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.
  
-** Fluxul Principal (`loop`) **+===== 7. Justificarea utilizării funcționalităților din laborator =====
  
-Programul urmează o structură de tip mașină de stări:+^ 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. |
  
-1Verifică starea ​butoanelor (prin întreruperi).+===== 8Scheletul 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()''​.
  
-2. Achiziționează date de la AHT20BMP280 ​și ADC (LDR).+**Validarea funcționării:** Sistemul a fost validat prin monitorizarea datelor trimise în paralel pe un port serial virtualcâ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).
  
-3Procesează datele ​(filtrareconversii).+===== 9Calibrarea 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.
  
-4Actualizează ieșirile PWM (LED-uriBuzzer).+===== 10Optimiză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 necesarprotejând durata de viață a celulelor EEPROM (limitate la 100.000 de cicluri de scriere).
  
-5Actualizează afișajul LCD în funcție de pagina selectată sau meniul activ. +===== 11Demo Video Proiect ===== 
-Iată secțiunea **Rezultate Obținute** rescrisă în sintaxă **DokuWiki**,​ eliminând orice referință la fișiere media sau imagini, păstrând doar structura de text, tabele și liste:+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.
  
 +**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 ======
  
pm/prj2026/atoader/anicolaescu2602.1778963835.txt.gz · Last modified: 2026/05/16 23:37 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