This is an old revision of the document!
Acest proiect constă într-o stație meteorologică inteligentă, capabilă să măsoare și să proceseze în timp real temperatura, umiditatea relativă, presiunea atmosferică și nivelul de iluminare ambientală. Datele sunt afișate pe un ecran LCD prin protocolul I2C. Sistemul este unul interactiv și adaptiv: utilizatorul poate naviga între pagini de monitorizare, poate schimba unitățile de măsură (C/F/K, mmHg/hPa, m/ft) și poate configura pragurile de alertă printr-un meniu dedicat. Experiența este completată de un sistem de feedback vizual bazat pe tranziții de culoare (LED RGB) și un sistem acustic dinamic (Buzzer).
Scopul proiectului: Crearea unui instrument de precizie pentru monitorizarea microclimatului, oferind utilizatorului nu doar date brute, ci și informații procesate (prognoză, punct de rouă, altitudine) și alerte personalizabile.
Ideea de la care am pornit: Proiectul a evoluat de la un simplu experiment cu semnale PWM la un sistem complex de monitorizare a mediului. Am păstrat componenta de feedback reactiv, dar am transformat-o într-o interfață de comunicare non-verbală cu utilizatorul: culorile LED-ului nu sunt doar decorative, ci reprezintă o hartă termică a confortului.
Utilitate: Stația este esențială pentru optimizarea spațiului de lucru, prevenind disconfortul termic sau oboseala oculară (prin monitorizarea luxilor). Pentru dezvoltatori, codul reprezintă un studiu de caz în optimizarea resurselor AVR: utilizarea EEPROM pentru salvarea setărilor, implementarea algoritmului Magnus-Tetens pentru punctul de rouă și filtrarea digitală a semnalelor barometrice.
Laboratoare folosite: ADC (Lumină), I2C (Senzori & LCD), PWM si Timere (RGB & Buzzer), Întreruperi(Butoane).
Arhitectura software a sistemului este construită în jurul unei bucle de monitorizare non-blocking care gestionează achiziția de date de la senzori digitali de înaltă precizie (AHT20 și BMP280). Sistemul este versatil, operând în două moduri principale: Modul Monitorizare (afișarea datelor pe 3 pagini distincte) și Modul Meniu (configurarea pragurilor de operare).
1. Interfața și Navigarea (Control prin Întreruperi) Utilizatorul interacționează cu stația prin trei butoane gestionate prin întreruperi (INT1 și PCINT2), asigurând un răspuns instantaneu al interfeței:
Navigare Pagini: Comutarea între temperatura/umiditate, presiune/prognoză și altitudine/lux.
Meniu Configurare: Prin apăsarea lungă a butonului principal, se intră într-o interfață ce permite setarea pragurilor T_min, T_max, H_low, H_high și a offset-ului de altitudine. Aceste valori sunt salvate în EEPROM, fiind persistente la oprirea alimentării.
Conversie Unități: Schimbarea în timp real a scărilor de măsură (Celsius, Fahrenheit, Kelvin etc.).
2. Feedback Automatizat și Logică de Decizie
A. Feedback Acustica Dinamic (Buzzer PWM) Sistemul integrează un buzzer pasiv controlat prin Timer 0 în mod Fast PWM. Spre deosebire de o alarmă on/off, intensitatea sunetului este proporțională cu gravitatea abaterii termice.
Gestiune Inteligentă: Alerta sonoră este inhibată automat în condiții de lumină scăzută (Mod Noapte, sub 10 Lux) sau manual prin funcția Mute, prevenind deranjul fonic inutil.
B. Feedback Optic Avansat (Tranziții RGB & Indicatori Umiditate) Sistemul utilizează o logică de semnalizare stratificată pentru a oferi o citire rapidă a confortului ambiental:
Indicator Termic (LED RGB): Implementează o tranziție fluidă de culori folosind funcția map() pe 3 canale PWM.
Albastru: Temperatură sub pragul T_min.
Verde (Optim): Când temperatura tinde spre valoarea T_opt.
Roșu: Temperatură peste pragul T_max.
Culori intermediare: Sistemul generează nuanțe de tranziție (ex. galben/portocaliu) pe măsură ce temperatura urcă spre pragul critic.
Indicator Umiditate (LED-uri Discrete): Trei ieșiri digitale dedicate semnalizează starea aerului:
Albastru (Low): Umiditate sub pragul de confort (aer uscat).
Verde (OK): Intervalul ideal de confort (setat prin meniu).
Roșu (High): Umiditate excesivă.
3. Procesare Digitală și Calcule Complexe Filtrare Barometrică: Presiunea este trecută printr-un filtru de medie mobilă (smooth_pressure) pentru a elimina fluctuațiile cauzate de curenții de aer.
Prognoză și Altitudine: Sistemul calculează prognoza bazată pe tendința barometrică și altitudinea relativă folosind formula barometrică, compensată cu datele de calibrare citite direct din senzorul BMP280.
Punct de Rouă: Calculat matematic pentru a avertiza utilizatorul asupra condițiilor de condens.
| Piesa | Link | Tip Utilizare |
|---|---|---|
| ATMEGA328 microcontroler | Placa dezvoltare Arduino UNO R3 ATMEGA328P | Baza dezvoltare |
| Modul senzor AHT20 si BMP280 | Modul senzor temperatura, umiditate, presiune | I2C |
| Modul senzor de lumina ambientala TEMT6000 | Modul senzor lumina ambientala | ADC |
| LCD cu convertor I2C | LCD cu convertor I2C | I2C |
| Buzzer pasiv 3.3V sau 3V | Buzzer pasiv | PWM |
| Modul cu buton | Modul cu buton | GPIO, Intreruperi |
| Led RGB cu catod comun | 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.
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.
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ă. 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`.
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 (Etapa 3)
Codul este modularizat pe funcționalități cheie, cele mai importante fiind:
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.
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ă).
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.
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. 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:
Î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 16×2 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.
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).
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.
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.
| Dată | Etapă / Activitate | Descriere și Rezultate |
|---|---|---|
| 20.04.2026 | Documentare și Setup | Analiza senzorilor AHT20 și BMP280. Stabilirea schemei de pini pe ATmega328P. |
| 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. |