This shows you the differences between two versions of the page.
|
pm:prj2026:victor.stoica0203:degeratu_razvan [2026/05/07 14:40] razvan.degeratu created |
pm:prj2026:victor.stoica0203:degeratu_razvan [2026/05/24 22:55] (current) razvan.degeratu [Download] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Stație Meteo "Smart" cu Interfață Duală (CLI și OLED) ====== | + | ====== Statie Meteo cu Navigatie - Degeratu Razvan-Andrei ====== |
| ===== Introducere ===== | ===== 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. | ||
| - | **Ce face proiectul:** | + | 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. |
| - | Proiectul este o stație meteorologică capabilă să citească temperatura, umiditatea și presiunea atmosferică din mediul ambiant. Datele sunt afișate local pe un ecran OLED, dar sunt și trimise simultan către un PC prin intermediul interfeței UART. Mai mult, stația dispune de o interfață de tip Command Line (CLI) prin care utilizatorul poate trimite comenzi de la PC pentru a interoga istoricul măsurătorilor, a opri/porni ecranul sau a cere statistici. | + | |
| - | **Scopul lui:** | + | **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 istoricul climatic chiar si dupa intreruperea alimentarii. |
| - | Scopul este de a construi un sistem complet de telemetrie și achiziție de date, demonstrând interconectarea mai multor periferice (I2C pentru senzori/display, Timer pentru scheduling, USART pentru comunicație PC). Codul va fi scris "bare-metal" în C pe arhitectura ATmega328P, fără a apela la bibliotecile high-level specifice mediului Arduino. | + | |
| - | **Ideea de pornire:** | + | **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. |
| - | Am dorit să depășesc stadiul unei simple stații care doar afișează numere pe un ecran, adăugând componenta de conectivitate cu PC-ul pentru posibilitatea de data logging. Astfel, am îmbinat necesitatea măsurării fizice (I2C) cu interacțiunea software avansată (UART + Întreruperi). | + | |
| - | **Utilitate:** | + | ===== Ipoteza ===== |
| - | Proiectul este util pentru monitorizarea microclimatului dintr-o cameră, iar datele trimise prin UART pot fi preluate ușor de scripturi externe pe PC pentru a genera grafice în timp real. | + | Cred că scrierea codului exclusiv la nivel de regiștri, fără utilizarea bibliotecilor de nivel înalt, va îmbunătăți semnificativ performanța, va reduce dramatic amprenta de memorie SRAM și va asigura fluiditatea afișării pe ecranul OLED (refresh rate stabil), deoarece elimină overhead-ul funcțiilor din biblioteci și permite actualizarea asincronă a ecranului și citirea senzorilor direct în bucla principală, cu temporizare hardware. |
| - | + | ||
| - | ===== Descriere generală ===== | + | |
| - | + | ||
| - | Arhitectura proiectului este de tip Master-Slave pe I2C pentru componentele fizice și Client-Server simplu prin UART pentru interfața cu PC-ul. | + | |
| - | * **Microcontrolerul (Master):** Un Arduino cu ATmega328P folosește un Timer hardware pentru a da ritmul aplicației, trezind sistemul periodic pentru a face citiri. | + | |
| - | * **Modul BME280 (I2C Slave 1):** Preia datele fizice brute și le transmite microcontrolerului. | + | |
| - | * **Display OLED (I2C Slave 2):** Primește datele formatate de la microcontroler și le afișează. | + | |
| - | * **PC (Interfață UART):** Acționează ca un terminal de unde se pot da comenzi (via întreruperi de recepție RX) și unde se primesc log-urile de la stație (TX). | + | |
| - | + | ||
| - | **Schema Bloc:** | + | |
| - | [ PC / Terminal (PuTTY) ] <== UART (TX/RX via cablu USB) ==> [ Microcontroler (ATmega328P pe Arduino) ] | + | |
| - | | | + | |
| - | I2C Bus (A4-SDA, A5-SCL) | + | |
| - | / \ | + | |
| - | [ Senzor BME280 ] [ Display OLED 0.96" ] | + | |
| + | ===== 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 ===== | ===== Hardware Design ===== | ||
| **BOM (Bill Of Materials):** | **BOM (Bill Of Materials):** | ||
| - | * Placă de dezvoltare Arduino Uno sau Nano (ATmega328P) - 1 buc. | + | * Placa de dezvoltare Arduino Uno (microcontroler ATmega328P) - 1 buc. |
| - | * Senzor de mediu BME280 (Temperatură, Umiditate, Presiune) - 1 buc. | + | * Senzor de mediu BME280 (Temperatura, Umiditate, Presiune) - 1 buc. |
| - | * Display OLED 0.96" I2C (driver SSD1306) - 1 buc. | + | * Display OLED 0.96" I2C (SSD1306) - 1 buc. |
| - | * Breadboard (Placă de teste) - 1 buc. | + | * Potentiometru liniar (10k Ω) pentru navigare - 1 buc. |
| + | * Breadboard (Placa de teste) - 1 buc. | ||
| * Fire de conexiune (Jumper wires) - 1 set. | * Fire de conexiune (Jumper wires) - 1 set. | ||
| - | **Schema Electrică (Conexiuni principale):** | + | **Schema Electrica (Conexiuni principale):** |
| - | Deoarece magistrala I2C împarte aceleași fire, componentele se leagă în paralel la pinii dedicați de pe Arduino (SDA = Analog 4, SCL = Analog 5): | + | Toate perifericele digitale impart aceeasi magistrala I2C, conectate in paralel la pinii hardware dedicati ai portului C: |
| - | * **BME280** -> VCC la 3.3V sau 5V (în funcție de modul), GND la GND, SDA la pinul A4 (PC4), SCL la pinul A5 (PC5). | + | * **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). |
| - | * **OLED** -> VCC la 3.3V sau 5V, GND la GND, SDA la pinul A4 (PC4), SCL la pinul A5 (PC5). | + | * **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). |
| - | * **PC/UART** -> Comunicația serială se realizează direct prin cablul USB via chip-ul convertor USB-Serial integrat pe placa Arduino. | + | |
| + | //Schema electrica | ||
| + | {{ :pm:prj2026:victor.stoica0203:degeraturazvanproiectpm.png | }} | ||
| + | |||
| + | // Videoclip demonstrativ | ||
| + | https://www.youtube.com/watch?v=PE-LNIbtaL8 | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| * **Mediu de dezvoltare:** VS Code cu extensia PlatformIO (compilator avr-gcc). | * **Mediu de dezvoltare:** VS Code cu extensia PlatformIO (compilator avr-gcc). | ||
| - | * **Abordare "Bare-Metal":** Se va evita folosirea bibliotecilor standard Arduino (precum `Wire.h`). Comunicația I2C (TWI) va fi scrisă din registre (`TWCR`, `TWSR`, `TWDR`). | + | * **Abordare "Bare-Metal":** Nu se folosesc biblioteci externe. Toate protocoalele si driverele de periferic sunt scrise prin manipulare de registri. |
| - | * **Concepte și algoritmi:** | + | * **Concepte si algoritmi din laboratoare:** |
| - | * **I2C (Lab 6):** Setarea magistralei ca Master, adresarea corectă a BME280 (ex: 0x76) și OLED (ex: 0x3C). | + | * **Laboratorul 2 (Intreruperi):** Implementarea unei rutine de serviciu a intreruperii (ISR) atasata Timer-ului 1. Navigatia sistemului nu ruleaza secvential, ci asincron, asigurand fluiditatea tranzitiei ecranelor. |
| - | * **Timere (Lab 2):** Folosirea Timer1/Timer2 în mod CTC pentru a genera întreruperi hardware la intervale fixe, evitând delay-urile blocante (`_delay_ms`). | + | * **Laboratorul 3 (Timere):** Configurarea Timer1 in modul CTC cu un prescaler de 1024 si prag setat in OCR1A. Asigura ticaitul hardware precis la fiecare 100ms pentru esantionarea interfetei, decuplat de restul codului. |
| - | * **UART (Lab 1):** Configurarea interfeței pentru debugging și interfață CLI; folosirea întreruperilor `RXCIE0` pentru preluarea comenzilor de pe PC. | + | * **Laboratorul 4 (ADC):** Configurarea registrului ADMUX (referinta AVCC) si ADCSRA. Conversia este declansata regulat pentru a citi pozitia potentiometrului de navigare. |
| + | * **Laboratorul 6 (I2C):** Initializarea modulului TWI la o frecventa de 100kHz, gestionand secventele de START, STOP, Write si Read cu ACK/NACK pentru display si senzorul BME280. | ||
| + | * **Memoria EEPROM:** Utilizarea registrelor EEAR, EEDR si EECR pentru a salva persistent istoricele absolute de Max/Min ale statiei. | ||
| - | ===== Rezultate Obţinute ===== | + | ===== Elemente de Noutate ===== |
| + | * **Randare Grafica fara Framebuffer:** In mod normal, ecranele OLED folosesc un buffer de 1024 bytes in RAM (jumatate din SRAM-ul ATmega328P). Proiectul implementeaza calcularea si afisarea grid-ului grafic strict matematic, trimitand octetii direct pe I2C fara stocare intermediara, optimizand memoria RAM. | ||
| + | * **Resetare Hardware din Software (EEPROM Wipe):** Am implementat o functie ascunsa de curatare a istoricului vechi. Daca utilizatorul tine potentiometrul rotit complet la dreapta (valoare ADC > 1010) continuu timp de 10 secunde, se declanseaza automat o rutina ce suprascrie zona de memorie EEPROM alocata cu valoarea `0xFF` si reseteaza statisticile, cu un mesaj de feedback vizual ("RECORDS RESET!"). | ||
| - | *(Se va completa la Etapa 3)* | + | ===== Metrici si Evaluare ===== |
| + | **Metrici de performanță stabilite și îndeplinite:** | ||
| + | 1. **Amprenta de memorie:** Obiectiv: sub 20% ocupare RAM. Prin scrierea la nivel de registre și renunțarea la framebuffer, utilizarea SRAM a scăzut drastic, lăsând spațiu liber pentru array-urile istorice. | ||
| + | 2. **Timpul de răspuns al interfeței:** Obiectiv: <100ms lag. Măsurat prin setarea Timer1 să eșantioneze potențiometrul la 10Hz. Sistemul reacționează instant la rotirea potențiometrului. | ||
| + | 3. **Refresh Rate Stabil:** Menținerea unei bucle principale care redesenează ecranele grafice la ~20 FPS (asigurat prin `_delay_ms(50)`). | ||
| - | ===== Concluzii ===== | + | **Profilarea Codului:** |
| + | Evaluarea codului s-a realizat prin testare unitară. Inițial, am validat transmisia I2C izolată către OLED trimițând octeți individuali din datasheet-ul SSD1306. Apoi am integrat rutinele complexe (formulele de calibrare Bosch pentru BME280 pe int32_t). Corectitudinea memoriei a fost validată prin întreruperea repetată a alimentării și verificarea citirii corecte din registrele EEPROM la repornire. Siguranța execuției a fost testată rulând stația non-stop timp de >12h. | ||
| - | *(Se va completa la finalul proiectului)* | + | ===== Planificare si Jurnal ===== |
| + | Munca a fost planificată modular, de la hardware spre software. | ||
| - | ===== Download ===== | + | * **Săptămâna 1:** Documentare documentații (Datasheets BME280, SSD1306), achiziție piese, realizarea schemei electrice de bază. |
| + | * **Săptămâna 2:** Implementarea rutinei I2C pe baza laboratorului 6 și testarea conexiunii (ACK) cu ambele slave-uri de pe magistrală. | ||
| + | * **Săptămâna 3:** Extragerea parametrilor de calibrare BME280 din ROM-ul senzorului. Setarea Timer-ului 1 și a ADC-ului pentru potențiometru. | ||
| + | * **Săptămâna 4:** Dezvoltarea algoritmului de randare grafică fără framebuffer și logică de stocare Max/Min în registrele EEPROM. | ||
| + | * **Săptămâna 5:** Implementarea secvenței de Reset EEPROM, asamblarea finală a componentelor și redactarea documentației Wiki. | ||
| - | *(Se va completa la final cu arhiva codului și schemele pdf)* | + | ===== Rezultate Obţinute ===== |
| + | Am obtinut un sistem embedded complet, portabil si stabil. Potentiometrul permite selectarea a 5 ecrane distincte. Ecranele de grafica randeaza corect evolutia climatului, iar sistemul afiseaza permanent extremele inregistrate, fara artefacte vizuale, cu un consum minim de memorie si o implementare hardware curată, fără fire expuse haotic. | ||
| - | ===== Jurnal ===== | + | ===== 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 confirma pe deplin ipoteza initiala, este robust, retine datele critic-istorice in mod nevolatil si reprezinta o aplicatie practica excelenta a conceptelor studiate. | ||
| - | * **07 Mai 2026:** Stabilirea temei și a perifericelor (BME280, OLED). S-a clarificat funcționalitatea interfeței UART ca CLI (Command Line Interface) pentru a atinge multiple concepte de curs (Timere, I2C, USART cu întreruperi). Crearea structurii wiki și a BOM-ului. | + | ===== Download ===== |
| + | * Codul sursă complet al proiectului: [[https://github.com/razvandegeratu/StatieMeteo|Repository GitHub]] | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | |||
| * Datasheet ATmega328P (Microchip). | * Datasheet ATmega328P (Microchip). | ||
| * Datasheet Senzor BME280 (Bosch Sensortec). | * Datasheet Senzor BME280 (Bosch Sensortec). | ||
| - | * Datasheet Display OLED SSD1306. | + | * Datasheet Display OLED SSD1306 (Solomon Systech). |
| - | * Laboratorul 1, 2 și 6 de la cursul PM. | + | * Suport de Laborator PM 2026: Lab 2 (Intreruperi), Lab 3 (Timere), Lab 4 (ADC), Lab 6 (I2C). |