摘要
上次利用STM32單片機實作連接OneNET并支持Siri語音助手控制的功能,這次利用ESP-01S實作Siri遠程控制燈開關和獲取溫濕度資料,
本段代碼支持ESP8266系列的01、01S模塊甚至12E、12F系列模塊,如果使用的是12系列的話還支持深度睡眠喚醒功能,
步驟簡述
OneNET注冊和創建產品和設備
安裝Arduino開發環境和必要的庫
ESP-01S編程和下載
iOS快捷指令撰寫
點亮和關閉一個燈
查詢DHT11溫濕度
設計步驟
1、OneNET注冊和創建產品和設備
在中國移動OneNET物聯網平臺注冊并創建多協議接入產品,然后創建一個設備,并記下產品ID、設備ID、Api-Key、鑒權資訊等必要資訊;

在設備管理頁面的“資料流模板”界面創建溫度、濕度、LED三個變數的資料流;

2、安裝Arduino開發環境和必要的庫
在搜索引擎搜索Arduino并進入官網下載安裝Arduino開發環境,然后在首選項里添加附加開發板管理器網址:http://arduino.esp8266.com/stable/package_esp8266com_index.json

添加完之后IDE就支持ESP8266系列MCU啦,然后安裝庫檔案,在工具-管理庫里面添加必要的庫:
//需提前安裝的庫檔案:
//ESP8266WiFi庫、ArduinoJSON庫(V6)、PubSubClient庫、DHT Sensor庫
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include "PubSubClient.h"
#include "DHT.h"

3、ESP-01S編程和下載
安裝好庫之后,將ESP-01S通過USB轉TTL模塊連接電腦,然后在Arduino中選擇對應埠,并打開串口監視器測驗AT指令(官方韌體)以驗證ESP-01S與電腦通信正常,
然后在下面的代碼里修改自己對應的資訊,包括WiFi資訊、OneNET產品ID、設備ID等資訊,然后驗證、編譯、下載,
完整代碼如下:
/*
============================================================================
Name : ESP-01S_OneNET.ino
Author : Kaelvean
Version : 1.1
Copyright : 2021.6 YYY copyright.
Description : 實作ESP-01S利用MQTT連接OneNET,上傳LED狀態和溫濕度資料至OneNET平臺
支持用網頁、iOS快捷指令或Siri控制IO2引腳的電平高低以實作開關燈或繼電器
利用Siri或網頁實時監控溫濕度值
============================================================================
*/
//需提前安裝的庫檔案:ESP8266WiFi庫、ArduinoJSON庫(V6)、PubSubClient庫、DHT Sensor庫
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include "PubSubClient.h"
#include "DHT.h"
//OneNET平臺創建的產品和設備相關資訊
#define mqtt_devid "**********" //設備ID
#define mqtt_pubid "**********" //產品ID
#define mqtt_password "**********" //鑒權資訊
#define mqtt_server "183.230.40.39" //OneNET服務器IP
#define mqtt_sevr_port 6002 //埠填6002
#define WIFI_SSID "********" //WIFI名稱
#define WIFI_PASSWD "********" //WiFi密碼
#define DHTPIN 0 //DHT11傳感器的DATA口接ESP-01S的IO0
#define DHTTYPE DHT11 //默認DHT11,也支持DHT22/21
static WiFiClient espClient;
static PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
char Mesg_Buf[256]; //發送資訊緩沖區
char Json_Buf[200]; //發送的json格式資料
char Recv_Buf[200]; //接識訓沖
unsigned short sd_json_len = 0; //待發送的json資料長度
unsigned short LED_Light; //LED控制變數,1表示開
unsigned short SleepMode = 0; //睡眠模式控制變數,非零進入睡眠
float Humidity = 0.0; //濕度
float Temperature = 0.0; //溫度
void setup()
{
Serial.begin(115200); //初始化串口
while (!Serial) continue;
pinMode(LED_BUILTIN, OUTPUT); //ESP8266模塊的LED連在IO2上,LED_Bulitin即IO2
digitalWrite(LED_BUILTIN, HIGH);//拉高熄滅LED
wifiInit(WIFI_SSID, WIFI_PASSWD); //連接WIFI
client.setServer(mqtt_server, mqtt_sevr_port); //連接Onenet服務器
client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //連接到產品&設備
client.setCallback(CMDcallback); //客戶端收到資訊回呼
dht.begin();
}
void loop()
{
client.loop(); //客戶端回圈檢測
//上傳間隔6秒,可修改
if (millis() % 6000 == 0) {
get_DHT_value(); //獲取溫濕度
LED_Light = !digitalRead(LED_BUILTIN);
ESPsendData(); //發送資料
}
}
//回呼,topic&cmdid,payload:有效資訊 3: length:長度
void CMDcallback(const char *topic, byte *payload, unsigned int length)
{
Serial.println("Topic & cmdid:");
Serial.println(topic); //列印topic和cmdid
Serial.println("payload:"); //列印Payload
for (size_t i = 0; i < length; i++) {
Serial.print((char)payload[i]);
Recv_Buf[i] = (char)payload[i];
}
Serial.println(); //換行
Recv_JsonPro(); //接收到的JSON資料決議
Cmd_Opera(); //根據接收的資料執行相關操作
}
//讀取溫濕度
void get_DHT_value() {
Humidity = dht.readHumidity();
Temperature = dht.readTemperature();
while (isnan(Humidity) || isnan(Temperature))
return;
}
//接收JSON資料決議
void Recv_JsonPro()
{
//決議json
StaticJsonDocument<64> doc;
DeserializationError error = deserializeJson(doc, Recv_Buf);
if (error) {
Serial.print(F("反序列化JSON失敗!"));
Serial.println(error.c_str());
return;
}
//獲取鍵值
LED_Light = doc["LED_Light"];
SleepMode = doc["SleepMode"];
}
//執行服務器下發的命令
void Cmd_Opera()
{
if (LED_Light == 0)digitalWrite(LED_BUILTIN, HIGH);
else digitalWrite(LED_BUILTIN, LOW);
if (SleepMode != 0) {
Serial.println("進入深度睡眠模式");
ESP.deepSleep(0);
}
}
//發送資料生成JSON格式
void Mesg_JsonPro()
{
StaticJsonDocument<200> doc;
doc["Humidity"] = Humidity;
doc["Temperature"] = Temperature;
doc["LED_Light"] = LED_Light;
serializeJson(doc, Json_Buf); //構造序列化json,緊湊型
Serial.println(Json_Buf); //列印序列化json
}
//發送資料至服務器
void ESPsendData() {
ReconnectJudge();//斷線檢測與重連函式
Mesg_JsonPro(); //構造JSON格式資料
sd_json_len = strlen(Json_Buf);
Mesg_Buf[0] = char(0x03); //資料第一位是0X03
Mesg_Buf[1] = char(sd_json_len >> 8); //資料第二位是要發送的資料長度的高八位
Mesg_Buf[2] = char(sd_json_len & 0xff); //資料第三位是要發送資料的長度的低八位
memcpy(Mesg_Buf + 3, Json_Buf, sd_json_len); //從Mesg_Buf的第四位開始,放入要傳的資料Json_Buf
Mesg_Buf[3 + sd_json_len] = 0; //添加一個0作為最后一位
client.publish("$dp", (uint8_t *)Mesg_Buf, 3 + sd_json_len); //發送
}
//Wi-Fi連接函式
void wifiInit(const char *ssid, const char *passphrase) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("準備連接Wi-Fi");
delay(3000);
}
Serial.println("Wi-Fi連接成功");
}
//斷線檢測與重連函式
void ReconnectJudge() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi掉線重連中...");
wifiInit(WIFI_SSID, WIFI_PASSWD);
}
while (!client.connected()) {
Serial.println("MQTT掉線重連中...");
if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) {
Serial.println("連接成功");
}
else {
Serial.println("重連失敗");
Serial.println(client.state());
Serial.println("將在3s后重試");
delay(3000);
}
}
}
4、iOS快捷指令撰寫
在這篇文章里有詳細的介紹如何撰寫iOS快捷指令來控制設備:
基于iOS快捷指令和Siri控制連接OneNET物聯網平臺的STM32的智能安防家居系統
在這里簡要介紹一下關鍵操作:
需要用到HTTP通信協議的POST和GET方法,恰巧快捷指令就能直接發起HTTP請求,所以很簡單:
請求方式:POST URL:http://api.heclouds.com/cmds
URL引數:device_id、qos、timeout
HTTP頭部:api-key
請求體:用戶自定義內容,json、字串,數字
例如:
POST http://api.heclouds.com/cmds?device_id=123456789 HTTP/1.1
api-key: l2aH**BRtAo=dk==
Host: api.heclouds.com
Content-Length: 15
{“LED_Light”:1}
回傳示例:(收到這樣的代碼代表發送成功)
{ "errno": 0, "error": "succ", "data": { "cmd_uuid": "81572aae-fc34-5deb-8f06-ab45d73cb12b" } }
否則發送失敗:(errno非零的時候)
{ "errno": 10, "error": "device not online: 8029377" }
5、命令下發
點亮和關閉一個LED燈:
在快捷指令里點擊“打開那個藍色指示燈”,即可打開ESP8266自帶的LED燈;

查詢DHT11溫濕度:
也可直接呼叫Siri并念出快捷指令的名稱,即可執行相應操作,如“Hey Siri,獲取傳感器溫度,”,即可獲取DHT11讀取到的溫度資訊,
也可將LED燈IO口接到繼電器上來控制其他電器開關,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286677.html
標籤:其他
下一篇:單片機中斷的相關暫存器
