This is an old revision of the document!


Mini Statie Meteo cu afisaj digital

Introducere

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).

Descriere generală

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.

Hardware Design

Piesa Link Tip Utilizare
ATMEGA328 microcontrolerPlaca dezvoltare Arduino UNO R3 ATMEGA328P Baza dezvoltare
Modul senzor AHT20 si BMP280Modul senzor temperatura, umiditate, presiuneI2C
Modul senzor de lumina ambientala TEMT6000Modul senzor lumina ambientalaADC
LCD cu convertor I2C LCD cu convertor I2CI2C
Buzzer pasiv 3.3V sau 3VBuzzer pasivPWM
Modul cu butonModul cu butonGPIO, Intreruperi
Led RGB cu catod comunLeg 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.

Software Design

## 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.

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2026/atoader/anicolaescu2602.1778604244.txt.gz · Last modified: 2026/05/12 19:44 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