This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:anicolaescu2602 [2026/05/12 19:42] 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$). | + | **Algoritmul Magnus-Tetens:** Utilizat pentru calcularea punctului de rouă pe baza temperaturii și umidității. |
| - | * **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. | + | **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) ** | ** 4. Surse și funcții implementate (Etapa 3) ** | ||
| Line 103: | Line 107: | ||
| ** 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. | + | |
| + | **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`) ** | ** Fluxul Principal (`loop`) ** | ||
| Line 125: | Line 131: | ||
| 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> | + | Î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. | ||
| - | ===== Concluzii ===== | + | 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ți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | | 20.04.2026 | Documentare și 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> | ||