Un Monitor de Somn este exact ceea ce sugerează și numele lui. Este un dispozitiv care urmărește experiența ta de somn și mediul în care dormi, folosind o serie de factori precum temperatura, umiditatea și nivelul de zgomot din timpul somnului(indiferent că este vorba de foșnete, sunete aleatorii etc.). Toate datele sunt înregistrate pe un SD card și ulterior sunt procesate pentru a genera o diagramă a experienței tale de somn. Scopul acestui dispozitiv este să se asigure că, prin monitorizarea zgomotului, persoana are un somn profund, calm și lipsit de stres.
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 .
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ă).
NOTE: Buzzer-ul si modulul 2 digit sunt funcționale, dar trebuie solder-uite.
Listă de piese
Codul a fost dezvoltat in Arduino IDE. În cadrul acestuia, m-am folosit de 2 biblioteci thirdy-party.
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).
unsigned char buttonState = digitalRead(SETTINGS_BUTTON); switch(STATE){ case IDLE: { unsigned long currMillis = millis(); // Verificam daca au trecut 10 secunde if (currMillis - prevMillis >= interval) { prevMillis = currMillis; dht.readTemperatureHumidity(t, h); } // Pressed if(buttonState == 0){ 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; } }
NEW! MULTIPLE LANGUAGES!! Limba poate fi aleasa din meniul de setari.
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 ->" };
M-am distrat creand un FSM pentru a controla meniul principal.
Codul sursa poate fi descarcat de aici sleepingmonitor.zip