Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2016:esp8266-alarm

WiFi alarm s ESP8266

Zadání

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.


Úvod

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.

Modul umí pracovat jako klient, server i AP. 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. Pro programování modu lze využít vývojové prostředí Arduino IDE. 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

Jako nejvhodnější se jeví režim Deep sleep s proudovým odběrem pouhých 20 µA. Probuzení modulu z tohoto režimu lze provést pouze resetem na pinu RST.

Pro převod POST požadavku na email nebo SMS jsem použil server IFTTT.com. Na tomto serveru si každý uživatel může vytvořit tzv. Maker ke kterému obdrží jedinečný klíč (ApiKey). Tímto maker lze spouštět jednotlivé applety, které mohou mimo jiné zasílat emaily nebo SMS na ověřené adresy a telefonní čísla. Jediným omezením je zaslání maximálně 10 SMS na měsíc. Požadavkem na maker můžeme také zasílat užitečná data, která lze vložit to textu samotné zprávy.


Hardware

Pro reset uspaného modulu při otevření dveří byl vytvořen detektor náběžné hrany, tento detektor vytváří resetovací impulz. Aby se příliš nezvedal proudový odběr z baterie, je detektor navržen jako RC derivační člen, jehož výstup je zesílen a invertován tranzistorem T1. Při zavřených dveřích je odběr navýšen o 7 µA a při otevřených dveřích je odběr detektoru 20 µA.

Obr. 4 Schéma zapojení.

Na následujícím obrázku jsou průběhy napětí změřené na vstupu a výstupu detektoru náběžné hrany. Vstupem je jazýčkový kontakt umístěný na dveřích. Výstupní signál je veden přímo na pin RST.

Obr. 5 Vstupní a výstupní napětí detektoru náběžné hrany.


Software

Program pro mikroprocesor ESP8266 byl napsán ve vývojovém prostředí Arduino IDE a jsou v něm využity funkce knihovny ESP8266WiFi.h. Na samotném začátku programu je definováno jméno sítě a její heslo, dále je definován server ke kterému se modul bude připojovat a apiKey pro konkrétní Maker. Ve funkci setup() je nastavena komunikace UART a modul se pokusí připojit do sítě, pokud se připojení nezdaří do definovaného času, modul vypíše informaci o této situaci a přejde do hlubokého spánku. Pokud se připojení zdaří modul vypíše na UART IP adresu kterou obdržel z DHCP serveru. Ve funkci loop() se alarm pokusí navázat spojení se serverem, pokud se spojení na portu 80 nezdaří opět modul vypíše error a přejde do režimu spánku. V případě navázání spojení je vytvořen a odeslán POST požadavek. Po tomto odeslání se modul uspí a čeká na další reset, který je vytvořen otevřením dveří.

  #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;
      
      int len = strlen(text);
      len += 7;
      
      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: " + len + "\r\n\r\n" +
                          "value1=" + text + "\r\n");
  
      Serial.println("ESP8266 go to sleep mode");
      ESP.deepSleep(0);
  }

Jak vypadá výpis alarmu na sériovou linku při bezchybné činnosti je vidět na následujícím obrázku.

Obr. 6 Výpis do terminálu.

Jak mohou vypadat jednotlivé Applety na serveru IFTTT.com je vidět na následujícím obrázku.

Obr. 7 Applety na serveru IFTTT.


Ukázkové video

Video s alarmem odesílajícím email.

Video s alarmem odesílajícím SMS.

Na videu je použit jazýčkový kontakt typu NO a proto obvod detekuje přiložení magnetu. Pro detekci vzdálení magnetu je třeba zapojení osadit kontaktem typu NC.


Závěr

V tomto projektu jsem se seznámil s obvodem ESP8266 a funkcemi serveru IFTTT.com. Dále jsem navrhl obvod pro dveřní alarm a napsal program pro mikroprocesor. Takovéto řešení alarmu není příliš spolehlivé, protože při výpadku síťového napájení routeru, nebo při jiném výpadku připojení k internetu je tento alarm nefunkční. Navíc zde není řešena možnost odpojení alarmu majitelem objektu, takže každý průchod je alarmem nahlášen. Zapojení je navrženo s ohledem na spotřebu, protože se jedná o bateriemi napájený obvod. Proudový odběr v režimu hlubokého spánku je kolem 400 µA, tuto spotřebu lze snížit odletováním PWR LED z modulu na pouhých 27 µA při zavřených dveřích a 40 µA při otevřených dveřích.

2016/esp8266-alarm.txt · Poslední úprava: 2017/01/15 20:54 autor: Luboš Tlustoš