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> | ||