piątek, 5 czerwca 2020

[10] ESP32 - Arduino - Adafruit IOT Sterowanie przekaźnikami

W tym poście chciałbym opisać sposób obsługi kilku przekaźników za pomocą ESP32, asystenta google oraz platformy Adafruit IO.

Znalezione obrazy dla zapytania arduino esp32
[Ź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:

  1. #include <WiFi.h>
  2. #include "Adafruit_MQTT.h"
  3. #include "Adafruit_MQTT_Client.h"

Kolejnym elementem jest wprowadzenie definicji preprocesora z stałymi parametrami:

  1. #define WIFI_SSID       "WIFI_SSID"
  2. #define WIFI_PASS       "WLAN_PASS"
  3. #define ADAFRUIT_SERVER      "io.adafruit.com"
  4. #define ADAFRUIT_SERVERPORT  1883    
  5.              
  6. #define ADAFRUIT_USERNAME    "ADAFRUIT_USERNAME"
  7. #define ADAFRUIT_KEY         "ADAFRUIT_KEY"
  8. #define ADAFRUIT_FEEDS       "/feeds/FEEDS_NAME"

  1. void MQTT_connect();
  2.  
  3. WiFiClient client;
  4. Adafruit_MQTT_Client mqtt(&client, ADAFRUIT_SERVER, ADAFRUIT_SERVERPORT, ADAFRUIT_USERNAME, ADAFRUIT_KEY);      
  5. Adafruit_MQTT_Subscribe LED_Control = Adafruit_MQTT_Subscribe(&mqtt, ADAFRUIT_USERNAME  ADAFRUI_FEEDS);

Część główna programu wygląda następująco:

  1. void setup() {
  2.   Serial.begin(115200);
  3.   delay(10);
  4.  
  5.   pinMode(2, OUTPUT);
  6.   pinMode(3, OUTPUT);
  7.  
  8.   Serial.print("Connecting ");
  9.   WiFi.begin(WIFI_SSID, WIFI_PASS);
  10.  
  11.   while (WiFi.status() != WL_CONNECTED)
  12.   {
  13.     delay(500);
  14.     Serial.print(".");
  15.   }
  16.   Serial.println();
  17.   Serial.println("WiFi connected");
  18.   Serial.println("IP address: ");
  19.  
  20.   Serial.println(WiFi.localIP());
  21.  
  22.   mqtt.subscribe(&LED_Control);
  23. }

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:

  1. void MQTT_connect() {
  2.   int8_t ret;
  3.   if (mqtt.connected()) {
  4.     return;
  5.   }
  6.   uint8_t retries = 3;
  7.   while ((ret = mqtt.connect()) != 0) {
  8.        Serial.println(mqtt.connectErrorString(ret));
  9.        Serial.println("Retrying MQTT connection in 5 seconds...");
  10.        mqtt.disconnect();
  11.        delay(5000);
  12.        retries--;
  13.        if (retries == 0) {
  14.          while (1);
  15.        }
  16.   }
  17.   Serial.println("MQTT Connected!");
  18. }

Główna pętla programu wygląda następująco:

  1. void loop() {
  2.   MQTT_connect();
  3.  
  4.   Adafruit_MQTT_Subscribe *subscription;
  5.   Serial.println("Start waiting for msg");
  6.  
  7.   while ((subscription = mqtt.readSubscription(5000)))
  8.   {
  9.     Serial.println("Msg get");
  10.     if (subscription == &LED_Control)
  11.     {
  12.       Serial.print(F("Got: "));
  13.       Serial.println((char *)LED_Control.lastread);
  14.  
  15.       if (!strcmp((char*) LED_Control.lastread, "ON3"))
  16.       {
  17.         digitalWrite(3, HIGH);
  18.         Serial.println("Pin 3 HIGH");
  19.       }
  20.       else if(!strcmp((char*) LED_Control.lastread, "OFF3"))
  21.       {
  22.         digitalWrite(3, LOW);
  23.         Serial.println("Pin 3 LOW");
  24.       }
  25.       else if(!strcmp((char*) LED_Control.lastread, "ON2"))
  26.       {
  27.         digitalWrite(2, HIGH);
  28.         Serial.println("Pin 2 HIGH");
  29.       }
  30.       else if(!strcmp((char*) LED_Control.lastread, "OFF2"))
  31.       {
  32.         digitalWrite(2, LOW);
  33.         Serial.println("Pin 2 LOW");
  34.       }
  35.     }
  36.     else
  37.     {
  38.       Serial.println("Got something else");
  39.     }
  40.   }
  41. }

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.