Statie Meteo cu Navigatie prin Intreruperi
Introducere
Proiectul reprezinta o statie meteorologica autonoma, capabila sa monitorizeze in timp real temperatura, umiditatea si presiunea atmosferica din mediul ambiant. Datele sunt prelucrate si afisate local pe un ecran OLED de 0.96' sub doua forme: un ecran de date text si trei ecrane dedicate pentru istoricul grafic al fiecarui parametru, completate de statistici de minim si maxim stocate persistent.
Sistemul utilizeaza un potentiometru analogic pentru navigarea fluida intre ecrane. Schimbarea paginilor este gestionata in fundal prin intreruperi hardware. Codul este scris integral in C pentru microcontrolerul ATmega328P, lucrand direct la nivel de registri hardware, fara a apela la biblioteci high-level din ecosistemul Arduino.
Ideea de pornire: Dorinta de a dezvolta un sistem de telemetrie compact si independent, care nu doar afiseaza valori instantanee, ci construiește un istoric vizual direct pe un ecran de rezolutie mica. Prin eliminarea comunicatiei UART, statia devine un dispozitiv portabil prin conectarea la o baterie de 9V, capabil sa retina recordurile climatice chiar si dupa intreruperea alimentarii.
Utilitate: Monitorizarea microclimatului ambiental cu un grad ridicat de precizie si analizarea tendintelor meteorologice pe termen scurt prin intermediul graficelor cu axe si grid renderizate bitwise.
Descriere generala
Sistemul este organizat in jurul microcontrolerului ATmega328P, care gestioneaza perifericele in mod concurent:
Microcontrolerul (Master): Gestioneaza citirea senzorilor, logica de stocare si generarea semnalelor video. Foloseste un Timer hardware pe post de ceas de sistem pentru a esantiona datele de control fara a bloca procesarea grafica.
Modul BME280 (I2C Slave 1): Preia schimbarile fizice de temperatura, presiune si umiditate si le transmite digital prin protocolul I2C.
Display OLED SSD1306 (I2C Slave 2): Afiseaza ecranele de text, structura grid-ului si graficele de evolutie pe baza comenzilor si datelor transmise de Master.
Interfata de Control (Potentiometru): Genereaza o tensiune variabila (0-5V) citita de modulul ADC intern al microcontrolerului, mapata direct pe indexul ecranului selectat.
Hardware Design
BOM (Bill Of Materials):
Placa de dezvoltare Arduino Uno (microcontroler ATmega328P) - 1 buc.
Senzor de mediu BME280 (Temperatura, Umiditate, Presiune) - 1 buc.
Display OLED 0.96” I2C (SSD1306) - 1 buc.
Potentiometru liniar (10k Ω) pentru navigare - 1 buc.
Breadboard (Placa de teste) - 1 buc.
Fire de conexiune (Jumper wires) - 1 set.
Schema Electrica (Conexiuni principale):
Toate perifericele digitale impart aceeasi magistrala I2C, conectate in paralel la pinii hardware dedicati ai portului C:
BME280 & OLED: Pinii VCC se alimenteaza corespunzator, GND merge la masa comuna, SDA se conecteaza la pinul A4 (PC4 / TWI Data), iar SCL la pinul A5 (PC5 / TWI Clock).
Potentiometru (Navigatie): Pinii de margine sunt conectati la 5V si GND pentru a crea divizorul de tensiune, iar pinul central (Wiper) este conectat la intrarea analogica A0 (PC0 / ADC Channel 0).
Software Design
Mediu de dezvoltare: VS Code cu extensia PlatformIO (compilator avr-gcc).
Abordare “Bare-Metal”: Nu se folosesc biblioteci externe (ex: Wire.h sau Adafruit_SSD1306). Toate protocoalele si driverele de periferic sunt scrise prin manipulare de registri.
Concepte si algoritmi din laboratoare:
Laboratorul 2 (Intreruperi): Implementarea unei rutine de serviciu a intreruperii (ISR) atasata Timer-ului 1. Navigatia sistemului nu ruleaza secvential, ci este asincrona, intrerupand executia buclei principale pentru a asigura fluiditatea tranzitiei ecranelor.
Laboratorul 3 (Timere): Configurarea Timer1 in modul CTC (Clear Timer on Compare Match) cu un prescaler de 1024 si prag setat in OCR1A. Acesta asigura ticaitul hardware precis la fiecare 100ms pentru esantionarea interfetei.
Laboratorul 4 (ADC): Configurarea registrului ADMUX (referinta AVCC) si ADCSRA (prescaler 128 pentru rezolutie maxima de 10 biți). Conversia este declansata in interiorul ISR-ului pentru a citi pozitia potentiometrului.
Laboratorul 6 (I2C): Initializarea modulului TWI din registrele TWBR si TWSR la o frecventa de 100kHz, gestionand secventele de START, STOP, Write si Read cu ACK/NACK pentru ecran si senzor.
Stocare Persistenta (EEPROM): Utilizarea registrelor EEAR, EEDR si EECR pentru a salva si citi persistent recordurile istorice absolute de Max/Min ale statiei, implementand un algoritm de auto-recalibrare la prima pornire dintr-o stare virgina (0xFF).
Algoritmul de Grafica: Shiftarea in timp real a array-urilor de istoric (scrolling efect) si utilizarea operatiilor pe biti (bitwise shifting) pentru a randa barele verticale ale graficului peste un grid punctat pre-calculat.
Rezultate Obţinute
S-a obtinut un sistem embedded complet si stabil. Potentiometrul permite selectarea a 5 ecrane distincte (Intro, Date Live, Grafic Temp, Grafic Presiune, Grafic Umiditate). Ecranele de grafica randeaza corect evolutia pe 128 de puncte, iar pe randul secundar afiseaza din EEPROM extremele inregistrate (Max si Min) cu o precizie stabila de doua zecimale, fara artefacte vizuale sau pâlpâiri (flicker), datorita managementului corect al functiei de clear selectiv.
Concluzii
Scrierea codului la nivel de registru a evidentiat avantajele optimizarii de spatiu si viteza specifice programarii low level. Integrarea timerelor si a intreruperilor a permis decuplarea logicii de afisare de cea de achizitie. Sistemul rezultat este robust, retine datele critic-istorice in mod nevolatil si reprezinta o aplicatie practica completa a conceptelor de interactiune hardware-software studiate.
Download
Jurnal
Bibliografie/Resurse
Datasheet ATmega328P (Microchip).
Datasheet Senzor BME280 (Bosch Sensortec).
Datasheet Display OLED SSD1306 (Solomon Systech).
Suport de Laborator PM 2026: Lab 2 (Intreruperi), Lab 3 (Timere), Lab 4 (ADC), Lab 6 (I2C).