Toilet Time
Ignorat sau râvnit, tihnit sau zbuciumat, relaxare sau chiar plăcut timp de lectură… putem descrie în multe moduri timpul petrecut la toaletă dar știm de fapt care este acest timp? În cadrul proiectului de față vom prezenta realizarea unui sistem ce permite măsurarea timpului petrecut la toaletă. Chiar dacă poate părea puțin bizară tematica propusă vă asigurăm că mulți pasionați de sisteme electronice programabile s-au gândit cel puțin o dată la un sistem care să accesorizeze toaleta proprie; câteva exemple de astfel de proiecte:
- Touchless Toilet Mechanism With Arduino
- Is the Toilet Free?
- Arduino-Based Bathroom Occupancy Detector
- Bathroom Occupancy Remote Awareness Technology with Arduino
- Toilet Seat Alarm
- Arduino-Fart-O-Meter
Sistemul propus de noi se bazează pe o placă de dezvoltare Adafruit Feather HUZZAH echipată cu microprocesorul WiFi ESP8266. Conectivitatea WiFi va permite consultarea timpului total petrecut la toaletă prin intermediul oricărui dispozitiv inteligent cu conectivitate de rețea (tabletă, telefon mobil). În plus, specific tuturor plăcilor din familia Feather, placa de dezvoltare se poate alimenta de la un acumulator LiPo de 3.7V permițând crearea simplă a unui sistem independent de alimentarea USB. Detectarea ocupării toaletei se va face cu ajutorul unui buton brick ce se va poziționa sub colacul toaletei. Greutatea colacului nu este suficientă pentru a apăsa butonul, butonul se va apăsa doar dacă toaleta este ocupată. Bineînțeles, se poate înlocui componenta buton brick cu un senzor de apăsare brick dacă se dorește perfecționarea dedectării ocupării toaletei sau dacă se dorește realizarea unui sistem cu mai mulți ”utilizatori”.
Schema de interconectare dintre placa de dezvoltare și brick-ul buton este următoarea:
Brick-ul se va alimenta la 3.3V iar ieșirea se va conecta la pinul GPIO12 al plăcii de dezvoltare.
Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.5 având instalată extensia ESP8266 Community 2.3.0. În cadrul programului trebuie personalizate datele de conectare WiFi (variabilele ssid și password).
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
const char *ssid = „…”;
const char *password = „…”;
ESP8266WebServer server (80);
#define pinButton 12
Timpul total de utilizarea a toaletei este stocat în variabila globală toilettime ca număr de secunde. Consultarea timpului total se poate face accesând adresa IP a sistemului (oferită prin DHCP de către AP-ul WiFi) dintr-un client web (browser web). Procedura handleRoot() este responsabilă de construirea paginii HTML trimisă către clientul web. Timpul total se va afișa în format HH:MM:SS. Programul poate fi îmbunătățit în această privință pentru a afișa durate mai mari de timp (sub formă de zile, săptămâni, ani).
char temp[600];
unsigned long toilettime;
void handleRoot() {
int sec = toilettime % 60;
int min = (toilettime / 60) % 60;
int hr = toilettime / 3600;
snprintf ( temp, 600,”%02d:%02d:%02d”, hr, min, sec);
String page = „<html>\
<head>\
<meta http-equiv=’refresh’ content=’10’/>\
<title>Toillet Time</title>\
<style>\
body { background-color: #cccccc; font-family:
Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>Toilet Time</h1>\
<p><b>Your total time is:</b> ” + String(temp) + „
</p>\
</body>\
</html>”;
page.toCharArray(temp,page.length()+1);
server.send ( 200, „text/html”, temp );
}
Variabila ocupat are semnificația de toaletă ocupată. Când variabila ocupat are valoare true sistemul va contoriza timpul scurs și îl va adăuga la variabila toilettime. Conținutul variabilei toilettime se va salva în memoria flash a plăcii de dezvoltare la fiecare trecere din true în false a variabilei ocupat – acest lucru va asigura păstrarea timpului total și după un reset al plăcii de dezvoltare. Pentru operațiile cu memoria flash programul utilizează biblioteca Arduino IDE EEPROM. Placa de dezvoltare nu are memorie EEPROM, versiunea pentru ESP8266 a bibliotecii EEPROM utilizează aceleași funcții și metode ca la plăcile Arduino dar se folosește de memoria program flash. În cadrul secțiunii setup(), la fiecare nouă inițializare a programului, variabila toilettime se inițializează din memoria non-volatilă program.
boolean ocupat;
void setup() {
pinMode(pinButton, INPUT);
EEPROM.begin(512);
toilettime = 0;
toilettime += (long)EEPROM.read(0)<<24;
toilettime += (long)EEPROM.read(1)<<16;
toilettime += (long)EEPROM.read(2)<<8;
toilettime += (long)EEPROM.read(3);
WiFi.begin ( ssid, password );
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
}
server.on ( „/”, handleRoot );
server.begin();
ocupat = false;
}
Variabilele start și stopp memorează momentele trecerii variabilei ocupat din false în true (așezarea pe toaletă) și din true în false (ridicarea de pe toaletă). În momentul adunării timpului scurs la variabila globală toilettime, conținutul acesteia este salvată și în memoria flash.
unsigned long start, stopp;
void loop() {
if ((!ocupat) && (digitalRead(pinButton)==1)) {
start = millis();
ocupat = true;
}
if (ocupat && (digitalRead(pinButton)==0)) {
stopp = millis();
ocupat = false;
toilettime += (stopp – start)/1000;
byte temp;
temp = (toilettime>>24) & 0xFF;
EEPROM.write(0, temp);
temp = (toilettime>>16) & 0xFF;
EEPROM.write(1, temp);
temp = (toilettime>>8) & 0xFF;
EEPROM.write(2, temp);
temp = toilettime & 0xFF;
EEPROM.write(3, temp);
EEPROM.commit();
}
server.handleClient();
}
În cazul în care vă plictisiți testând sistemul vă recomandăm aplicația mobilă Android Toilet Time – Mini-games for the bathroom.