This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:stefan.covaliu [2026/05/23 18:43] stefan.covaliu [Schema electrica] |
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 ==== | ||
| - | **Mediu de dezvoltare:** VSCode cu PlatformIO, framework Arduino, upload prin avrdude cu protocol custom (flags: ''-P usb -c xplainedmini''). | + | * **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 | ||
| - | **Librarii folosite:** | + | ==== Biblioteci folosite ==== |
| - | * ''Wire.h'' : comunicatie I2C cu DS3231 | + | |
| - | * ''RTClib'' : citire ora de la DS3231 | + | |
| - | * ''U8g2lib'' : driver display OLED SH1106 prin SPI | + | |
| - | * ''SPI.h'' : comunicatie SPI hardware | + | |
| - | **Algoritmi implementati:** | + | ^ Biblioteca ^ Scop ^ |
| + | | ''Wire.h'' | Comunicatie I2C cu DS3231 | | ||
| + | | ''RTClib'' | Citire ora si data de la DS3231 | | ||
| + | | ''SPI.h'' | Comunicatie SPI hardware cu OLED | | ||
| + | | ''Adafruit_GFX'' | Biblioteca grafica de baza pentru display | | ||
| + | | ''Adafruit_SSD1306'' | Driver display OLED prin SPI | | ||
| - | 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. | + | ==== Descriere comunicatie periferice ==== |
| - | Calculul temperaturii de culoare combina liniar doua profile: profilul "rece" (R=200, G=220, B=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. | + | **UART - HC-06 Bluetooth (D0/D1)** |
| - | 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. | + | 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. |
| + | **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]] | ||