热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:物联网基于OneNET和Siri快捷指令实现控制ESP826601S点亮LED灯和查询DHT11温湿度传感器数据

篇首语:本文由编程笔记#小编为大家整理,主要介绍了物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据相关的知识,希望对你有一定的参

篇首语:本文由编程笔记#小编为大家整理,主要介绍了物联网基于OneNET和Siri快捷指令实现控制ESP8266-01S点亮LED灯和查询DHT11温湿度传感器数据相关的知识,希望对你有一定的参考价值。






摘要

上次利用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
#include
#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
#include
#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 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 &#61; deserializeJson(doc, Recv_Buf);
if (error) {
Serial.print(F("反序列化JSON失败&#xff01;"));
Serial.println(error.c_str());
return;
}
//获取键值
LED_Light &#61; doc["LED_Light"];
SleepMode &#61; doc["SleepMode"];
}
//执行服务器下发的命令
void Cmd_Opera()
{
if (LED_Light &#61;&#61; 0)digitalWrite(LED_BUILTIN, HIGH);
else digitalWrite(LED_BUILTIN, LOW);
if (SleepMode !&#61; 0) {
Serial.println("进入深度睡眠模式");
ESP.deepSleep(0);
}
}
//发送数据生成JSON格式
void Mesg_JsonPro()
{
StaticJsonDocument<200> doc;
doc["Humidity"] &#61; Humidity;
doc["Temperature"] &#61; Temperature;
doc["LED_Light"] &#61; LED_Light;
serializeJson(doc, Json_Buf); //构造序列化json,紧凑型
Serial.println(Json_Buf); //打印序列化json
}
//发送数据至服务器
void ESPsendData() {
ReconnectJudge();//断线检测与重连函数
Mesg_JsonPro(); //构造JSON格式数据
sd_json_len &#61; strlen(Json_Buf);
Mesg_Buf[0] &#61; char(0x03); //数据第一位是0X03
Mesg_Buf[1] &#61; char(sd_json_len >> 8); //数据第二位是要发送的数据长度的高八位
Mesg_Buf[2] &#61; char(sd_json_len & 0xff); //数据第三位是要发送数据的长度的低八位
memcpy(Mesg_Buf &#43; 3, Json_Buf, sd_json_len); //从Mesg_Buf的第四位开始,放入要传的数据Json_Buf
Mesg_Buf[3 &#43; sd_json_len] &#61; 0; //添加一个0作为最后一位
client.publish("$dp", (uint8_t *)Mesg_Buf, 3 &#43; sd_json_len); //发送
}
//Wi-Fi连接函数
void wifiInit(const char *ssid, const char *passphrase) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
while (WiFi.status() !&#61; WL_CONNECTED) {
Serial.println("准备连接Wi-Fi");
delay(3000);
}
Serial.println("Wi-Fi连接成功");
}
//断线检测与重连函数
void ReconnectJudge() {
if (WiFi.status() !&#61; 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快捷指令来控制设备&#xff1a;


基于iOS快捷指令和Siri控制连接OneNET物联网平台的STM32的智能安防家居系统

在这里简要介绍一下关键操作&#xff1a;

需要用到HTTP通信协议的POST和GET方法&#xff0c;恰巧快捷指令就能直接发起HTTP请求&#xff0c;所以很简单&#xff1a;



  1. 请求方式&#xff1a;POST URL:http://api.heclouds.com/cmds

  2. URL参数&#xff1a;device_id、qos、timeout

  3. HTTP头部&#xff1a;api-key

  4. 请求体&#xff1a;用户自定义内容&#xff0c;json、字符串&#xff0c;数字


例如&#xff1a;




POST http://api.heclouds.com/cmds?device_id&#61;123456789 HTTP/1.1 
api-key: l2aH**BRtAo&#61;dk&#61;&#61; 
Host: api.heclouds.com 
Content-Length: 15 
 
{“LED_Light”:1}


返回示例&#xff1a;(收到这样的代码代表发送成功)

{ "errno": 0, "error": "succ", "data": { "cmd_uuid": "81572aae-fc34-5deb-8f06-ab45d73cb12b" } }

否则发送失败&#xff1a;&#xff08;errno非零的时候&#xff09;

 

{ "errno": 10, "error": "device not online: 8029377" }

 


5、命令下发


点亮和关闭一个LED灯&#xff1a;

在快捷指令里点击“打开那个蓝色指示灯”&#xff0c;即可打开ESP8266自带的LED灯&#xff1b;


查询DHT11温湿度&#xff1a;

也可直接呼叫Siri并念出快捷指令的名称&#xff0c;即可执行相应操作&#xff0c;如“Hey Siri&#xff0c;获取传感器温度。”&#xff0c;即可获取DHT11读取到的温度信息。

也可将LED灯IO口接到继电器上来控制其他电器开关。

 

 




推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
香烟迷住双眼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有