Differences

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

Link to this comparison view

pm:prj2026:atoader:stefan.covaliu [2026/05/24 13:49]
stefan.covaliu [Software Design]
pm:prj2026:atoader:stefan.covaliu [2026/05/24 23:43] (current)
stefan.covaliu [Demo Video]
Line 20: Line 20:
   * **Fotorezistor LDR GL5528** : conectat intr-un divizor de tensiune cu o rezistenta de 10kΩ la GND. Punctul de mijloc este citit pe pinul A0 prin ADC-ul intern pe 10 biti. Valoarea citita determina cat de multa componenta calda se adauga in culoarea finala.   * **Fotorezistor LDR GL5528** : conectat intr-un divizor de tensiune cu o rezistenta de 10kΩ la GND. Punctul de mijloc este citit pe pinul A0 prin ADC-ul intern pe 10 biti. Valoarea citita determina cat de multa componenta calda se adauga in culoarea finala.
   * **Modul RTC DS3231** : tine ora exacta inclusiv la oprirea alimentarii,​ datorita bateriei CR2032. Comunicatia se face prin I2C: SDA pe A4, SCL pe A5. Ora citita determina automat profilul de culoare al momentului din zi.   * **Modul RTC DS3231** : tine ora exacta inclusiv la oprirea alimentarii,​ datorita bateriei CR2032. Comunicatia se face prin I2C: SDA pe A4, SCL pe A5. Ora citita determina automat profilul de culoare al momentului din zi.
-  * **Display OLED SH1106 1.3"** : afiseaza modul activ, culoarea curenta si ora. Comunicatia se face prin SPI hardware: SCK pe D13, MOSI pe D11, CS pe D10, DC pe D7, RST pe D4. Actualizat o data pe secunda. +  * **Display OLED SSD1306 0.96"** : afiseaza modul activ, culoarea curenta si ora. Comunicatia se face prin SPI hardware: SCK pe D13, MOSI pe D11, CS pe D10, DC pe D7, RST pe D4. Actualizat o data pe secunda. 
-  * **3x MOSFET ​IRLZ44N** : tranzistori N-Channel Logic Level care controleaza independent cele trei canale RGB prin PWM. Gate-urile sunt conectate la D3 (rosu), D5 (verde) si D6 (albastru). Se deschid complet la 5V pe gate.+  * **3x MOSFET ​LR7843** : tranzistori N-Channel Logic Level care controleaza independent cele trei canale RGB prin PWM. Gate-urile sunt conectate la D3 (rosu), D5 (verde) si D6 (albastru). Se deschid complet la 5V pe gate.
   * **3x LED discret (Rosu, Verde, Albastru)** - elementele de iluminat. Fiecare LED are un rezistor de 220Ω in serie pe anod conectat la 5V, iar catodul conectat la Drain-ul MOSFET-ului corespunzator.   * **3x LED discret (Rosu, Verde, Albastru)** - elementele de iluminat. Fiecare LED are un rezistor de 220Ω in serie pe anod conectat la 5V, iar catodul conectat la Drain-ul MOSFET-ului corespunzator.
   * **Buton tactil** : conectat la D2 cu pull-up de 10kΩ la 5V. Genereaza intrerupere externa pe INT0 la apasare. Cicleza intre modurile de functionare si are prioritate maxima in logica sistemului.   * **Buton tactil** : conectat la D2 cu pull-up de 10kΩ la 5V. Genereaza intrerupere externa pe INT0 la apasare. Cicleza intre modurile de functionare si are prioritate maxima in logica sistemului.
-  * **Regulator L7805** - converteste tensiunea sursei externe de 24V la 5V stabili pentru microcontroler si toate modulele.+  * **Regulator L7805** - converteste tensiunea sursei externe de 12V la 5V stabili pentru microcontroler si toate modulele.
  
 ==== Module Software ==== ==== Module Software ====
Line 34: Line 34:
   * **Calcul temperatura culoare** : combina valorile LDR si RTC pentru a calcula tripletul RGB final. Trece lin de la (255, 200, 100) seara la (200, 220, 255) dimineata.   * **Calcul temperatura culoare** : combina valorile LDR si RTC pentru a calcula tripletul RGB final. Trece lin de la (255, 200, 100) seara la (200, 220, 255) dimineata.
   * **Control PWM canale RGB** : aplica valorile RGB calculate pe D3, D5, D6, controlând duty cycle-ul pentru fiecare MOSFET.   * **Control PWM canale RGB** : aplica valorile RGB calculate pe D3, D5, D6, controlând duty cycle-ul pentru fiecare MOSFET.
-  * **Driver OLED SPI** : actualizeaza display-ul ​SH1106 ​o data pe secunda cu modul activ, valorile RGB curente si ora.+  * **Driver OLED SPI** : actualizeaza display-ul ​SSD1306 ​o data pe secunda cu modul activ, valorile RGB curente si ora.
   * **Logica de prioritizare** : buton fizic > comanda Bluetooth > mod automat (LDR + RTC).   * **Logica de prioritizare** : buton fizic > comanda Bluetooth > mod automat (LDR + RTC).
  
Line 47: Line 47:
 | Placa microcontroller | ATmega328P-XMINI | 1 | | Placa microcontroller | ATmega328P-XMINI | 1 |
 | Modul Bluetooth | HC-06 UART | 1 | | Modul Bluetooth | HC-06 UART | 1 |
-| Display OLED | SH1106 1.3" SPI | 1 |+| Display OLED | SSD1306 0.96" SPI | 1 |
 | Modul RTC | DS3231 I2C | 1 | | Modul RTC | DS3231 I2C | 1 |
-| MOSFET | IRLZ44N ​N-Channel Logic Level | 3 |+| MOSFET | LR7843 ​N-Channel Logic Level | 3 |
 | LED rosu | LED 5mm rosu | 1 | | LED rosu | LED 5mm rosu | 1 |
 | LED verde | LED 5mm verde | 1 | | LED verde | LED 5mm verde | 1 |
Line 63: Line 63:
 | Fire jumper | Male-to-male | ~30 | | Fire jumper | Male-to-male | ~30 |
 | Cablu USB | Micro-USB | 1 | | Cablu USB | Micro-USB | 1 |
-| Sursa alimentare | 24V externa | 1 |+| Sursa alimentare | 12V externa | 1 |
  
 ==== Conexiuni pini ==== ==== Conexiuni pini ====
Line 87: Line 87:
 {{:​pm:​prj2026:​atoader:​schemaElectricaPNG.png?​800|}} {{:​pm:​prj2026:​atoader:​schemaElectricaPNG.png?​800|}}
  
-{{:​pm:​prj2026:​atoader:​SchemaElectricaKiCad.png?800|}}+{{:​pm:​prj2026:​atoader:​schemaelectricakicadBun.png?800|}}
  
 {{:​pm:​prj2026:​atoader:​pozalampargb3.jpg?​200|}} {{:​pm:​prj2026:​atoader:​pozalampargb3.jpg?​200|}}
Line 94: Line 94:
 {{:​pm:​prj2026:​atoader:​LambaRgb5.jpeg?​200|}} {{:​pm:​prj2026:​atoader:​LambaRgb5.jpeg?​200|}}
  
-Video Demo 
-https://​drive.google.com/​file/​d/​1rH4AE9yBBfuPUU4mn2AI_eMcyocapCyA/​view?​usp=sharing 
 ===== Software Design ===== ===== Software Design =====
 +==== Mediu de dezvoltare ====
  
-Githubhttps://​github.com/​CovaliuStefan/​LampaRGB+  * **IDE:** VSCode cu extensia PlatformIO 
 +  * **Framework:** Arduino 
 +  * **Upload:** avrdude cu protocol custom, flags: ''​-P usb -c xplainedmini''​ (protocolul standard din PlatformIO nu functioneaza cu ATmega328P-XMINI) 
 +  * **Monitor serial:** 9600 baud, folosit pentru debug si receptie comenzi Bluetooth
  
-**Mediu de dezvoltare:​** VSCode cu PlatformIO, framework Arduino, upload prin avrdude cu protocol custom (flags: ''​-P usb -c xplainedmini''​).+==== Biblioteci folosite ====
  
-**Librarii folosite:** +^ Biblioteca ^ Scop ^ 
-  ​* ​''​Wire.h'' ​: comunicatie ​I2C cu DS3231 +''​Wire.h'' ​| Comunicatie ​I2C cu DS3231 ​| 
-  ​* ​''​RTClib'' ​: citire ​ora de la DS3231 +''​RTClib'' ​| Citire ​ora si data de la DS3231 ​| 
-  ​* ​''​U8g2lib'' ​: driver display OLED SH1106 prin SPI +''​SPI.h'' ​| Comunicatie ​SPI hardware cu OLED | 
-  ​* ​''​SPI.h'' ​: comunicatie ​SPI hardware+''​Adafruit_GFX'' ​| Biblioteca grafica de baza pentru display | 
 +| ''​Adafruit_SSD1306''​ | Driver display OLED prin SPI |
  
-**Algoritmi implementati:​**+==== Descriere comunicatie periferice ====
  
-Logica principala ruleaza intr-un loop cu trei straturi de prioritate. La fiecare iteratie se verifica intai daca a fost apasata o intrerupere de la buton (flag setat in ISR), apoi daca au sosit date pe UART de la Bluetooth, si in final se ruleaza modul automat bazat pe LDR si RTC.+**UART ​HC-06 Bluetooth ​(D0/D1)**
  
-Calculul temperaturii de culoare combina liniar doua profile: profilul "​rece"​ (R=200G=220B=255) ​si profilul "​cald"​ (R=255, G=180, B=80). Factorul de interpolatie ​este calculat din ora curenta si modulat de valoarea ADC a LDR-ului.+HC-06 functioneaza ca bridge serial wireless la 9600 baud. Microcontrolerul citeste caractere din ''​Serial''​ pana la ''​\n''​apoi parseaza comanda. Comenzile suportate sunt ''​WARM''​''​COOL'',​ ''​AUTO'',​ ''​WHITE'',​ ''​TIME'',​ ''​OFF'' ​si format numeric ''​R G B''​ (ex: ''​200 50 10''​). Pinul RX al modulului ​este protejat printr-un divizor 1kΩ+2kΩ deoarece HC-06 lucreaza la 3.3V logic iar ATmega transmite la 5V.
  
-Intreruperea pe INT0 seteaza un flag atomic si cicleza un contor de mod. Debouncing-ul este realizat software prin ignorarea intreruperilor successive la interval mai mic de 200ms.+**SPI OLED SSD1306 0.96" SPI (D13/​D11/​D10/​D7/​D4)**
  
 +Display-ul este controlat prin SPI hardware. Actualizat o data pe secunda cu ora curenta, valoarea LDR, modul activ si tripletul RGB curent.
  
 +**I2C - DS3231 RTC (A4/A5)**
 +
 +Comunicatia cu RTC-ul se face prin TWI la adresa 0x68. La primul pornire sau dupa pierderea alimentarii bateriei, ora se seteaza automat cu ora compilarii prin ''​rtc.adjust(DateTime(F(__DATE__),​ F(__TIME__)))''​.
 +
 +**ADC - LDR GL5528 (A0)**
 +
 +LDR-ul este conectat intr-un divizor de tensiune cu 10kΩ la GND. Valoarea ADC (0–1023) este mapata la intervalul 0–255 si folosita ca factor de interpolare pentru temperatura de culoare.
 +
 +**GPIO + Intrerupere - Buton (D2)**
 +
 +Butonul este conectat la D2 cu ''​INPUT_PULLUP''​. Debouncing software: apasarea e valida doar daca pinul e LOW cel putin 30ms si au trecut cel putin 300ms de la ultima apasare.
 +
 +**PWM - MOSFETs RGB (D3/​D5/​D6)**
 +
 +Cele trei canale sunt controlate prin Timer0 (D5=OC0B, D6=OC0A) si Timer2 (D3=OC2B). PWM-ul este configurat direct prin registrii hardware TCCR0A, TCCR2A, OCR0A, OCR0B, OCR2B pentru control precis fara overhead Arduino.
 +
 +==== Laboratoare PM utilizate ====
 +
 +^ Laborator ^ Periferal ^ Utilizare in proiect ^
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab0-2024|Lab 0 - GPIO]] | DDRD, PORTD | Configurare pini PWM ca OUTPUT, buton ca INPUT_PULLUP,​ control direct registri |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab1-2023|Lab 1 - UART]] | Serial, USART | Comunicatie cu HC-06 la 9600 baud, parsare comenzi text, debug serial |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab2-2023|Lab 2 - Intreruperi]] | INT0, D2 | Detectie apasare buton, debouncing software cu millis() |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab3-2023-2024|Lab 3 - Timere / PWM]] | Timer0, Timer2, OCR | Generare PWM pe 3 canale independente pentru MOSFET-urile RGB |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab4-2023-2024|Lab 4 - ADC]] | ADC, A0 | Citire fotorezistor LDR, conversie 10-bit la factor 0–255 |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab5-2023-2024|Lab 5 - SPI]] | SPI hardware | Comunicatie cu display OLED, actualizare ecran la fiecare secunda |
 +| [[https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab6-2023-2024|Lab 6 - I2C]] | TWI, A4/A5 | Citire ora de la DS3231, detectie pierdere alimentare baterie |
 +
 +==== Structura codului ====
 +
 +<code cpp>
 +void setup() {
 +    Serial.begin(9600); ​       // UART pentru HC-06 si debug
 +    pwmSetup(); ​               // Configurare Timer0 si Timer2 pentru PWM RGB
 +    setRGB(0, 0, 0);           // Pornire cu LED-urile stinse
 +    pinMode(PIN_BTN,​ INPUT_PULLUP);​
 +    Wire.begin();​
 +    rtcSetup(); ​               // Init DS3231
 +    oledSetup(); ​              // Init OLED prin SPI
 +}
 +
 +void loop() {
 +    parseBT(); ​      // 1. Citeste comenzi UART de la HC-06
 +    checkButton(); ​  // 2. Verifica buton cu debouncing software
 +
 +    // 3. Calcul culoare in functie de mod activ
 +    switch (currentMode) {
 +        case MODE_AUTO: ​ // LDR determina caldura culorii
 +        case MODE_TIME: ​ // RTC determina caldura culorii
 +        case MODE_WARM: ​ // Fix CALD  R=255 G=180 B=80
 +        case MODE_COOL: ​ // Fix RECE  R=200 G=220 B=255
 +        case MODE_WHITE: // Alb pur   R=255 G=255 B=255
 +        case MODE_BT: ​   // Culoare primita prin Bluetooth
 +        case MODE_OFF: ​  // Stins     ​R=0 ​  ​G=0 ​  B=0
 +    }
 +
 +    setRGB(cr, cg, cb);
 +    updateOLED(cr,​ cg, cb, ...);
 +}
 +</​code>​
 +
 +==== Formule si calcule importante ====
 +
 +**Interpolare liniara temperatura culoare:**
 +<​code>​
 +R = RECE_R + (CALD_R - RECE_R) * t / 255
 +G = RECE_G + (CALD_G - RECE_G) * t / 255
 +B = RECE_B + (CALD_B - RECE_B) * t / 255
 +
 +t = 0   => culoare RECE (dimineata/​zi)
 +t = 255 => culoare CALD (seara/​noapte)
 +</​code>​
 +
 +**Factorul t in MODE_AUTO:​**
 +<​code>​
 +t = 255 - ADC_value
 +// lumina puternica => RECE, intuneric => CALD
 +</​code>​
 +
 +**Factorul t in MODE_TIME:​**
 +<​code>​
 +ora 06:00-18:00 => t = 0
 +ora 18:00-22:00 => t = (h - 18) * 255 / 4
 +ora 22:00-06:00 => t = 255
 +</​code>​
 +
 +**Limitare luminozitate globala:**
 +<​code>​
 +val_finala = val_calculata * MAX_BRIGHT / 255
 +MAX_BRIGHT = 160  // ~63% din maxim
 +</​code>​
 +
 +**Curentul prin LED-uri:**
 +<​code>​
 +I = (VCC - Vf) / R_serie
 +I_R = (5V - 2.0V) / 220  = 13.6 mA  (OK, sub 20mA)
 +I_G = (5V - 2.1V) / 100  = 29 mA    (la limita, acceptabil)
 +I_B = (5V - 3.2V) / 220  =  8 mA    (OK)
 +</​code>​
 +
 +==== Optimizari ====
 +
 +  * PWM configurat direct prin registri TCCR/OCR in loc de ''​analogWrite()''​ pentru control independent al Timer0 si Timer2
 +  * Limita globala MAX_BRIGHT = 160 protejeaza LED-urile la duty cycle maxim
 +  * Update OLED o data pe secunda prin ''​millis()''​ fara ''​delay()'',​ nu blocheaza UART sau butonul
 +  * Cand o valoare RGB e 0, pinul COM este dezactivat din registru si portul fortat LOW, eliminand glitch-uri PWM
 +
 +==== Cum se testeaza ====
 +
 +**Test 1 - Buton:**
 +Apasa butonul de pe D2. Display-ul cicleza: AUTO, CALD, RECE, ALB, TIME, OPRIT. LED-urile isi schimba culoarea la fiecare apasare.
 +
 +**Test 2 - Bluetooth:​**
 +Conecteaza telefonul la HC-06 (PIN: 1234) cu o aplicatie serial Bluetooth. Trimite comenzile:
 +  * ''​WARM''​ => LED-uri galben-portocaliu
 +  * ''​COOL''​ => LED-uri alb-albastrui
 +  * ''​WHITE''​ => LED-uri alb pur
 +  * ''​OFF''​ => LED-uri stinse
 +  * ''​200 50 10''​ => culoare custom RGB
 +
 +**Test 3 - LDR:**
 +Acopera fotorezistorul cu mana. In modul AUTO LED-urile vireze spre cald (galben). Descopera LDR, LED-urile vireze spre rece (alb-albastru).
 +
 +**Test 4 - RTC:**
 +In modul TIME, ora de pe OLED determina culoarea. Intre 06:00-18:00 culoarea e rece, intre 18:00-22:00 face tranzitie, dupa 22:00 e calda.
 +
 +**Test 5 - Debug serial:**
 +Deschide Serial Monitor la 9600 baud. La fiecare 2 secunde:
 +<​code>​
 +HH:MM:SS | L:xxx | R:xxx G:xxx B:xxx
 +</​code>​
 +
 +==== Demo Video ====
 +
 +[[https://​drive.google.com/​file/​d/​1rH4AE9yBBfuPUU4mn2AI_eMcyocapCyA/​view?​usp=sharing|Demo Drive Video - Smart Lamp Controller]]
 +
 +
 +[[https://​www.youtube.com/​shorts/​O9K0OdRhifo |Demo YouTube Video - Smart Lamp Controller]]
 +==== Github ====
 +
 +[[https://​github.com/​CovaliuStefan/​LampaRGB|CovaliuStefan/​LampaRGB]]
pm/prj2026/atoader/stefan.covaliu.1779619750.txt.gz · Last modified: 2026/05/24 13:49 by stefan.covaliu
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