W tym poście chciałbym opisać sposób obsługi kilku przekaźników za pomocą ESP32, asystenta google oraz platformy Adafruit IO.
[Źródło: http://paulobrien.co.nz/2017/03/16/esp32-programming-with-arduino-on-windows/]
Część główna programu wygląda następująco:
[Źródło: http://paulobrien.co.nz/2017/03/16/esp32-programming-with-arduino-on-windows/]
Aby połączyć Asystenta Google, z platformą Adafruit wykorzystuje IFTTT. Niestety z tego co widzę dane mogą być przesyłane tylko od Asystenta do platformy Adafruit. Czyli np nie uda się odczytać temperatury z ESP. Natomiast nic nie stoi na przeszkodzie aby przesyłać dane by otworzyć dany przekaźnik.
Projekt Arduino:
Na samym początku należy dołączyć potrzebne biblioteki:
- #include <WiFi.h>
- #include "Adafruit_MQTT.h"
- #include "Adafruit_MQTT_Client.h"
Kolejnym elementem jest wprowadzenie definicji preprocesora z stałymi parametrami:
- #define WIFI_SSID "WIFI_SSID"
- #define WIFI_PASS "WLAN_PASS"
- #define ADAFRUIT_SERVER "io.adafruit.com"
- #define ADAFRUIT_SERVERPORT 1883
- #define ADAFRUIT_USERNAME "ADAFRUIT_USERNAME"
- #define ADAFRUIT_KEY "ADAFRUIT_KEY"
- #define ADAFRUIT_FEEDS "/feeds/FEEDS_NAME"
- void MQTT_connect();
- WiFiClient client;
- Adafruit_MQTT_Client mqtt(&client, ADAFRUIT_SERVER, ADAFRUIT_SERVERPORT, ADAFRUIT_USERNAME, ADAFRUIT_KEY);
- Adafruit_MQTT_Subscribe LED_Control = Adafruit_MQTT_Subscribe(&mqtt, ADAFRUIT_USERNAME ADAFRUI_FEEDS);
Część główna programu wygląda następująco:
- void setup() {
- Serial.begin(115200);
- delay(10);
- pinMode(2, OUTPUT);
- pinMode(3, OUTPUT);
- Serial.print("Connecting ");
- WiFi.begin(WIFI_SSID, WIFI_PASS);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- mqtt.subscribe(&LED_Control);
- }
W tej części zawarto inicjalizację komunikacji UART, podłączenie z wifi oraz wprowadzenie adresu serwera z którego będą pobierane dane.
Podłączenie z serwerem MQTT:
Główna pętla programu wygląda następująco:
Tutaj następuje dekodowanie odebranych danych przesłanych przez serwer czy to przez kliknięcie przycisku na tablicy lub gdy jest przekazane z platformy IFTTT.
Platforma Adafruit po skonfigurowaniu dwóch przycisków wygląda następująco:
Podłączenie z serwerem MQTT:
- void MQTT_connect() {
- int8_t ret;
- if (mqtt.connected()) {
- return;
- }
- uint8_t retries = 3;
- while ((ret = mqtt.connect()) != 0) {
- Serial.println(mqtt.connectErrorString(ret));
- Serial.println("Retrying MQTT connection in 5 seconds...");
- mqtt.disconnect();
- delay(5000);
- retries--;
- if (retries == 0) {
- while (1);
- }
- }
- Serial.println("MQTT Connected!");
- }
Główna pętla programu wygląda następująco:
- void loop() {
- MQTT_connect();
- Adafruit_MQTT_Subscribe *subscription;
- Serial.println("Start waiting for msg");
- while ((subscription = mqtt.readSubscription(5000)))
- {
- Serial.println("Msg get");
- if (subscription == &LED_Control)
- {
- Serial.print(F("Got: "));
- Serial.println((char *)LED_Control.lastread);
- if (!strcmp((char*) LED_Control.lastread, "ON3"))
- {
- digitalWrite(3, HIGH);
- Serial.println("Pin 3 HIGH");
- }
- else if(!strcmp((char*) LED_Control.lastread, "OFF3"))
- {
- digitalWrite(3, LOW);
- Serial.println("Pin 3 LOW");
- }
- else if(!strcmp((char*) LED_Control.lastread, "ON2"))
- {
- digitalWrite(2, HIGH);
- Serial.println("Pin 2 HIGH");
- }
- else if(!strcmp((char*) LED_Control.lastread, "OFF2"))
- {
- digitalWrite(2, LOW);
- Serial.println("Pin 2 LOW");
- }
- }
- else
- {
- Serial.println("Got something else");
- }
- }
- }
Tutaj następuje dekodowanie odebranych danych przesłanych przez serwer czy to przez kliknięcie przycisku na tablicy lub gdy jest przekazane z platformy IFTTT.
Platforma Adafruit po skonfigurowaniu dwóch przycisków wygląda następująco:
Platforma IFTTT po konfiguracji wygląda następująco:
Podłączenie z platformą wymaga podania danych do platformy adafruit oraz do konta google z którym jest podłączony asystent.
Sterowanie przez asystenta Google wygląda następująco:
Dużą zaletą tego rozwiązania jest możliwość sterowania pinami (np. przekaźnikami) zdalnie bez konieczności łączenia się z urządzeniem w jednej sieci. Jedynym warunkiem jest możliwość uzyskania połączenia z serwerem. Komunikacja jest szyfrowana, w związku z tym nie ma konieczności martwienia się o bezpieczeństwo sieci. Alternatywnie możemy udostępniać adres publiczny, za który w większości przypadków trzeba dodatkowo płacić, oraz bardziej przykładać się do zabezpieczenia dostępu do sieci.