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.
Autor článku: Martin Bíkl, CCA Group a.s.
Žádné komentáře:
Okomentovat