大家好, 今天和大家來分享, Arduino #32 用一塊ESP32來學 IOT (#32 Learn IOT with MQTT + ESP32) 這個影片很適合初學者來觀看學習. 影片內容主要是告訴大家, 只要手上有一塊 ESP32 和一台電腦, 就可以開始學習 IOT 了 ! 看過這個影片, 你會了解學習 IOT 一點都不難喔! 甚至可以延伸作法, 利用 MQTTlens 透過雲端EMQX來做遠端的控制!
參考資料:
- Pubsubclient library: https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino
- Additional Boards Manager URL: https://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json
- Source code: https://stonez56.blogspot.com/
影片時間軸:
- 00:00 開始
- 00:29 什麼是 MQTT,它是如何運作的?
- 01:30 你的第一個IOT專案!
- 01:55 MQTT 程式:pubsubclient
- 02:40 Arduino IDE: 設定Additional Boards Manager URL
- 03:09 Arduino IDE 其它設定
- 03:48 從我的部落格中下載程式並貼在Arduino IDE
- 04:07 在程式中更改必要的設定
- 07:27 從 Chrome 瀏覽器啟動 MQTTlens
- 07:54 在 MQTTlens 新增 EMQX 連線
- 09:54 訂閱 ESP32上的兩個主題
- 11:19 從 MQTTlens 發布主題
- 12:45 本次主要內容摘要
程式碼:
- /*
- Basic ESP8266 MQTT example
- This sketch demonstrates the capabilities of the pubsub library in combination
- with the ESP8266 board/library.
- It connects to an MQTT server then:
- - publishes "hello world" to the topic "outTopic" every two seconds
- - subscribes to the topic "inTopic", printing out any messages
- it receives. NB - it assumes the received payloads are strings not binary
- - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led,
- else switch it off
- It will reconnect to the server if the connection is lost using a blocking
- reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
- achieve the same result without blocking the main loop.
- To install the ESP8266 board, (using Arduino 1.6.4+):
- - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs":
- http://arduino.esp8266.com/stable/package_esp8266com_index.json
- - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266"
- - Select your ESP8266 in "Tools -> Board"
- */
- #include <WiFi.h>
- #include <PubSubClient.h>
- #include <EasyButton.h>
- #define LED 2 //built-in LED on ESP32
- // Update these with values suitable for your network.
- const char *ssid = "WiFi-SSID";
- const char *password = "WiFi-PASSWORD";
- // Define your client ID on EMQX
- String mqtt_ClientID = "stonez56_IOT_Station_";
- // Define your topics to subscribe / publish
- const char* sub_topic = "stonez56/esp32s";
- const char* pub_led_topic = "stonez56/esp32s_led_state";
- const char* pub_init_topic = "stonez56/esp32s_is_back";
- // EMQX broker parameters
- const char *mqtt_server = "broker.emqx.io";
- const char *mqtt_userName = "emqx";
- const char *mqtt_password = "public";
- WiFiClient espClient;
- PubSubClient client(espClient);
- unsigned long lastMsg = 0;
- #define MSG_BUFFER_SIZE (50)
- char msg[MSG_BUFFER_SIZE];
- int value = 0;
- void setup_wifi()
- {
- delay(10);
- // We start by connecting to a WiFi network
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- randomSeed(micros());
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- }
- void callback(char *topic, byte *payload, unsigned int length)
- {
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- for (int i = 0; i < length; i++)
- {
- Serial.print((char)payload[i]);
- }
- Serial.println();
- payload[length] = '\0';
- String message = (char *)payload;
- if (strcmp(topic, sub_topic) == 0)
- {
- if (message == "off")
- {
- digitalWrite(LED, LOW); //Turn off
- client.publish(pub_led_topic, "off");
- }
- if (message == "on")
- {
- digitalWrite(LED, HIGH); //Turn on
- client.publish(pub_led_topic, "on");
- }
- }
- /* Switch on the LED if an 1 was received as first character
- // if ((char)payload[0] == '1')
- // {
- // digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
- // // but actually the LED is on; this is because
- // // it is active low on the ESP-01)
- // }
- // else
- // {
- // digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
- // } */
- }
- void reconnect()
- {
- // Loop until we're reconnected
- while (!client.connected())
- {
- Serial.println("Attempting EMQX MQTT connection...");
- // Create a random client ID
- mqtt_ClientID += String(random(0xffff), HEX);
- // Attempt to connect
- if (client.connect((mqtt_ClientID, mqtt_userName, mqtt_password)))
- {
- Serial.print(" connected with Client ID: ");
- Serial.println(mqtt_ClientID);
- // Once connected, publish an announcement...
- client.publish(pub_init_topic, "Hi, I'm online!");
- // ... and resubscribe
- client.subscribe(sub_topic);
- }
- else
- {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- // Wait 5 seconds before retrying
- delay(5000);
- }
- }
- }
- void setup()
- {
- pinMode(LED, OUTPUT); // Initialize the _LED pin as an output
- digitalWrite(LED, LOW); //default ESP32 LOW is turn off
- Serial.begin(115200);
- setup_wifi();
- client.setServer(mqtt_server, 1883);
- client.setCallback(callback);
- }
- void loop()
- {
- if (!client.connected())
- {
- reconnect();
- }
- client.loop();
- /* unsigned long now = millis();
- // if (now - lastMsg > 2000)
- // {
- // lastMsg = now;
- // ++value;
- // snprintf(msg, MSG_BUFFER_SIZE, "hello world #%ld", value);
- // Serial.print("Publish message: ");
- // Serial.println(msg);
- // client.publish("stonez56/esp32s_button_pushed", msg);
- // } */
- }