Toto je starší verze dokumentu!
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í.
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.
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í. Pro vytváření programů v jazyku C je nejlepší variantou zvolit rozšíření pro Arduino, pro které existuje i překladač. Toto prostředí jsem využil i já k vypracování projektu.
Teplotní čidlo Dallas DS18B20 je 9-12 bitový digitální teploměr s rozsahem -55 až 125°C. Teploměr komunikuje po 1-Wire sběrnici, čímž se stává více než vhodným pro použití s modulem ESP8266 ESP-01, který má pouze 2 GPIO piny.
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.
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.
Pro vytvoření programu bylo využito rozšíření pro Arduino a vhodné knihovny pro komunikaci s digitálním teploměrem DS18B20.
Inicializace použitých knihoven pro obsluhu ESP88226 a DS18B20 komunikující po 1-wire sběrnici.
#include <ESP8266WiFi.h> #include <OneWire.h> #include <DallasTemperature.h>
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.
#define ONE_WIRE_BUS 2 // Inicializace DS18B20 na pinu GPIO2 OneWire oneWire(ONE_WIRE_BUS); 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"; float oldTemp; bool scnd = false;
Inicializace sériové komunikace a připojení k sítí.
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();
}
V této smyčce se provádí změření a odeslání teploty na server ThingSpeak.com
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í
}
}