This shows you the differences between two versions of the page.
|
pm:prj2024:rrusu:calin.basturea [2024/05/20 01:17] calin.basturea |
pm:prj2024:rrusu:calin.basturea [2024/05/27 03:26] (current) calin.basturea |
||
|---|---|---|---|
| Line 10: | Line 10: | ||
| Proiectul implică utilizarea microcontroller-ului Arduino Uno și a senzorilor (deși schema bloc nu include un SD card sau un senzor de zgomot, deoarece Tinkercad nu dispune de ele :-/). Pe placa de conexiuni avem, de asemenea, 3 butoane, fiecare cu funcționalitatea sa. Un buton pentru începerea monitorizării, unul pentru oprirea monitorizării și unul pentru Opțiuni. De asemenea, avem și 3 LED-uri care vor funcționa ca indicatori vizuali pentru a denota nivelul zgomotului detectat. Pe LCD va fi afișat timpul monitorizării, iar la apăsarea butonului de opțiuni diferite statistici 8-). | Proiectul implică utilizarea microcontroller-ului Arduino Uno și a senzorilor (deși schema bloc nu include un SD card sau un senzor de zgomot, deoarece Tinkercad nu dispune de ele :-/). Pe placa de conexiuni avem, de asemenea, 3 butoane, fiecare cu funcționalitatea sa. Un buton pentru începerea monitorizării, unul pentru oprirea monitorizării și unul pentru Opțiuni. De asemenea, avem și 3 LED-uri care vor funcționa ca indicatori vizuali pentru a denota nivelul zgomotului detectat. Pe LCD va fi afișat timpul monitorizării, iar la apăsarea butonului de opțiuni diferite statistici 8-). | ||
| - | {{:pm:prj2024:rrusu:tcad_pm_calinb.png?550|}} | + | {{:pm:prj2024:rrusu:sleeping_monitor_scheme.png?450|}} |
| Cele 3 LED-uri(care trebuie conectate fiecare la un pin diferit, nu ca pe schema de mai sus) se vor aprinde în funcție de nivelul de zgomot perceput(în funcție de un anumit threshold). | Cele 3 LED-uri(care trebuie conectate fiecare la un pin diferit, nu ca pe schema de mai sus) se vor aprinde în funcție de nivelul de zgomot perceput(în funcție de un anumit threshold). | ||
| + | Ideea codului este un FSM(Finite State Machine). La bază este un meniu de opțiuni care ne lasă să alegem ce dorim să monitorizăm(temperatura, umiditatea, fie ambele deodată). | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| + | {{:pm:prj2024:rrusu:ardu_sleepmon.png?450|}} | ||
| + | {{:pm:prj2024:rrusu:sm_electrical_scheme.png?450|}} | ||
| + | |||
| + | NOTE: Buzzer-ul si modulul 2 digit sunt funcționale, dar trebuie solder-uite. | ||
| Listă de piese | Listă de piese | ||
| Line 33: | Line 37: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | Codul a fost dezvoltat in Arduino IDE. În cadrul acestuia, m-am folosit de 2 biblioteci thirdy-party. | ||
| + | - LiquidCrystal_I2C.h (pentru gestionarea ecranului LCD) | ||
| + | - DHT11.h (pentru gestionarea senzorului de temperatură și umiditate) | ||
| + | - ShiftRegister74HC595.h (pentru gestionarea modului 2 led digits) NOTE! Acest modul a avut probleme, unele functii a trebuit sa le rescriu cand am importat manual zip-ul cu libraria si in continuare, gruparea de led-uri din stanga, nu merge intotdeauna as intended. | ||
| + | De asemenea, deoarece citirea temperaturii și a umidității este destul de costisitoare d.p.d.v. al ciclilor de ceas, vom face această acțiune la un interval specific de timp(o dată la 10 secunde). | ||
| + | <code c> | ||
| + | unsigned char buttonState = digitalRead(SETTINGS_BUTTON); | ||
| - | <note tip> | + | switch(STATE){ |
| - | Descrierea codului aplicaţiei (firmware): | + | case IDLE: { |
| - | * Arduino IDE | + | unsigned long currMillis = millis(); |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | // Verificam daca au trecut 10 secunde |
| + | if (currMillis - prevMillis >= interval) { | ||
| + | prevMillis = currMillis; | ||
| + | dht.readTemperatureHumidity(t, h); | ||
| + | } | ||
| - | <note tip> | + | // Pressed |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | if(buttonState == 0){ |
| - | </note> | + | STATE = SETTINGS_STATE; |
| + | lcd.clear(); | ||
| + | delay(250); | ||
| + | } | ||
| + | |||
| + | switch(selectedSetting){ | ||
| + | // Temp | ||
| + | case 0: { | ||
| + | temperature_led_handle(t); | ||
| + | displaySetting("Temp", t); | ||
| + | break; | ||
| + | } | ||
| + | // Humidity | ||
| + | case 1: { | ||
| + | TURNALLOFF(); | ||
| + | displaySetting("Humidity", h); | ||
| + | break; | ||
| + | // Both | ||
| + | }case 2: { | ||
| + | TURNALLOFF(); | ||
| + | displaySetting("Tmp", t, "Hum", h); | ||
| + | break; | ||
| + | } | ||
| + | default: break; | ||
| + | } | ||
| + | |||
| + | break; | ||
| + | } | ||
| + | case SETTINGS_STATE: { | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("Settings Menu"); | ||
| + | lcd.setCursor(0, 1); | ||
| + | |||
| + | unsigned char nextButtonState = digitalRead(NEXT_BUTTON); | ||
| + | unsigned char backButtonState = digitalRead(BACK_BUTTON); | ||
| + | |||
| + | if(!nextButtonState){ | ||
| + | idx = (idx + 1) % SETTINGS_ARR_SIZE; | ||
| + | currentOption = &settingsArr[idx]; | ||
| + | delay(250); | ||
| + | lcd.clear(); | ||
| + | Serial.println("apasat next"); | ||
| + | }else if(!backButtonState){ | ||
| + | idx = (idx <= 0) ? SETTINGS_ARR_SIZE - 1 : (idx - 1) % 3; | ||
| + | currentOption = &settingsArr[idx]; | ||
| + | delay(250); | ||
| + | lcd.clear(); | ||
| + | Serial.println("apasat next"); | ||
| + | } | ||
| + | |||
| + | if(buttonState == 0){ | ||
| + | selectedSetting = idx; | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.clear(); | ||
| + | lcd.print("Monitoring..."); | ||
| + | STATE = IDLE; | ||
| + | // Putin delay, deoarece va iesi din acest state si va intra inapoi instant tot in SETTINGS_STATE | ||
| + | delay(250); | ||
| + | } | ||
| + | |||
| + | lcd.print((char*)*currentOption); | ||
| + | |||
| + | break; | ||
| + | } | ||
| + | default: { | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | NEW! MULTIPLE LANGUAGES!! Limba poate fi aleasa din meniul de setari. | ||
| + | <codec> | ||
| + | |||
| + | const unsigned char settingsArrEnglish[][17] = { | ||
| + | "<- Disp Temp ->", "<- Disp Humid ->", "<- Disp Both ->", "<- Language ->","<- Zen ->" | ||
| + | }; | ||
| + | const unsigned char settingsArrRomanian[][17] = { | ||
| + | "<- Afis Temp ->", "<- Afis Umid ->", "<- Afis Ambele ->", "<- Limba ->","<- Zen ->" | ||
| + | }; | ||
| + | |||
| + | </code> | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | 8-O =) M-am distrat creand un FSM pentru a controla meniul principal. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | Codul sursa poate fi descarcat de aici {{pm:prj2024:rrusu:sleepingmonitor.zip}} |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
| - | + | ||
| - | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | |
| - | </note> | + | |
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| Line 65: | Line 156: | ||
| <note> | <note> | ||
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | https://www.diodes.com/assets/Datasheets/74HC595.pdf (foarte enervant) |
| </note> | </note> | ||