Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
|
2015:esp8266-ds18b20 [2016/01/15 22:53] Václav Pálka vytvořeno |
2015:esp8266-ds18b20 [2016/01/17 00:25] (aktuální) Václav Pálka pokračování3 |
||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| ====== WiFi teploměr s ESP8266 ====== | ====== WiFi teploměr s ESP8266 ====== | ||
| + | |||
| ===== Zadání ===== | ===== Zadání ===== | ||
| - | Seznamte se s WiFi čipem ESP8266 a jeho vývojovým prostředím. Vytvořte aplikaci WiFi teploměru s čidlem DS18B20, která bude v definovaném intervalu pomocí GET požadavku odesílat aktuální teplotu na server ThingSpeak nebo do vlastního PHP skriptu s vizualizací. | + | Seznamte se s Wi-Fi čipem ESP8266 a jeho vývojovým prostředím. Vytvořte aplikaci Wi-Fi teploměru s čidlem DS18B20, která bude v definovaném intervalu pomocí GET požadavku odesílat aktuální teplotu na server ThingSpeak nebo do vlastního PHP skriptu s vizualizací. |
| ===== Úvod ===== | ===== Úvod ===== | ||
| ==== ESP8266 ==== | ==== ESP8266 ==== | ||
| - | ESP8266 je ultra low coast čínský modu pro převod sériové linky na Wi-fi. Tento modul s cenou do 3$ disponuje mimo jiné 32 bitovým procesorem s několika GPIO piny a podporuje módy v b/g/n, zabezpečení WPA/WPA2 a umí pracovat jako Station nebo AP. Jednou z nesporných výhod jsou i rozměry, které jsou pro verzi ESP8266 ESP-01 | + | ESP8266 je ultra low coast čínský modu pro převod sériové linky na Wi-Fi. Tento modul s cenou do 3$ disponuje mimo jiné 32 bitovým procesorem s několika GPIO piny a podporuje módy v b/g/n, zabezpečení WPA/WPA2 a umí pracovat jako Station nebo AP. Jednou z nesporných výhod jsou i rozměry, které jsou pro verzi ESP8266 ESP-01 |
| 25 x 14 mm. | 25 x 14 mm. | ||
| - | {{ :2015:esp8266-ds18b20:esp8266-espxx.jpg?nolink&200 |Porovnání velikostí verzí modulů}} | + | {{ :2015:esp8266-ds18b20:esp8266-espxx.jpg?nolink |Porovnání velikostí verzí modulů}} |
| Modul samotný je schopen komunikovat s okolním světem již z výroby zavedeným firmwarem, který se ovládá pomocí AT příkazů přes sériovou linku připojenou rychlostí obvykle 115200 baudů za sekundu. Tyto jednoduché příkazy samy o sobě dostačují pro správnou funkci zařízení, které chceme připojit k síti. Avšak skutečné možnosti modul odhalil až s uvolněním dokumentace a SDK, díky čemuž umožnil vytvářet vlastní firmware. Mezi ty nejpokročilejší patří Nodemcu LUA. Tato distribuce využívá LUA jazyk, který byl navržen v roce 1993 jako odlehčený skriptovací jazyk, pro jednoduchá zařízení. | Modul samotný je schopen komunikovat s okolním světem již z výroby zavedeným firmwarem, který se ovládá pomocí AT příkazů přes sériovou linku připojenou rychlostí obvykle 115200 baudů za sekundu. Tyto jednoduché příkazy samy o sobě dostačují pro správnou funkci zařízení, které chceme připojit k síti. Avšak skutečné možnosti modul odhalil až s uvolněním dokumentace a SDK, díky čemuž umožnil vytvářet vlastní firmware. Mezi ty nejpokročilejší patří Nodemcu LUA. Tato distribuce využívá LUA jazyk, který byl navržen v roce 1993 jako odlehčený skriptovací jazyk, pro jednoduchá zařízení. | ||
| Řádek 21: | Řádek 22: | ||
| ===== Zapojení ===== | ===== Zapojení ===== | ||
| + | Zapojení modulu ESP je snadné, samotná deska má 2 napájecí piny, 2 GPIO piny, sériovou linku a resetovací a enable pin. Pozor ovšem na úroveň napětí, která nesmí přesáhnout 3V3. | ||
| + | |||
| + | {{ :2015:esp8266-ds18b20:zapojeni.png?nolink |Zapojení}} | ||
| + | |||
| + | Digitální teploměr DS18B20 byl zapojen v zapojení s vnějším napájením. | ||
| + | |||
| + | V případě že chceme modul přeprogramovat je nutné, pro povolení programovaní, připojit pin GPIO0 na zem. Toto musí být provedeno ještě před připojením napájení, jinak nemusí k naprogramování dojít. | ||
| + | |||
| + | |||
| + | {{ :2015:esp8266-ds18b20:20160117_001637.jpg?nolink&600 | Náhled na zapojení protipu}} | ||
| + | |||
| + | |||
| + | ===== Program ===== | ||
| + | |||
| + | Pro vytvoření programu bylo využito rozšíření pro Arduino a vhodné knihovny pro komunikaci s digitálním teploměrem DS18B20. | ||
| + | |||
| + | ==== Inicializace ==== | ||
| + | |||
| + | === Knihovny === | ||
| + | |||
| + | Inicializace použitých knihoven pro obsluhu ESP88226 a DS18B20 komunikující po 1-wire sběrnici. | ||
| + | <code c> | ||
| + | #include <ESP8266WiFi.h> | ||
| + | #include <OneWire.h> | ||
| + | #include <DallasTemperature.h> | ||
| + | </code> | ||
| + | === Informace o připojení === | ||
| + | |||
| + | Nastavení informací o Teplotním čidle, SSID a heslu sítě, na které bude zařízení připojeno a informace a přístupový API klíč pro ThingSpeak.com. | ||
| + | <code c> | ||
| + | #define ONE_WIRE_BUS 2 | ||
| + | OneWire oneWire(ONE_WIRE_BUS); // Inicializace DS18B20 na pinu GPIO2 | ||
| + | DallasTemperature DS18B20(&oneWire); | ||
| + | | ||
| + | const char* ssid = "vaclav"; // Nastavení připojení k síti | ||
| + | const char* password = ""; | ||
| + | |||
| + | const char* host = "api.thingspeak.com"; // Informace pro připojení k thingspeak.com | ||
| + | const char* APIkey = "CM4O1WWET8RHAT99"; | ||
| + | |||
| + | bool scnd = false; | ||
| + | </code> | ||
| + | === Připojení k síti === | ||
| + | |||
| + | Inicializace sériové komunikace a připojení k sítí. | ||
| + | <code c> | ||
| + | void setup() { | ||
| + | | ||
| + | Serial.begin(115200); // Otevření komunikace po sériové lince | ||
| + | delay(10); | ||
| + | |||
| + | Serial.println(); | ||
| + | Serial.print("Connecting to "); | ||
| + | Serial.println(ssid); | ||
| + | |||
| + | WiFi.begin(ssid, password); // Inicializace připojení k síti | ||
| + | | ||
| + | while (WiFi.status() != WL_CONNECTED) { // Potvrzení připojení k síti | ||
| + | delay(500); | ||
| + | Serial.print("."); | ||
| + | } | ||
| + | |||
| + | Serial.println(""); | ||
| + | Serial.println("WiFi connected"); | ||
| + | Serial.println("IP address: "); | ||
| + | Serial.println(WiFi.localIP()); | ||
| + | Serial.println(); | ||
| + | } | ||
| + | </code> | ||
| + | ==== Hlavní smyčka ==== | ||
| + | |||
| + | V této smyčce se provádí změření a odeslání teploty na server ThingSpeak.com | ||
| + | <code c> | ||
| + | void loop() { | ||
| + | delay(30000); // Měření a odesílání teploty probíhá v intervalu cca 30s | ||
| + | |||
| + | float temp; | ||
| + | |||
| + | DS18B20.requestTemperatures(); // Získání informace o teplotě teploty | ||
| + | temp = DS18B20.getTempCByIndex(0); | ||
| + | Serial.print("Temperature: "); | ||
| + | Serial.println(temp); | ||
| + | |||
| + | char charVal[12]; | ||
| + | |||
| + | dtostrf(temp, 8, 2, charVal); // Konverze vyčtené teploty do stringu | ||
| + | // (hodnota, počet míst, počet desetinných míst, | ||
| + | // umístění stringu) | ||
| + | if(scnd){ | ||
| + | |||
| + | Serial.print("connecting to "); | ||
| + | Serial.println(host); | ||
| + | |||
| + | WiFiClient client; | ||
| + | | ||
| + | const int httpPort = 80; | ||
| + | | ||
| + | if (!client.connect(host, httpPort)) { | ||
| + | Serial.println("connection failed"); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | String url = "/update?key="; // Vytvoření URL pro odeslání informace o teplotě | ||
| + | url += APIkey; | ||
| + | url += "&field1="; | ||
| + | url += charVal; | ||
| + | |||
| + | Serial.print("Requesting URL: "); | ||
| + | Serial.println(url); | ||
| + | |||
| + | // Odeslání požadavku na server | ||
| + | client.print(String("GET ") + url + " HTTP/1.1\r\n" + | ||
| + | "Host: " + host + "\r\n" + | ||
| + | "Connection: close\r\n\r\n"); | ||
| + | delay(10); | ||
| + | |||
| + | Serial.println(); | ||
| + | while (client.available()) { | ||
| + | String line = client.readStringUntil('\r'); | ||
| + | Serial.print(line); // tisk informací přijatých ze serveru | ||
| + | } | ||
| + | |||
| + | Serial.println(); | ||
| + | Serial.println("connection completed"); // potvrzení ukončení odesílání | ||
| + | Serial.println(); | ||
| + | Serial.println(); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | Serial.println("uncorrect first temperatue"); | ||
| + | Serial.println(); // Ošetření nesprávnosti první změřené hodnoty po připojení | ||
| + | scnd=true; // k napájení | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | ===== Funkce ===== | ||
| + | |||
| + | Princip funkce zařízení funguje na jednoduchém principu, kdy se zařízení připojí k lokální Wi-Fi síti, jejíž údaje má uložené v programové syntaxi a následně s intervalem 30 sekund opakuje cyklus změření teploty, vytvoření URL pro odeslání informace na server ThingSpeak.com, odeslání informace a přijetí odpovědi ze serveru. | ||
| + | Na následujícím obrázku je možné vidět výpis ze sériové komunikace modulu s počítačem. | ||
| + | |||
| + | {{ :2015:esp8266-ds18b20:odpoved.png?nolink |Záznam sériové kominikace}} | ||
| + | Dále zde uvádím 24 hodinový záznam měření teploty v grafu ze serveru ThingSpeak.com. | ||
| + | {{ :2015:esp8266-ds18b20:teplota.png?nolink |Záznam teploty 24hodin}} | ||
| + | Vzhledem k dlouhé době opakovaní měření teploty a odezvy serveru na novou hodnotu na místo video záznamu o funkci přikládám odkaz na záznam posledních 24 hodin měření teploty, kdy je čidlo umístěno na stole v mém pokoji v místě mého trvalého bydliště. | ||
| + | [[https://thingspeak.com/channels/78922|Aktuální záznam teploty na ThingSpeak.com]] | ||
| + | Záznam bude aktuální po dobu, kdy zvládnou baterie dodávat dostatek proudu pro modul ESP8266. | ||
| + | ===== Závěr ===== | ||
| + | Modul ESP8266 byl sám o sobě pro mne rozuzlením podstaty Internetu věcí (IoT - Internet of Things), až v momentě, kdy jsem do ruky dostal desku o rozměru něco přes 2x1 cm jsem si uvědomil jak snadné je dnes připojit k procesoru Wi-Fi modul, ba co k samotnému modulu připojit zařízení, které tento modul napájený například z malé baterie, může obsluhovat. | ||