Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 hardwareCodul este scris integral in C pentru microcontrolerul ATmega328Plucrand direct la nivel de registri hardwarefara 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 UARTMai multstaț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 independentcare nu doar afiseaza valori instantaneeci construiește un istoric vizual direct ​pe un ecran de rezolutie mica. Prin eliminarea comunicatiei UARTstatia 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 datedemonstrând interconectarea mai multor periferice (I2C pentru senzori/​displayTimer pentru scheduling, USART pentru comunicație PC). Codul va fi scris "​bare-metal"​ în C pe arhitectura ATmega328Pfă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ăț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țieitrezind 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-SDAA5-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 firecomponentele 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 tensiuneiar pinul central ​(Wipereste 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 externeToate 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ă ​BME280 ​(ex: 0x76) și OLED (ex: 0x3C). +    * **Laboratorul 2 (Intreruperi):** Implementarea unei rutine de serviciu ​intreruperii ​(ISRatasata 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 fixeevitâ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 interfeteidecuplat 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).
pm/prj2026/victor.stoica0203/degeratu_razvan.1778154008.txt.gz · Last modified: 2026/05/07 14:40 by razvan.degeratu
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