1. Zakup urządzenia
Wg producenta jest to
Moduł WiFi oparty na układzie ESP8266. Na pokładzie znajduje się 9 portów GPIO z obsługą I2C i SPI, wejście analogowe oraz złącze baterii lipol 3,7 V. Posiada oprogramowanie NodeMCU, które wspiera język skryptowy Lua lub środowisko Arduino IDE. Dodatkowym atutem jest wbudowany konwerter napięć na liniach interfejsu UART.
Czyli skrócie dostajemy gotowe urządzenie, które potrafi się komunikować po WIFI i ma możliwość podłączania dodatkowych czujników m.in. temperatury i wilgotności.
2. Konfiguracja IoTHub na platformie Azure
Wybieramy menu “wszystkie zasoby”
Z kategorii Internet of Things wybieramy IoT Hub i wypełniamy podstawowe parametry, unikalną nazwę, grupę zasobów i lokalizację. Na początek proponuję zacząć od planu darmowego F1, ale jeśli planujemy coś bardziej poważnego, to w chwili obecnej nie ma możliwości podniesienia planu usługi. Można tylko postawić kolejna usługę. Wstaje ona po kilku minutach.
Po wygenerowaniu kluczy z polisy iothubowner możemy przejść do rejestracji naszych urządzeń
Device ID: Nazwa urządzenia. Unikalna w ramach IoT huba, wielkie i male litery maja znaczenie
Authentication Type: Pozostawiamy Symmetric Key.
Auto Generate Keys: Pozostawiamy zaznaczone (zostaną automatycznie wygenerowanie klucze).
Connect device to IoT Hub: Pozostawiamy Enable.
Każde z urządzeń będzie mieć wygenerowane dwa klucze.
Konfiguracja połączeń w tym przypadku wygląda tak
HostName=djkormohub.azure-devices.net;DeviceId=ESP8266;SharedAccessKey=KLUCZ1
HostName=djkormohub.azure-devices.net;DeviceId=ESP8266;SharedAccessKey=KLUCZ2
I tę konfigurację będziemy wykorzystywać podczas pracy z urządzeniem. W ten sposób Hub wie, z jakiego urządzenia nadchodzą dane z czujników.
Jeżeli nasz hub nazwałem djkormohub to warto sprawdzić połączenie sieciowe na porcie 8883
telnet djkormohub.azure-devices.net 8883
3. Instalacja oprogramowania Arduino
Adres instalatora
https://www.arduino.cc/en/Main/Software
W momencie pisania artykułu jest to wersja 1.8.5.
Pojawi się grupa pytań wymagających potwierdzenia instalacji sterowników “Arduino”
Instalacja została zakończona.
4. Konfiguracja Visual Studio Code
Potrzebny będzie dedykowany plugin do Arduino. Plugin ten nie zadziała bez instalacji oprogramowania z punktu 3).
Adres pluginu
https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino
Po instalacji pluginu proponuje restart VSC. U mnie bez tego nie były możliwe dalsze kroki.
Zaczynamy od konfiguracji dla ESP8266.
Podlączyłem urządzenie po USB, pojawił się komunikat
-> Arduino: Boar Manager.
Naciskamy aditional Urls. Wstawiamy w pliku User Settings .json adres
"arduino.additionalUrls":
[
"http://arduino.esp8266.com/stable/package_esp8266com_index.json"
]
Wybieramy w polu “filter your search” esp8266.
Wybrałem ostatnią wersje stabilną, czyli 2.4.0 i przycisk install. Po krótkiej chwili skończyło się to tak:
java.io.IOException: Can't extract file C:\Users\User\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.12\esptool.exe, file already exists!
at cc.arduino.utils.ArchiveExtractor.extract(ArchiveExtractor.java:212)
at cc.arduino.utils.ArchiveExtractor.extract(ArchiveExtractor.java:81)
at cc.arduino.contributions.packages.ContributionInstaller.install(ContributionInstaller.java:142)
at processing.app.Base.(Base.java:323)
at processing.app.Base.main(Base.java:144)
[Error] Exit with code=255
Ups…
Bez chwili namysłu wybrałem starszą wersję 2.3.0. Udało się
[Done] Installed board package - esp8266
A poźniej zrobiłem upgrade. W ten sposób mam działającą wersje 2.4.0.
Uruchamiamy Arduino:Board Config
To czego nam brakuje to bibioteki do obsługi naszego IoTHuba w Azure i nie tylko
Uruchamiamy Arduino: Librany Manager i instalujemy bibioteki
AzureIoTHub
AzureIoTUtility
AzureIoTProtocol_MQTT
ArduinoJso
DHT sensor library
Adafruit Unified Sensor
[Done] Installed library - AzureIoTHub
[Done] Installed library - AzureIoTUtility
[Done] Installed library - AzureIoTProtocol_MQTT
[Done] Installed library - ArduinoJson
[Done] Installed library - DHT sensor library
[Done] Installed library - Adafruit Unified Sensor
Oprogramowanie do pracy z płytką zostało zinstalowane. Czas na prosty przykład. Pobieram z githuba, gotowy projekt przygotowany przez Microsoft.
git clone https://github.com/Azure-Samples/iot-hub-feather-huzzah-client-app.git
Ponieważ, nie mam jeszcze czujnika DTH22 (temparatura i wilgotność) wykorzystam możliwość symulacji jego zachowania.
W pliku config.h należy zmienić linię kodu odpowiedzialną za nią
define SIMULATED_DATA true
Otwieramy w VSC plik app.ino.
Spróbujmy zapisać oprogramowanie na urządzeniu
Uruchamiamy Arduino:Upload i po wybraniuy portu komunikacyjnego pojawi się po chwili następujący komunikat.
exec: "/bin/xtensa-lx106-elf-g++": file does not exist
[Error] Exit with code=1
Kolejne ups ?
Po krótkim wykorzystaniu wujka Google trafiłem na rozwiązanie. Należy zainstalować brakujące oprogramowanie w podkatalogu hardware Arduino.
cd hardware
mkdir esp8266com
cd esp8266com
git clone https://github.com/esp8266/Arduino.git esp8266
cd esp8266/tools
python get.py
Log z instalacji
C:\Program Files (x86)\Arduino\hardware>mkdir esp8266com
C:\Program Files (x86)\Arduino\hardware>cd esp8266com
C:\Program Files (x86)\Arduino\hardware\esp8266com>git clone https://github.com/
esp8266/Arduino.git esp8266
Cloning into 'esp8266'...
remote: Counting objects: 17296, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 17296 (delta 8), reused 17 (delta 6), pack-reused 17260
Receiving objects: 100% (17296/17296), 41.40 MiB | 1.81 MiB/s, done.
Resolving deltas: 100% (10102/10102), done.
C:\Program Files (x86)\Arduino\hardware\esp8266com>cd esp8266/tools
C:\Program Files (x86)\Arduino\hardware\esp8266com\esp8266\tools>python get.py
Platform: i686-mingw32
Downloading esptool-0.4.13-win32.zip
Done
Extracting dist/esptool-0.4.13-win32.zip
Renaming esptool-0.4.13-win32/ to esptool
Downloading win32-xtensa-lx106-elf-gb404fb9-2.tar.gz
Done
Extracting dist/win32-xtensa-lx106-elf-gb404fb9-2.tar.gz
Downloading mkspiffs-0.2.0-no_magic_length-windows.zip
Done
Extracting dist/mkspiffs-0.2.0-no_magic_length-windows.zip
Renaming mkspiffs-0.2.0-no_magic_length-windows/ to mkspiffs
Restartujemy Arduino.
Instalujemy obraz z poziomu Arduino (VSC nadal poprawnie nie działa).
Zwróćcie uwagę na migająca niebieską diodę podczas zapisywania oprogramowania.
Oprogramowanie wgrane, teraz należy podłączyć urządzenie do naszej sieci WIFI.
Po podaniu nazwy sieci WIFI (SSID) , hasła (PASS) i konfiguracji połączenia naszego urządzenia do IotHuba w postaci
HostName=djkormohub.azure-devices.net;DeviceId=ESP8266;SharedAccessKey=KLUCZ1
Urządzenie uruchamia się:
SDK:2.2.1(cfd48f3)/Core:win-2.5.0-dev/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-7-g2b827f8) Serial successfully inited. Do you need re-input your credential information?(Auto skip this after 5 seconds)[Y/n] Input your Wi-Fi SSID: Input your Wi-Fi password: Input your Azure IoT hub device connection string: Attempting to connect to SSID: guest. connected with guest, channel 9 dhcp client start... ip:192.168.1.196,mask:255.255.255.0,gw:192.168.1.1 Connected to wifi guest. Fetched NTP epoch time is: 28828. IoT Hub SDK for C, version 1.1.29 Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":1,"temperature":29,"humidity":36}. IoTHubClient accepted the message for delivery. :ref 1 :ctmo :abort :ur 1 :del TLS failed to start the connection process. Error: io_open failed failure connecting to address djkormohub.azure-devices.net. :ref 1 :ctmo :abort :ur 1 :del TLS failed to start the connection process. Error: io_open failed failure connecting to address djkormohub.azure-devices.net. :ref 1
Widać, że urządzenie podłączyło się do sieci bezprzewodowej i próbuje wystać komunikat w postaci
{"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":1,"temperature":29,"humidity":36}.
Urządzenie ESP_* jest widoczne od strony rutera WIFI, otrzymało przez DHCP swój adres IP.
Włączyłem opcje debugowania i mam taki wyciąg z logów
[hostByName] request IP for: djkormohub.azure-devices.net
[hostByName] Host: djkormohub.azure-devices.net IP: 10.0.0.1
Problematyczne okazało się żle skonfigurowany DNS i urządzenie nie potrafiło ustalić adresu IP huba. IP 10.0.0.1 to lokalny adres rutera mojego dostawcy internetu.
Po naprawie konfiguracji w logach monitora zaczęły pojawiac sie komunikaty
Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":79,"temperature":28,"humidity":37}.
IoTHubClient accepted the message for delivery.
Message sent to Azure IoT Hub
Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":80,"temperature":13,"humidity":34}.
IoTHubClient accepted the message for delivery.
Message sent to Azure IoT Hub
Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":81,"temperature":11,"humidity":36}.
IoTHubClient accepted the message for delivery.
Message sent to Azure IoT Hub
Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":82,"temperature":16,"humidity":37}.
IoTHubClient accepted the message for delivery.
Message sent to Azure IoT Hub
Sending message: {"deviceId":"Feather HUZZAH ESP8266 WiFi","messageId":83,"temperature":30,"humidity":33}.
IoTHubClient accepted the message for delivery.
Zweryfikowałem metryki diagnostyczne usługi w Azure. Pojawiły się pierwsze komunikaty.
W darmowym planie F1 mamy do wykorzystania 8000 komunikatów na dobę, jeśli dobrze oszacowałem oznacza to jeden komunikat co 11 sekund. Do prostych pomiarów jest to wystarczające.
- Literatura
https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-arduino-huzzah-esp8266-get-started - https://github.com/esp8266/Arduino
mmoskit
Super artykuł. Jestem pod wrażeniem!