Toto je starší verze dokumentu!
Seznamte se s WiFi čipem ESP8266 a jeho vývojovým prostředím. Vytvořte aplikaci, která bude sloužit jako jednoduchý dveřní alarm - po zapnutí napájení např. jazýčkovým kontaktem se ESP8266 připojí na WiFi a odešle pomocí GET požadavku informaci o události, např. na server ThingSpeak nebo do vlastního PHP skriptu.
ESP8266 je nejlevnější dostupný WiFi modul. Jeho cena se pohybuje do sta korun. Díky široké komunitě je k dispozici dostatek materiálů, návodů i vlastního firmware. Modul je miniaturní a je až neuvěřitelné, že se podařilo vše umístit na desku o rozměrech 15 x 25mm. V současné době je k dispozici několik modifikací ESP8266, které se liší anténou, která může být integrovaná na plošném spoji, nebo keramická. Některé modifikace obsahují i konektor pro připojení externí antény. Zde použitý modul má integrovanou anténu, která je jako meandr přímo na plošném spoji. Napájecí napětí je 3.3V a je třeba myslet na proudové špičky při určitých komunikačních stavech, zejména registraci do WiFi sítě. Zde je potřeba použít kondenzátor dostatečné kapacity pro vykrytí těchto špiček. Modul zvládá komunikci podle normy 802.11 b/g/n. A UART je od výrobce nastaven na pevnou komunikační rychlost 115200 b/s.
Obr. 1 Modul s integrovanou anténou na plošném spoji.
Obr. 2 Modul s integrovanou keramickou anténou a konektorem k připojení externí antény.
Obr. 3 Zapojení pinů u modulu s integrovanou anténou.
Resetovací signál je aktivní v logické nule a příslušný pin s označením RST musí být osazen externím pull-up odporem. Pin s označením CH_PD povoluje rádiovou komunikace a je aktivní v logické jedničce. Programování tohoto modulu probíhá přes sériovou komunikaci. Před samotným programováním je zapotřebí uvést modul do flashovacího režimu, toto se provede resetem při kterém je pin GPIO0 držen ve stavu logické nuly. Dveřní alarm navržený v tomto projektu bude napájen bateriemi, proto je zapotřebí využít úsporný režim modulu. Dostupné úsporné režimy a jejich spotřeba je uvedena v tabulce.
Item | Modem sleep | Light sleep | Deep sleep |
---|---|---|---|
WiFi | OFF | OFF | OFF |
System clock | ON | OFF | OFF |
RTC | ON | ON | ON |
CPU | ON | Pending | OFF |
Current | 15 mA | 0.4 mA | 20 µA |
Obr. 4 Schéma zapojení.
#include <ESP8266WiFi.h> #define EMAIL //if define EMAIL then send email else send SMS const char* ssid = "xxxxxxxx"; //your SSID const char* password = "yyyyyyyy"; //your PASSWORD const char* host = "maker.ifttt.com"; //webserver const char* apiKey = "zzzzzzzz"; //your Api Key #ifdef EMAIL const char* applets = "Alarm_email"; //Applets name for Email #else const char* applets= "Alarm_sms"; //Applets name for SMS #endif const char* text = "Dvere byly otevreny, vyhlasen poplach !!!"; //Send text in Email or SMS const int* port = 80; //http port const int* wait = 100; //waiting to connect wifi (wait * 0.1s) const int* baudrate = 115200; //UART baud rate void setup() { int counter = 0; Serial.begin(baudrate); delay(100); Serial.println(); Serial.println(); Serial.println("Door Alarm"); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print(">"); counter++; if(counter > wait) { Serial.println(); Serial.println("Connection failed"); Serial.println("ESP8266 go to sleep mode"); ESP.deepSleep(0); } } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { Serial.print("Connecting to "); Serial.println(host); WiFiClient client; if (!client.connect(host, port)) { Serial.println("Connection failed"); Serial.println("ESP8266 go to sleep mode"); ESP.deepSleep(0); } String url = "/trigger/"; url += applets; url += "/with/key/"; url += apiKey; Serial.print("Requesting URL: "); Serial.println(url); client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 52\r\n\r\n" + "value1=" + text + "\r\n"); Serial.println("ESP8266 go to sleep mode"); ESP.deepSleep(0); }