Differences

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

Link to this comparison view

pm:prj2026:atoader:anicolaescu2602 [2026/05/12 19:41]
anicolaescu2602 [Software Design]
pm:prj2026:atoader:anicolaescu2602 [2026/05/12 20:22] (current)
anicolaescu2602 [Resurse Hardware (Datasheets)]
Line 76: Line 76:
 ===== Software Design ===== ===== Software Design =====
  
-## 1. Mediu de dezvoltare+**1. Mediu de dezvoltare**
  
 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. 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.
  
-## 2. Librării și surse 3rd-party+** 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: 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/​interrupt.h**:​ Pentru gestionarea vectorilor de întrerupere (butoane). 
-**avr/​eeprom.h**:​ Pentru stocarea permanentă a pragurilor de alertă. + ​**avr/​eeprom.h**:​ Pentru stocarea permanentă a pragurilor de alertă. 
-**math.h**: Pentru implementarea formulelor logaritmice (punct de rouă) și a puterilor (altitudine). + ​**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`.+ ​**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`.
  
-## 3. Algoritmi și structuri de date+** 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+ **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 (Etapa 3)+ ​**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 (Etapa 3) **
  
 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. + `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. + ​`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.+ ​**Timere (PWM):** Configurare manuală a `Timer0` (pentru Buzzer și Blue LED) și `Timer1` (pentru Red și Green LED) în modul Fast PWM.
  
-## Achiziție și Procesare Date ##+** Achiziție și Procesare Date **
  
-`bmp_read_calibration()`:​ Funcție critică ce citește coeficienții unici de calibrare din memoria senzorului BMP280. + `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. + ​`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. + ​`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ă).+ ​`dynamic_buzzer(t,​ lux)`: Funcția de siguranță care modulează sunetul și verifică starea de "​Mute"​ (manuală sau nocturnă).
  
-## Interfață și Întreruperi ​## +** Interfață și Întreruperi ​**
  
-`ISR(INT1_vect)`:​ Gestionează butonul de "Plus / Mute"​. +`ISR(INT1_vect)`:​ Gestionează butonul de "Plus / Mute"​. 
-`ISR(PCINT2_vect)`:​ Gestionează butonul de "Minus / Schimbare Unități"​+`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.+
  
-## Fluxul Principal (`loop`) ​##+**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. 
 + 
 +** Fluxul Principal (`loop`) ​**
  
 Programul urmează o structură de tip mașină de stări: Programul urmează o structură de tip mașină de stări:
  
 1. Verifică starea butoanelor (prin întreruperi). 1. Verifică starea butoanelor (prin întreruperi).
 +
 2. Achiziționează date de la AHT20, BMP280 și ADC (LDR). 2. Achiziționează date de la AHT20, BMP280 și ADC (LDR).
 +
 3. Procesează datele (filtrare, conversii). 3. Procesează datele (filtrare, conversii).
 +
 4. Actualizează ieșirile PWM (LED-uri, Buzzer). 4. Actualizează ieșirile PWM (LED-uri, Buzzer).
 +
 5. Actualizează afișajul LCD în funcție de pagina selectată sau meniul activ. 5. Actualizează afișajul LCD în funcție de pagina selectată sau meniul activ.
-===== Rezultate Obţinute =====+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:
  
-<note tip> +====== Rezultate Obținute ======
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +
-</​note>​+
  
-===== Concluzii =====+În urma implementării și testării stației meteo, s-au obținut următoarele rezultate ce confirmă atingerea obiectivelor propuse:
  
 +** 1. Monitorizarea Mediului cu Înaltă Precizie **
 +Sistemul a demonstrat o capacitate de achiziție de date stabilă, integrând cu succes senzori cu protocoale diferite (I2C și ADC):
 +
 +* **Acuratețe Termică:** Prin senzorul AHT20, sistemul oferă citiri cu o precizie ridicată. Calculul punctului de rouă (Dew Point) este realizat în timp real prin formula Magnus-Tetens,​ oferind informații despre riscul de condens.
 +* **Stabilitate Barometrică:​** Implementarea filtrului de medie mobilă (Moving Average) în funcția ''​smooth_pressure''​ a eliminat fluctuațiile citirilor BMP280, rezultând o afișare stabilă a presiunii.
 +* **Senzitivitate Luminoasă:​** Fotorezistorul permite maparea nivelului de luxi, facilitând funcția de **Mute Automat** pe timp de noapte pentru a proteja confortul utilizatorului.
 +
 +**2. Interfață Utilizator Adaptivă **
 +Afișajul LCD 16x2 a fost optimizat pentru a prezenta datele într-o formă structurată pe **trei pagini dinamice**, navigabile prin butoane:
 +
 +^ Pagina ^ Parametri Afișați ^ Unități de Măsură ^
 +| **0** | Temperatură,​ Umiditate, Punct Rouă | Celsius, Fahrenheit, Kelvin / % |
 +| **1** | Presiune Atmosferică,​ Prognoză Meteo | mmHg, hPa |
 +| **2** | Altitudine Relativă, Luminozitate | metri, picioare (ft) / lux |
 +
 +Comutarea unităților de măsură și a paginilor se realizează instantaneu prin utilizarea întreruperilor externe (**INT1** și **PCINT2**).
 +
 +** 3. Managementul Setărilor și Persistența Datelor**
 +Un rezultat major este implementarea meniului de configurare interactiv:
 +
 +* **Editare în timp real:** Utilizatorul poate modifica pragurile de alertă (T min/max, H low/high) direct din interfața hardware.
 +* **Stocare Permanentă:​** Valorile sunt salvate în **EEPROM**, fiind păstrate chiar și după întreruperea alimentării.
 +* **Siguranță:​** Validarea datelor prin ''​Magic Number''​ previne erorile de sistem la prima inițializare a memoriei.
 +
 +**4. Feedback Senzorial Inteligent**
 +
 +**Feedback Vizual (Sistem LED)**
 +S-a implementat o logică de semnalizare optică stratificată:​
 +
 +* **Indicator Termic (RGB):** Tranziție fluidă de culori (Albastru -> Verde -> Roșu) gestionată prin PWM, oferind o diagnoză vizuală imediată a confortului termic.
 +* **Indicator Umiditate (Discrete):​** Trei LED-uri dedicate semnalizează starea aerului (Uscat, Optim sau Umed) conform pragurilor setate de utilizator.
 +
 +** Feedback Acustic (Buzzer PWM) **
 +Modulul audio acționează ca un sistem de alertă inteligent:
 +
 +* **Dinamică Sonoră:** Sunetul generat prin ''​Timer 0''​ își schimbă intensitatea în funcție de severitatea abaterii de temperatură.
 +* **Inhibare Automată:​** Alerta este dezactivată automat în condiții de întuneric (sub 10 lx) sau manual prin funcția ''​Manual Mute''​ (stare indicată pe ecran prin simbolul ''​[M]''​).
 +
 +**5. Optimizarea Resurselor (Firmware)**
 +Codul sursă a fost scris fără a depinde de biblioteci externe masive, utilizând manipularea directă a regiștrilor pentru protocolul I2C și timerele PWM. Rezultatul este un firmware compact, rapid și eficient, adaptat limitărilor de memorie ale microcontrolerului ATmega328P.
 +
 +
 +====== Concluzii ======
 +
 +Proiectul stației meteo a reprezentat o oportunitate excelentă de a integra concepte fundamentale de electronică și programare embedded într-un dispozitiv util și compact.
 +
 +În urma realizării acestui sistem, pot fi desprinse următoarele idei principale:
 +
 +Eficiența Programării Low-Level: Utilizarea regiștrilor și a protocolului I2C implementat manual a demonstrat că se pot obține performanțe ridicate și un consum minim de memorie (Flash/RAM) fără a depinde de biblioteci comerciale complexe.
 +
 +Interactivitatea și Flexibilitatea:​ Implementarea meniului în EEPROM a transformat un simplu cititor de senzori într-un dispozitiv adaptiv, capabil să răspundă nevoilor specifice ale utilizatorului prin calibrare și setarea pragurilor de alertă.
 +
 +Importanța Prelucrării Datelor: Filtrarea semnalelor (prin media mobilă) și utilizarea formulelor climatologice (Magnus-Tetens) au arătat că precizia unei stații meteo nu depinde doar de senzori, ci și de algoritmii de procesare a datelor brute.
 +
 +Feedback-ul Multimodal: Combinarea alertelor vizuale (RGB) cu cele sonore (PWM) și condiționarea acestora de factori externi (Lumină/​Lux) oferă o experiență de utilizare sigură și non-intruzivă.
 +
 +În concluzie, stația meteo realizată este un sistem robust și versatil, care reușește să centralizeze monitorizarea complexă a mediului ambiant într-o interfață simplă și eficientă, fiind o bază solidă pentru extinderi viitoare (ex: conectivitate IoT sau logarea datelor pe card SD).
 ===== Download ===== ===== Download =====
  
Line 144: Line 209:
 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**. 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>​ </​note>​
 +
 +{{:​pm:​prj2026:​atoader:​anicolaescu2602_download.zip|}}
  
 ===== Jurnal ===== ===== Jurnal =====
 +Această secțiune documentează etapele parcurse în dezvoltarea proiectului,​ evidențiind principalele sarcini și modul în care au fost soluționate problemele tehnice întâmpinate.
  
-<note tip> +^ Dată ^ Etapă / Activitate ^ Descriere și Rezultate ^ 
-Putețavea și o secțiune de jurnal în care să poată urmări asistentul ​de proiect progresul proiectului+| 20.04.2026 | Documentare șSetup | Analiza senzorilor AHT20 și BMP280. Stabilirea schemei de pini pe ATmega328P. | 
-</​note>​ +| 25.04.2026 | Drivere I2C Low-Level | Implementarea manuală a protocolului TWI. Testarea comunicației cu LCD-ul (adresa 0x27). | 
 +| 02.05.2026 | Achiziție Date Senzori | Citirea datelor brute de la AHT20. Implementarea logică pentru controlul LED-ului RGB. | 
 +| 05.05.2026 | Calibrare și Filtrare | Integrarea BMP280. Implementarea filtrului de medie mobilă pentru presiune (10 eșantioane). | 
 +| 08.05.2026 | Interfață și Meniu | Implementarea logică pentru pagini multiple pe LCD și meniul de setări praguri. | 
 +| 10.05.2026 | Gestiune Memorie | Integrarea logică EEPROM pentru salvarea permanentă a pragurilor setate ​de utilizator| 
 +| 11.05.2026 | Alerte și Mod Noapte | Implementarea PWM dinamic pentru Buzzer și a logicii de silențios bazată pe LDR (Lux). | 
 +| 12.05.2026 | Finalizare și Wiki | Curățarea codului, realizarea Makefile-ului și finalizarea documentației pe Wiki. |
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
Line 156: Line 229:
 Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.
 </​note>​ </​note>​
 +
 +===== Resurse Hardware (Datasheets) =====
 +Documentația oficială utilizată pentru înțelegerea hărții regiștrilor și a protocoalelor de comunicare:
 +
 +Atmel ATmega328P: [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet complet (Architecture,​ Registers, Timers)]].
 +
 +Bosch BMP280: [[https://​www.bosch-sensortec.com/​media/​boschsensortec/​downloads/​datasheets/​bst-bmp280-ds001.pdf|Digital Pressure Sensor Datasheet]] (utilizat pentru formulele de compensare și calibrare).
 +
 +Cursurile si laboratoarele din cadrul cursului de Proiectarea cu Microprocesoare
 +
 +
 +===== Resurse Software =====
 +Uneltele și mediile de programare care au facilitat dezvoltarea proiectului:​
 +
 +PlatformIO Core: [[https://​docs.platformio.org/​|Documentație oficială]] pentru managementul proiectului și al build-ului.
 +
 +AVR Libc Home Page: [[https://​www.nongnu.org/​avr-libc/​user-manual/​index.html|Standard C library for AVR]] (referință pentru <​avr/​interrupt.h>​ și <​avr/​eeprom.h>​).
 +
 +Formula Magnus-Tetens:​ [[https://​en.wikipedia.org/​wiki/​Dew_point|Dew Point Calculation Methodology]] (calculul punctului de rouă).
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2026/atoader/anicolaescu2602.1778604091.txt.gz · Last modified: 2026/05/12 19:41 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