Hi, Welcome to weekend project with Stonez56
This week's Arduino episode #37, "Essential IoT Code Base- Wifimanager FOTA + MQTT"
Here is the source code: https://stonez56.blogspot.com/2022/08/android-36-iot-wifimanager-fota-mqtt.html
Today, I will show how to combine three commonly used IoT libraries;
WiFimanager, AsyncElegantOTA, and MQTT To become a common IoT code base. So, for our future projects, ESP8266 or ESP32, would have these basic functions.
Let's first look at these three libraries:
- Wifimanager = Wi-Fi password management, no need to re-burn the code to change the Wi-Fi SSID & password
- FOTA = Use Wi-Fi to update ESP32 code, you can burn code without connecting to USB
- MQTT = Streamlined and lightweight communication protocol (Message Queueing Telemetry Transport)
This episode will only introduce how to integrate MQTT into Wifimanager + AsyncElegantFOTA.
To learn how to start Wifimanager + AsyncElegantOTA, Please watch Android #27 Wifimanager + OTA for ESP32/ESP8266 (ESPAsyncWifimanager / ESPAsyncElegantOTA)) https://youtu.be/UlRLTvl4DRc
==References==
Arduino Library URL:
- * ESPAsync_WiFiManager: https://github.com/khoih-prog/ESPAsync_WiFiManager
- * AsyncElegantOTA: https://github.com/ayushsharma82/AsyncElegantOTA
- * Pubsubclient MQTT Client: https://github.com/knolleary/pubsubclient
==Sample code URL==
ESPAsync_WiFiManager minimal: https://github.com/khoih-prog/ESPAsync_WiFiManager/blob/master/examples/Async_AutoConnect_ESP32_minimal/Async_AutoConnect_ESP32_minimal.ino
ESP32 Async OTA : https://github.com/ayushsharma82/AsyncElegantOTA/blob/master/examples/ESP32_Async_Demo/ESP32_Async_Demo.ino
If you don't have enough time, you can also select the part you want to watch from the timeline below!
Video Timeline: 00:00 Start 01:39 Demonstration of project results 01:57 mqttgo.io MQTT server, free, fast, & stable 05:52 Install three libraries 07:14 Added two ESP32 PINs as MQTT example 07:41 Encrypt the firmware update (ElegantOTA) page 11:44 Explain how the MQTT callback function works 13:07 Control ESP32 I/O pins with MQTT 15:16 Future program can be written from here
=====中文版本======
大家好, 歡迎收看本週的Weekend project with Stonez56。
本周要進行的是 Arduino 第36集,"IoT 基本程式庫 - Wifimanager FOTA + MQTT”
今天來跟大家介紹如何把 一般的 IoT 專案常用到的三個程式庫, WiFiManager 以及WiFi 韌體更新FOTA (Firmware Over the Air), 再加上 MQTT 三個整合在一起, 變成一個常用的 Code base. 往後你的 ESP32 IoT 專案呢, 就可以俱備這些基本功能了!
- Wifimanager = WiFi 密碼管理, 不用重新燒 Code 改 Wifi SSID & 密碼
- FOTA = 用Wi-Fi更新ESP32程式碼, 不用接USB就可以燒Code
- MQTT = 精簡輕量化的通訊協定(Message Queueing Telemetry Transport)
本集僅會介紹如何把 MQTT 整合到 Wifimanager + AsyncElegantFOTA
若想了解如何整合 Wifimanager + AsyncElegantOTA,
請觀看 Arduino #26 AsyncWifimanager ElegantOTA ESP32 (WiFi 密碼管理+ WiFi 韌體更新) https://youtu.be/zepkinJ46Zg
==參考資料==
Arduino Library URL:
- * ESPAsync_WiFiManager: https://github.com/khoih-prog/ESPAsync_WiFiManager
- * AsyncElegantOTA: https://github.com/ayushsharma82/AsyncElegantOTA
- * Pubsubclient MQTT Client: https://github.com/knolleary/pubsubclient
==Sample code URL==
- ESPAsync_WiFiManager minimal: https://github.com/khoih-prog/ESPAsync_WiFiManager/blob/master/examples/Async_AutoConnect_ESP32_minimal/Async_AutoConnect_ESP32_minimal.ino
- ESP32 Async OTA : https://github.com/ayushsharma82/AsyncElegantOTA/blob/master/examples/ESP32_Async_Demo/ESP32_Async_Demo.ino
如果時間不夠的朋友, 也可以從以下的時間軸挑選想看的部份即可!
影片時間軸:
影片時間軸: 00:00 Start 01:39 專案成果示範 01:57 mqttgo.io 快速免費的 MQTT 伺服器 05:52 安裝三支程式庫 07:14 加入兩個 ESP32 PIN做為MQTT範例 07:41 為韌體更新(ElegantOTA)頁面加密 11:44 說明MQTT callback 函數運作方式 13:07 MQTT由此控制ESP32 PIN 15:16 把你的程式可以寫在這裡
IoT基本程式庫原始程式:
- /**
- * Arduino code base for IoT Projects
- * By: Stonez56 aka Kevin Chen 2022-08-16
- *
- * This source code combined three most common Arduino libraries for IoT Projects,
- * ESPAsync_Wifimanager, AsyncElegantOTA, & Pubsubclient MQTT Client.
- *
- * 1. ESPAsync_WiFiManager: https://github.com/khoih-prog/ESPAsync_WiFiManager
- * 2. AsyncElegantOTA: https://github.com/ayushsharma82/AsyncElegantOTA
- * 3. Pubsubclient MQTT Client: https://github.com/knolleary/pubsubclient
- *
- * YouTube video: https://youtu.be/giFHp9RSMvQ
- * Source code is available my blog: https://stonez56.blogspot.com/2022/08/android-36-iot-wifimanager-fota-mqtt.html
- **/
- /*
- * Define Relay pins as examples to send/receive MQTT messages
- * **/
- #define RELAY_PIN_1 12
- #define RELAY_PIN_2 14
- /**
- * Perform OTAs for ESP8266 / ESP32 Elegantly with password protection!
- * https://github.com/ayushsharma82/AsyncElegantOTA
- * **/
- #include <AsyncElegantOTA.h>
- const char *FOTA_USERNAME = "un";
- const char *FOTA_PASSWORD = "pw";
- /**
- * Add MQTT client here` PubSubClient V2.8 by Nick O'Leary
- * https://github.com/knolleary/pubsubclient
- */
- #include <WiFiClient.h>
- #include <PubSubClient.h>
- #define MSG_BUFFER_SIZE (1024)
- char msg[MSG_BUFFER_SIZE];
- /** Taiwan No. 1 Free MQTT Server!! **/
- const char *mqtt_server = "mqttgo.io";
- const int mqtt_port = 1883;
- /****************************************************************************************************************************
- Async_AutoConnect_ESP32_minimal.ino
- For ESP8266 / ESP32 boards
- Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
- Licensed under MIT license
- *****************************************************************************************************************************/
- #if !(defined(ESP32))
- #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
- #endif
- #include <ESPAsync_WiFiManager.h>
- AsyncWebServer webServer(80);
- //Start DNS server
- DNSServer dnsServer;
- //MQTT - Start WiFi client and connect to MQTT server
- WiFiClient espClient;
- PubSubClient mqtt_client(espClient);
- //Define device name
- String DEVICE_NAME = "Dual_Relay_Switch";
- String home_page_message = "";
- void setup()
- {
- Serial.begin(115200);
- pinMode(RELAY_PIN_1, OUTPUT);
- pinMode(RELAY_PIN_2, OUTPUT);
- while (!Serial)
- ;
- delay(200);
- Serial.print("\nAsyncWifimanager started on " + String(ARDUINO_BOARD) + "\n");
- //Initialize ESPAsyncWifimanager instance and assign Wi-Fi Client name "AsyncAutoConnect"!
- //This name and IP address can be checked from the router
- ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "Dual_Relay_Switch");
- //####### RESET SAVED WIFI SETTINGS #############
- //ESPAsync_wifiManager.resetSettings();
- //ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 132, 1), IPAddress(192, 168, 132, 1), IPAddress(255, 255, 255, 0));
- //ESPAsync_wifiManager.autoConnect("Stonez_ESP32S", "AP-NAME", "AP-PASSWORD");
- ESPAsync_wifiManager.autoConnect("Dual_Switch_ESP32S");
- if (WiFi.status() == WL_CONNECTED)
- {
- Serial.print(DEVICE_NAME);
- Serial.print(" is on Local IP: ");
- Serial.println(WiFi.localIP());
- }
- else
- {
- Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status()));
- }
- //Setup home page access content when visite
- home_page_message = "<!DOCTYPE html><html><head><title>" + DEVICE_NAME
- + "</title></head><body><p><h2> Hi! This is " + DEVICE_NAME + "</h2>"
- + "To update firmware, <a href='/update'>Click here!!</a><br/><span>Username & Password required!</span></p><body></html>";
- webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
- { request->send(200, "text/html", home_page_message); });
- //AsyncElegantOTA.begin(&webServer); // Start ElegantOTA WITHOUT username & password
- AsyncElegantOTA.begin(&webServer, FOTA_USERNAME, FOTA_PASSWORD); // Start ElegantOTA with username & password
- webServer.begin();
- Serial.println("AsyncElegantOTA server started @URL/update");
- //MQTT starts here!
- mqtt_client.setServer(mqtt_server, mqtt_port);
- mqtt_client.setCallback(callback);
- }
- /**
- //When MQTT lost connection, this function will be called to reconnect MQTT//
- * Modified to accept multiple MQTT topics
- * https://www.baldengineer.com/multiple-mqtt-topics-pubsubclient.html
- */
- void callback(char *topic, byte *payload, unsigned int length)
- {
- //Print message received
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- for (int i = 0; i < length; i++)
- {
- Serial.print((char)payload[i]);
- }
- Serial.println();
- //Process multiple topics here//
- payload[length] = '\0';
- String message = (char*)payload;
- if (strcmp(topic, "studio/humd_switch") == 0)
- {
- if(message == "true"){
- digitalWrite(RELAY_PIN_1, HIGH);
- Serial.println("humd_switch true");
- }
- if(message == "false"){
- digitalWrite(RELAY_PIN_1, LOW);
- Serial.println("humd_switch false");
- }
- }
- if (strcmp(topic, "studio/humd_switch2") == 0)
- {
- if(message == "true"){
- digitalWrite(RELAY_PIN_2, HIGH);
- Serial.println("humd_switch2 true");
- }
- if(message == "false"){
- digitalWrite(RELAY_PIN_2, LOW);
- Serial.println("humd_switch2 false");
- }
- }
- }
- //============= MQTT ===================
- //When MQTT lost connection, this function will be called to reconnect MQTT//
- void reconnect(){
- //Loop while MQTT connected
- while (!mqtt_client.connected())
- {
- Serial.print("Attempting MQTT connection... ");
- // Create a random client ID
- String clientId = "Stonez_ESP32Client-";
- clientId += String(random(0xffff), HEX);
- // Attempt to connect
- if (mqtt_client.connect(clientId.c_str()))
- {
- Serial.print("connected to ");
- Serial.print(mqtt_server);
- // Once connected, publish an announcement...
- mqtt_client.publish("outTopic", "Hello world");
- // ... and resubscribe
- mqtt_client.subscribe("studio/humd_switch");
- mqtt_client.subscribe("studio/humd_switch2");
- }
- else
- {
- Serial.print("failed, rc=");
- Serial.print(mqtt_client.state());
- Serial.println(" try again in 5 seconds");
- // Wait 5 seconds before retrying
- delay(5000);
- }
- }
- }
- void loop() {
- //============= MQTT ===================
- //if can't connect to MQTT server, then re-connect
- if (!mqtt_client.connected())
- { reconnect(); }
- //constantly check MQTT to see for messages sending/receiving
- mqtt_client.loop();
- /**
- * Write your own code here....
- *
- */
- }
Async_AutoConnect_ESP32_minimal.ino
- /****************************************************************************************************************************
- Async_AutoConnect_ESP32_minimal.ino
- For ESP8266 / ESP32 boards
- Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
- Licensed under MIT license
- *****************************************************************************************************************************/
- #if !(defined(ESP32) )
- #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
- #endif
- #include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager
- AsyncWebServer webServer(80);
- DNSServer dnsServer;
- void setup()
- {
- // put your setup code here, to run once:
- Serial.begin(115200); while (!Serial); delay(200);
- Serial.print("\nStarting Async_AutoConnect_ESP32_minimal on " + String(ARDUINO_BOARD)); Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION);
- ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "AutoConnectAP");
- //ESPAsync_wifiManager.resetSettings(); //reset saved settings
- ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192,168,132,1), IPAddress(192,168,132,1), IPAddress(255,255,255,0));
- ESPAsync_wifiManager.autoConnect("AutoConnectAP");
- if (WiFi.status() == WL_CONNECTED) { Serial.print(F("Connected. Local IP: ")); Serial.println(WiFi.localIP()); }
- else { Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status())); }
- }
- void loop() { }
Async_AutoConnect_ESP8266_minimal.ino
- /****************************************************************************************************************************
- Async_AutoConnect_ESP8266_minimal.ino
- For ESP8266 / ESP32 boards
- Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
- Licensed under MIT license
- *****************************************************************************************************************************/
- #if !( defined(ESP8266) )
- #error This code is intended to run on ESP8266 platform! Please check your Tools->Board setting.
- #endif
- #include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager
- AsyncWebServer webServer(80);
- DNSServer dnsServer;
- void setup()
- {
- // put your setup code here, to run once:
- Serial.begin(115200); while (!Serial); delay(200);
- Serial.print("\nStarting Async_AutoConnect_ESP8266_minimal on " + String(ARDUINO_BOARD)); Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION);
- ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "AutoConnectAP");
- //ESPAsync_wifiManager.resetSettings(); //reset saved settings
- //ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192,168,186,1), IPAddress(192,168,186,1), IPAddress(255,255,255,0));
- ESPAsync_wifiManager.autoConnect("AutoConnectAP");
- if (WiFi.status() == WL_CONNECTED) { Serial.print(F("Connected. Local IP: ")); Serial.println(WiFi.localIP()); }
- else { Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status())); }
- }
- void loop() { }