Pak jsem při hledání „už ani nevím čeho“ objevil v bastlbedně modul ESP32-CAM. K realizaci fotopasti tak byl jen krůček.
HW
Modul ESP32-CAM (AI Thinker) z Alixu za 5 UDS, ale umí i Vokolo, LáskaKit a jiné bastlířské eshopy v CZ.
Umístění jsem s ohledem na napájení volil uvnitř – za oknem. Ke slovu přišel starý cucflekový držák na autokameru. Ten je vybaven W1/4 závitem (klasický fotografický závit).
Držák pro ESP-32-CAM je vymodelovaný v ThinkerCadu a vytištěný na 3D tiskárně.
Jelikož se závit špatně tiskne, tak jsou díry schválně navrženy menší – po vytištění protáhnout 5,5 vrtákem a šroub stativu tam opatrně na sílu našroubovat.
Kamera, kromě krmítka, bohužel zabírá i okna sousedního domu. A sousedi svým energeticky nezodpovědným chováním (rozsvěcováním světel) generují značné množství falešných pohybů.
Tak jsem ke kemaře dobastlil fotorezistor a za tmy (threshold tak nějak odhadem) detekovaný pohyb nezpracovávám.
Fotorezistor je připojen místo LED k pinu GPIO 33, druhá část děliče 10k odpor pak hezky sedne k nedalekému kondenzátoru.
Měření klasika
...
Define LDR_PIN 33
...
ldrValue = analogRead(LDR_PIN);
...
ESP32 FW
Na koukáni na video nemám čas. Takže místo streamování jsem potřeboval Motion Detection. Na webu je spousta návodů, vesměs s extérním PIR detektorem (např. chiptron). Já však nechci další HW, navíc PIR přes sklo nefunguje.
Na webu je spoustu hotových řešení, lepších i vyloženě prasáren. Já jsem chvíli zkoušel a pak našel knihovnu EloquentSurveillance, která je jednak velmi pěkně napsaná, druhak je prefektně zdokumentovaná a ještě umí vše potřebné.
Takže stačí použít některý z příkladů, upravit konfiguraci kamery a motion detect parametry
camera.aithinker();
camera.bestQuality();
camera.uxga();
motion.setMinChanges(0.1);
motion.setMinPixelDiff(5);
motion.setMinSizeDiff(0.05);
motion.debounce(10000L);
plus doplnit POST fotek (viz níže) a alivePING na můj server.
SW
Pro ukládání fotek jsem ze začátku používal SD kartu, ale embeddovaný fileserver toho moc neumí a navíc se mi nechce dělat tunel a ohýbat firewall pro online náhled odkudkoliv ze světa.
Takže jsem implementoval ukládání fotek na můj server. Uložení na SD kartu zůstalo, je to ale záložní varianta, když POST neprojde.
Do hlavičky POST ještě přidávám pár diagnostických informací jako např zbývající místo na SD kartě, úroveň osvětlení apod.
bool httpUploadFile(String fileName, String MACaddr, uint32_t MotionCount, float CardUsed, uint16_t LDRvalue){
bool status = true;
String httpError = "";
HTTPClient http;
http.begin(String(F("URL")));
http.addHeader(F("X-ESP-TOKEN"), "TokenTajnyJakHovado" + MACaddr);
http.addHeader(F("X-ESP-FileName"), fileName);
http.addHeader(F("X-ESP-SDused"), String(CardUsed));
http.addHeader(F("X-ESP-MotionCount"), String(MotionCount));
http.addHeader(F("X-ESP-LDR"), String(LDRvalue));
int statusCode = http.POST(gFrame->buf, gFrame->len);
if (statusCode != 200) {
String response = http.getString();
httpError = String("Server error: (") + statusCode + ") " + response;
debug("UPLOAD ERROR", response);
status = false;
}else{
debug("UPLOAD", http.getString());
}
http.end();
return status;
}
Na serveru pak v PHP
$headers = getallheaders();
...
if($headers['X-ESP-TOKEN'] == "TokenTajnyJakHovadoIsMACadresou"){
$imageFile = $headers['X-ESP-FileName']
if(!file_put_contents($imageFile, file_get_contents('php://input'))){
print_r("ERR");
}else{
print_r("OK");
}
}else{
Header(HTTP403)
}
...
Vybrané, ručně vytříděné, fotky jsou pak dostupné na webu CamTrap Image Gallery
A samozřejmě, že i holubi se přišli podívat.
Seznam odkazů:
Poznámka pro sebe sama:
V IoT dashboard změnit default parametry RRD
rrdtool tune FILENAME -d mc:COUNTER
rrdtool tune FILENAME -a mc:500000
rrdtool tune FILENAME -a ldr:4100