Obsah
IKEA VINDRIKTNING s teplotou, vlhkostí a prašností (SHT40)
Chcete použít IKEA VINDRIKTNING, ale chcete ve výsledku složit levnější variantu bez CO2? Tj. přidat k prašnosti „jen“ teplotu s vlhkostí, takže se na TMEP vše vejde do jednoho čidla (subdomény s měřeními)?
Právě o tom je následující návod a kód. Vycházím z VINDRIKTNINGu s SCD41 od LáskaKitu: https://blog.laskakit.cz/senzor-prachovych-castic-ikea-vindriktning-vylepseny-o-cidlo-co2-teploty-vlhkosti-bluetooth-wi-fi-komunikaci-a-s-vizualizaci-dat-na-tmep-cz/
Přidávaný senzor je nyní LáskaKit SHT40: https://www.laskakit.cz/laskakit-sht40-senzor-teploty-a-vlhkosti-vzduchu/
Celé je to skládačka, nemusíte pájet. Budete potřebovat šroubovák na otevření VINDRIKTNINGu a pilník pro menší zvětšení USB-C otvoru v krabičce, protože deska ESP-VINDRIKTNING má delší USB-C konektor, který dírkou projde o kousek ven.
Potřebujete
- LáskaKit ESP-VINDRIKTNING: https://www.laskakit.cz/laskakit-esp-vindriktning-esp-32-i2c/
- Propojovací kablík μŠup: https://www.laskakit.cz/--sup--stemma-qt--qwiic-jst-sh-4-pin-kabel-5cm/
- USB-C kabel a napájecí zdroj - v podstatě libovolný.
Cenově to vychází na necelých 950 Kč bez zdroje/kabelu, který už možná máte doma navíc. Získáte hezkou krabičku měřící teplotu, vlhkost a prašnost. Můžete ji rozšířit o další čidla či libovolně naprogramovat včetně LEDek.
Postup
- Rozeberte VINDRIKTNING - odšroubujte 4 šrouby na zadní straně a otevřete.
- Odpojte čidlo prašnosti - dva kablíky ze základní desky.
- V krabičce pilníkem mírně rozšiřte USB-C konektor tak, aby se tam vešel delší konektor na desce ESP-VINDRIKTNING - při sestavování by krabička měla jít zaklapnout bez větší síly, zarování USB-C konektoru je jinak dobré, jen je potřeba v případě potřeby otvor více rozšířit.
- Vyšroubujte původní tišťák.
- Vložte ESP-VINDRIKTNING, přišroubujte.
- Zapojte čidlo pračnosti a jeho napájení na základní desku.
- Připojte do μŠup konektoru na základní desce kablík a na něj zapojte LaskaKit SHT40. Při skládání VINDRIKTNINGu jsem čidlo umístil k zadní děrované stěně tak, aby čidlem bylo u zadní strany a kablík ho tam přitlačoval.
- Připojte USB-C kabel propojený do PC s Arduino IDE, použijte kód níže.
- Nemáte-li v Arduino IDE desky ESP32, dohrajte je tam pomocí návodu:
https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/
Potřebujete mít nastavenou deskuESP32 Dev Module
- Vyplňte v kódu v sekci „UPRAV NASTAVENI“ vlastní hodnoty pro SSID a heslo na wi-fi a také nahraďte „TVOJE_DOMENA_PRO_ZAPIS“ vlastní doménou z vámi přidaného čidla pod vaším účtem na TMEP.cz.
- Budete-li mít krabičku někde, kde nechcete aby LEDky moc svítily, změňte „#define BRIGHTNESS 5“ z 5 na 1. Naopak 10 je pořádná záře.
- Flashněte, do služby by vám měla přijít hodnota, výchozí interval v kódu je 15 minut.
- Je-li to v pořádku, můžete krabičku uzavřít, zašroubovat a umístit dle potřeby. Pokud ne, podívejte se v Arduino IDE na monitor sériového portu (mějte nastavenou rychlost 115200) a uvidíte debug, jestli se připojíte na wi-fi apod.
Kód pro Arduino IDE
/* * Vzorovy kod od TMEP.cz zalozeny na laskakit.cz ESP-VINDRIKTNING * Misto SCD40 je LaskaKit SHT40, takze teplota a vlhkost bez CO2. * * Kod posle pres seriovy port (UART) a zaroven na server TMEP.cz * * Vytvoreno (c) laskakit.cz 2022, mirna modifikace na "jen" teplotu, * vlhkost (a pranost) - MultiTricker TMEP.cz * * V Arduino IDE jsem po doinstalovani ESP32 desek pouzil board: ESP32 Dev Module * * Potrebne knihovny - na pranost: * https://github.com/bertrik/pm1006 //PM1006 * * Na LaskaKit SHT40 staci v Arduino IDE Library manageru vyhledat a * nainstalovat vc. zavislosti "Adafruit SHT4x" * https://github.com/adafruit/Adafruit_SHT4X * * Na TMEPu zvol typ cidla "Teplota, vlhkost a CO2", treti promennou (CO2) * na zalozce "Zasilane hodnoty" pojmenuj jako "Prasnost" (vc. diakritiky ;)) * */ #include <WiFi.h> #include <HTTPClient.h> #include <Wire.h> #include "Adafruit_SHT4x.h" /* LaskaKit ESP-VINDRIKTNING - cidlo prasnosti PM1006 */ #include "pm1006.h" /* RGB adresovatelne LED */ #include <Adafruit_NeoPixel.h> /* LaskaKit ESP-VINDRIKTNING - cidlo prasnosti PM1006 */ #define PIN_FAN 12 // spinani ventilatoru #define RXD2 16 // UART - RX #define TXD2 17 // UART - TX /* Nastaveni RGB LED */ #define BRIGHTNESS 5 #define PIN_LED 25 #define PM_LED 0 #define TEMP_LED 1 #define HUM_LED 2 /*--------------------- UPRAV NASTAVENI ---------------------*/ const char* ssid = "SSID"; const char* password = "PASSWORD"; // Vypln domenu pro zapis hodnot, kterou najdes u vytvoreneho cidla na tmep.cz // Nemas? registrace je za minutu a cidlo pridas okamzite ;) String serverName = "http://TVOJE_DOMENA_PRO_ZAPIS.tmep.cz/index.php?"; // Muzes vyplnit vlastni pojmenovani GUID, pokud si je na TMEPu nastavis na jine nez vychozi String GUID_TEPLOTA = "temp"; String GUID_VLHKOST = "humi"; String GUID_PRASNOST = "CO2"; /*------------------------ KONEC UPRAV -----------------------*/ /* LaskaKit ESP-VINDRIKTNING - cidlo prasnosti PM1006, nastaveni UART2 */ static PM1006 pm1006(&Serial2); /* LaskaKit ESP-VINDRIKTNING s čidlem LaskaKit SHT40 */ Adafruit_SHT4x sht4 = Adafruit_SHT4x(); /* RGB adresovatelne LED */ Adafruit_NeoPixel pixels = Adafruit_NeoPixel(3, PIN_LED, NEO_GRB + NEO_KHZ800); void setup() { pinMode(PIN_FAN, OUTPUT); // Ventilator pro cidlo prasnosti PM1006 Serial.begin(115200); Serial.println("BOOTujeme"); if (! sht4.begin()) { Serial.println("SHT4x not found"); Serial.println("Check the connection"); while (1) delay(1); } sht4.setPrecision(SHT4X_HIGH_PRECISION); // highest resolution sht4.setHeater(SHT4X_NO_HEATER); // no heater Wire.begin(); pixels.begin(); // WS2718 pixels.setBrightness(BRIGHTNESS); delay(10); /*-------------- RGB adresovatelne LED - zhasni --------------*/ pixels.setPixelColor(PM_LED, pixels.Color(0, 0, 0)); // R, G, B pixels.setPixelColor(TEMP_LED, pixels.Color(0, 0, 0)); // R, G, B pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 0)); // R, G, B pixels.show(); // Zaktualizuje barvu /*-------------- PM1006 - cidlo prasnosti ---------------*/ Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); // cidlo prasnosti PM1006 /*------------- Wi-Fi -----------*/ WiFi.begin(ssid, password); Serial.println("Pripojovani"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Pripojeno do site, IP adresa zarizeni: "); Serial.println(WiFi.localIP()); } void loop() { /*------------- LaskaKit SHT40 - teplota, vlhkost -----------*/ float teplota = 0.0; int vlhkost = 0; sensors_event_t humidity, temp; // temperature and humidity variables sht4.getEvent(&humidity, &temp); teplota = temp.temperature; vlhkost = humidity.relative_humidity; // odeslani hodnot pres UART Serial.print("Teplota: "); Serial.print(teplota); Serial.println(" degC"); Serial.print("Vlhkost: "); Serial.print(vlhkost); /*-------------- PM1006 - cidlo prasnosti ---------------*/ uint16_t pm2_5; digitalWrite(PIN_FAN, HIGH); Serial.println("Fan ON"); delay(30000); while (!pm1006.read_pm25(&pm2_5)) { delay(1); } delay(100); digitalWrite(PIN_FAN, LOW); Serial.println("Fan OFF"); // odeslani hodnot pres UART Serial.print("PM2.5: "); Serial.print(pm2_5); Serial.println(" ppm"); /*-------------- RGB adresovatelne LED ---------------*/ // teplota LED if(teplota < 20.0){ pixels.setPixelColor(TEMP_LED, pixels.Color(0, 0, 255)); // R, G, B } else if (teplota < 23.0){ pixels.setPixelColor(TEMP_LED, pixels.Color(0, 255, 0)); // R, G, B } else { pixels.setPixelColor(TEMP_LED, pixels.Color(255, 0, 0)); // R, G, B } // vlhkost LED if (vlhkost < 20.0) { pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 50)); // R, G, B } else if (vlhkost < 40.0) { pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 100)); // R, G, B } else if (vlhkost < 60.0) { pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 150)); // R, G, B } else if (vlhkost < 80.0) { pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 200)); // R, G, B } else { pixels.setPixelColor(HUM_LED, pixels.Color(0, 0, 255)); // R, G, B } // PM LED if (pm2_5 < 30) { pixels.setPixelColor(PM_LED, pixels.Color(0, 255, 0)); // R, G, B } else if (pm2_5 < 40) { pixels.setPixelColor(PM_LED, pixels.Color(128, 255, 0)); // R, G, B } else if (pm2_5 < 80) { pixels.setPixelColor(PM_LED, pixels.Color(255, 255, 0)); // R, G, B } else if (pm2_5 < 90) { pixels.setPixelColor(PM_LED, pixels.Color(255, 128, 0)); // R, G, B } else { pixels.setPixelColor(PM_LED, pixels.Color(255, 0, 0)); // R, G, B } pixels.show(); // Zaktualizuje barvu /*------------ Odeslani hodnot na TMEP.cz ------------------*/ if (WiFi.status() == WL_CONNECTED) { // GUID, nasleduje hodnota teploty, vlhkosti a pranosti String serverPath = serverName + "" + GUID_TEPLOTA + "=" + teplota + "&" + GUID_VLHKOST + "=" + vlhkost + "&" + GUID_PRASNOST + "=" + pm2_5; sendhttpGet(serverPath); } else { Serial.println("Wi-Fi odpojeno"); } esp_sleep_enable_timer_wakeup(900 * 1000000); // uspani na 15 minut Serial2.flush(); Serial.flush(); delay(100); esp_deep_sleep_start(); } // funkce pro odeslani dat na TMEP.cz void sendhttpGet(String httpGet) { HTTPClient http; // odeslani dat String serverPath = httpGet; // zacatek http spojeni http.begin(serverPath.c_str()); // http get request int httpResponseCode = http.GET(); if (httpResponseCode > 0) { Serial.print("HTTP odpoved: "); Serial.println(httpResponseCode); String payload = http.getString(); Serial.println(payload); } else { Serial.print("Error kod: "); Serial.println(httpResponseCode); } // Free resources http.end(); }