14. srpna 2017

Jak posílat data z Arduina na Azure


V rámci našeho technologického rozvoje jsem byl požádán o ukázku IoT. Po chvíli diskuzí padla myšlenka na měření vlhkosti a posílání dat do cloudu, kde už si s tím velmi snadno poradíme. Přeci jenom nás živí psaní kódu.

Co je všechno potřeba / jak jsem hledal architekturu

Na začátku bylo potřeba si říct z jakých částí vlastně bude celé řešení složeno. Vzhledem k mým zkušenostem s Arduinem a Azure bylo po chvíli přemýšlení vcelku jasno – potřebuji čidlo vlhkosti, Arduino, připojení k internetu přes WiFi, Azure předplatné, Visual studio a nějaké znalosti psaní kódu v C a C#. Nejprve tedy potřebuji vlhkostní čidlo,
které bude dostatečně přesné, abych byl schopen detekovat prasklou vodovodní trubku v koupelně. Zvolil jsem DHT11. Velmi jednoduché a pro moje potřeby dostačující. Dále bylo zapotřebí Arduino nebo nějaký kompatibilní klon. Pro obyčejné čtení vlhkosti stačí vlastně jakýkoliv typ, nicméně našim hlavním kritériem byla možnost posílání data pomocí WiFi do cloudu. V zásadě existují 2 možnosti. Pořídit si nějaký WiFi shield nebo si ještě více usnadnit práci a najít desku, která obsahuje i WiFi modul. Moje volba padla na WeMos D1 s čipem ESP8266 a integrovaným WiFi modulem. Dnes je dostupná i mini verze, která se vejde do zapalovače, ale přeci jenom tohle je kus hardware ;o). Všem tuto desku doporučuji, ušetříte si spousty starostí.
Teď když už víme, jak vlhkost měřit a posílat do cloudu, zbývá rozhodnout, jakou technologii použít v Azure pro příjem a ukládání dat. Tady bylo mé rozhodování nejtěžší. Azure obsahuje širokou sadu možností, jak toto realizovat. Je možné vytvořit si vlastní virtuální počítač, kde si vše nainstalujeme. Další možností je využít nějaké připravené nástroje, jako je např. IoTHub, Functions, Service Bus, Event Hub, apod. My jsme nakonec zvolili programátorský přístup a rozhodli jsme se využít WebApps, tj. vytvořili jsme si vlastní aplikaci, kterou nasadíme do prostředí Azure. Z mého pohledu se jednalo o zlatou střední cestu. Nemusel jsem se starat o celý virtuální server a trávit poměrně hodně času jeho správou. A zároveň jsem nebyl omezený pouze na funkcionalitu konkrétních nástrojů. Měl jsem tedy poměrně volné ruce na vlastní realizaci. Rozhodl jsem se tedy vytvořit vlastní aplikaci, která bude mít jednoduché REST rozhraní pro zápis a čtení dat.

Jaký nástroj po vývoj

Pro vývoj do Arduina můžete využít buď přímo Arduino IDE, které je možné stáhnout přímo od výrobce Arduina nebo využít některý z dalších nástrojů nebo pluginů, které jsou na trhu. Já osobně používám Arduino IDE for Visual Studio, což je velmi dobrý plugin do Visual Studia.
Pro vývoj do Azure byla volba poměrně jednoduchá. Visual Studio 2017 mi poskytne maximální komfort. Navíc budu používat jeden nástroj pro veškerý vývoj pro Arduino i Azure, resp. .NET.

Jak číst data ze sensorů

Na toto téma již existuje na Internetu mnoho článků a já bych se zde pouze opakoval. Tedy ve zkratce na pin 4 připojím sensor a čtu z něj data. Samozřejmě je zapotřebí použít správnou knihovnu pro čidlo DHT11.h


#include <DHT11.h>

int pin=4;
DHT11 dht11(pin);

void setup() {
}

void loop() {
    float humidity = readHumidity(); 
}

float readHumidity() {
    float temp, humi;
    dht11.read(humi, temp)   
    delay(DHT11_RETRY_DELAY); //delay for reread
    return humi;
}

Jak posílat data pomocí WiFi

To už byl trochu větší oříšek. Nejprve se musí WiFi zinicializovat a následně zaslat data. V mém případě jsem použil knihovnu pro WiFi, kde bylo zapotřebí poskládat POST request. Pokud se chystáte používat nějakou knihovnu pro práci s WiFi, tak všem doporučuji podívat se i na ostatní, jestli vám jiná bude vyhovovat lépe. Existují totiž knihovny, kde se POST request tvoří mnohem snadněji. Jelikož rád poznávám, jak věci fungují, tak jsem šel možná trochu krkolomnější cestou ;o).

#include <ESP8266WiFiMulti.h>



// Promenne pro Azure

const char * host = "adresa_v_Azure.azurewebsites.net"; // ip or dns

const uint16_t port = 80;

const String url = "/api/values";



// Use WiFiClient class to create TCP connections

WiFiClient client;

ESP8266WiFiMulti WiFiMulti;



void setup() {

    Serial.begin(115200);

    initWifi();

}



void loop() {



    float humidity = readHumidity(); 

    sendData(humidity);

    delay(3000);

}



void initWifi() {

      // We start by connecting to a WiFi network

    WiFiMulti.addAP("SSID ", " passpasspass ");



    while(WiFiMulti.run() != WL_CONNECTED) {

        Serial.print(".");

        delay(500);

    }

    Serial.println(WiFi.localIP());

    delay(500);

}



void sendData(float humidity) {



    if (!client.connect(host, port)) {

        delay(5000);

        return;

    }



    String PostData = String(humidity, 2);

   

    client.println("POST " + url + " HTTP/1.1");

    client.println("Host: " + String(host));

    client.println("Content-Type: application/json");   

    client.println("Cache-Control: no-cache");

    client.print("Content-Length: ");

    client.println(PostData.length());

   

    client.println();   

    client.println(PostData);

              

    unsigned long timeout = millis();

    while (client.available() == 0) {

      if (millis() - timeout > 5000) {

        Serial.println(">>> Client Timeout !");

        client.stop();

        return;

      }

    } 



    Serial.println("closing connection");

    client.stop();

}

Jak zpracovávat data – REST služby

I v tomto případě vám vývojový nástroj velmi pomůže. Ve Visual Studiu vyberete Web API projekt a základní kostra služeb se vám vygeneruje za pár vteřin. A teď už záleží pouze na vaší fantazii. Zda budete ukládat data do databáze, zda budete notifikovat do mobilního telefonu a nebo něco docela jiného. Přikládám sem příklad POSTu, který ukládá data do pole a zároveň odesílá notifikaci na mobil.
// POST api/values

[SwaggerOperation("Create")]

[SwaggerResponse(HttpStatusCode.Created)]

public void Post([FromBody]float value)

{

    Models.Store.dataFloat.Insert(0, value);

    if (value > 50)

    {

        var sender = new AndroidNotificationSender();

        sender.Send("Praskla voda", $"Vlhkost stoupla na {value} ");

    }

}


I vlastní nasazení na Azure jsem provedl prostřednictvím Visual Studia.

Co poradit nakonec

Určitě všem doporučuji vyzkoušet si programovat nějaké Arduino nebo podobné prototypovací desky. Za prvé je to výtečná relaxace a za druhé vás to zase trochu více posune ve znalostech a zkušenostech, jak vlastně fungují chytré věci kolem nás.
Asi největším oříškem během realizace byl výběr vhodné Arduino desky a knihoven pro práci s WiFi. Toto je vlastně problémem téměř všech realizací. Na začátku asi budete trochu zmateni, kolik toho vlastně existuje, ale neklesejte na mysli. Po chvíli hledání vše potřebné naleznete. Při hledání většinou postupuji tak, že si udělám základní přehled o dostupných možnostech a pak poměrně rychle vyberu nejjednodušší cestu. Nejsme Akademie věd a důležitější je začít než zkoumat. Pokud se tedy chystáte na komunikaci pomocí WiFi, tak určitě sáhněte po desce WeMos D1 s čipem ESP8266 a integrovaným WiFi modulem.
Všem přeji mnoho zábavy a získávání nových znalostí.

Autor článku: Martin Bíkl, CCA Group a.s.

Žádné komentáře:

Okomentovat