為了可以擁有指令擴充能力,還是採用 JSON 格式
--
增加 JSON 處理能力
到 GitHub 下載 zip 後,Arduino → 草稿碼 → 匯入程式庫 → 加入 .ZIP 程式庫,選擇剛剛下載的 zip 檔案
在整理資料的時候版本已經升到 6 了,以前的程式碼不適用了 ... = =a
--
JSON 接收處理
參照 GitHub 上的 example 加上上一章 ESP8266 應用一:智能插座 .5 改用 Socket 通訊為主動控制做準備 TCP Client 的 TCP Server 程式來發送 json 測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <ESP8266WiFi.h> #include <ArduinoJson.h> // const char* ssid = "ssid name"; const char* password = "ssid password"; // Socket Server const char* host = "192.168.0.45"; const int port = 3000; int i = 0; WiFiClient client; void setup() { Serial.begin(115200); Serial.print( "Start..." ); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("."); } } void loop() { if (!client.connected()) { client.connect(host, port); client.println("connected..."); } delay(1000); // wifi 主動控制 String jsonControl = client.readStringUntil('\n'); if ( jsonControl.length() >= 1) { Serial.println("loop: " + jsonControl); } DynamicJsonDocument doc(1024); deserializeJson(doc, jsonControl); JsonObject obj = doc.as<JsonObject>(); String power = obj["power"]; Serial.println(power); } |
運作起來的結果大概就像這樣
--
繼電器控制
繼電器有分高電平和低電平,意思就是有電還是沒電可以導通,選擇要看需求,例如在本次的專案是智能插座,打算沒通電的時候就也不通電,所以選擇的是高電平控制繼電器
把上面的程式加上繼電器的接腳輸出定義,以及將從 TCP Server 接收的 JSON 指令解析控制繼電器即可完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include <ESP8266WiFi.h> #include <ArduinoJson.h> // const char* ssid = "ssid name"; const char* password = "ssid password"; // Socket Server const char* host = "192.168.0.45"; const int port = 3000; int i = 0; WiFiClient client; void setup() { Serial.begin(115200); Serial.print( "Start..." ); // 繼電器 pinMode(D2, OUTPUT); digitalWrite(D2, HIGH); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("."); } } void loop() { if (!client.connected()) { client.connect(host, port); client.println("connected..."); } delay(1000); // wifi 主動控制 String jsonControl = client.readStringUntil('\n'); if ( jsonControl.length() >= 1) { Serial.println("loop: " + jsonControl); } DynamicJsonDocument doc(1024); deserializeJson(doc, jsonControl); JsonObject obj = doc.as<JsonObject>(); String power = obj["power"]; Serial.println(power); if (power == "on") { digitalWrite(D2, HIGH); } if (power == "off") { digitalWrite(D2, LOW); } } |
--
2,902 total views, 2 views today