基于STM32与OneNet平台的全屋智能系统设计
前言:本文保姆式教学如何搭建基于STM32于onenet平台的全屋智能系统设计。首先介绍一下系统的框架:主控使用的是STM43F407,引入了FreeRTOS操作系统进行任务管理,以及LVGL的图像界面设计(在LCD上进行显示并且操作),WIFI模块使用的是ESP8266用串口连接跟STM32进行通信,WIFI模块与ONENET平台用的是MQTT协议进行通信;从控设备用的是ESP32DEVKIT1控制灯,风扇、以及温湿度传感器(DHT11),ESP32模块使用的是Arduino IDE进行编程;手机端是用HBuilder X进行VUE编写成一个UNIAPP。
框架图:

手机端:
一、设置ONENET平台
1、OneNet平台的登录和注册
① 登录 OneNET物联网开放平台 官方网址
官方网址:open.iot.10086.cn 没账号就注册


② 登陆之后点击左上角进入官网主界面
③ 点击右上角官网主界面的开发者中心

④ 开发者中心界面

2、在开发者中心创建产品
PS:根据你的需求选择不同的产品智能化方式来开发产品,这决定了你的产品和OneNET平台双向通信时的交互方式。
第一步:在开发者界面点击产品开发,然点击创建产品

第二步:点击创建产品之后的第一步
选择产品品类(提供设备开发、设备调试、数据解析等功能,快速实现产品接入物联网平台,多适用于行业应用场景。)
我们以智慧生活---》智能安防--》中的温湿度传感器为主(这里其实就是选下位机的传感功能)

第三步:点2击创建产品之后的第二步:选择设备接入产品里面
设备接入:提供设备开发、设备调试、数据解析等功能,快速实现产品接入物联网平台,多适用于行业应用场景。 产品智能化:提供设备面板开发、场景联动、APP控制等功能,快速完成产品智能化改造,多适用于智慧生活场景。 深入使用mqtt,我们肯定选择设备接入

产品创建完成:

3、物理模型添加
1)、创建物模型
点击创建的产品右边的设备管理:

自定义创建温湿度设备:
创建物模型设备完成之后,在设备管理中是可以看到之前添加的物模型设备

2)、查看并且保存产品ID和设备秘钥,以及设备名称
点击设备管理中的设备详情:

设备详情界面:

二、ESP8266的使用
1)简要说明
这里的ESP8266WIFI模块要和STM32进行连接串口连接,然后通过串口进行通信(在MDK Kile 5中的标准库有一个接口可以直接调用进行串口通信);
但是在这里有一个细节,ESP8266在使用MQTT的时候,大多数的ESP8266他是没有跟MQTT相关的固件的,所以得你自己去找固件烧入,而且ESP8266他下载的接线必须要拉低GPIO0才能进入下载模式(如果需要的评论加点赞,我私发给你,因为篇幅太长了);
你在测试ESP8266与ONENET平台连接的时候,可以用串口工具直接发送,等你成功能连上再去写代码;
2)指令
下面是与ONENET连接的指令(如果有遇到问题可以后台私信我)
下面需要你的:设备名称
产品ID
以及生成的密钥(生成密钥的方法有很多可以搜索到的,如果实在解决不了可以后台私信我)
AT
AT+RST //重置
AT+CWMODE=1 //设置 ESP8266 的 WiFi 模式为 “Station 模式”
AT+CWDHCP=1,1 //开启 Station 模式下的 DHCP 功能
AT+CWJAP="CSX","12345678" //连接wifi
AT+MQTTUSERCFG=0,1,"DB01","NLJ6CZqXq0","你生成的密钥=lrz6aXiULllaSYDGw%3D%3D",0,0,"" //MQTT 连接配置(对接中移物联网平台)
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1 //建立与 MQTT 服务器的连接。
AT+MQTTSUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/post/reply",0 //订阅 “属性上报回复” 主题
AT+MQTTSUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/set",1 //订阅 “属性设置” 主题
AT+MQTTPUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/post","{\"id\":\"2313\"\,\"version\":\"1.0\"\,\"params\":{\"Temp\":{\"value\":22}}}",0,0 //MQTT 消息发布(上传数据)
MQTT跟ESP8266的通信连接,建议去看这个前辈的:物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——AT指令连接OneNET MQTT设备(整合版)_esp prog v1.0-CSDN博客
三、ESP32DEVKIT的设置
ESP32DEVKIT他集成了WIFI和蓝牙模块,功能还是比较强大的,而且他的成本也很低。淘宝都能搜索的到,但是他的资料却很少,部分商家连原理图什么都没有,如果你想用这款进行开放你可以私信我。
ESP32DEVKIT要使用到Arduino IDE进行编程,他用MQTT连接ONENET其实代码会更简洁了,但是很多人的熟悉程度不够,可能会一直卡在这。
1)ESP32DEVKIT联网
Arduino中有专门的库函数,所以使用起来还是非常方便的:
void init_wifi(void)
{
// 初始化WiFi为STA模式
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("ESP32 WiFi初始化");
Serial.println("=================");
bool connected = false;
while(!connected) {
// 扫描WiFi网络
Serial.println("扫描WiFi网络中...");
int n = WiFi.scanNetworks();
if (n == 0) {
Serial.println("未找到任何WiFi网络");
delay(2000); // 等待2秒后重新扫描
continue;
}
bool found_target = false;
int target_rssi = 0;
for (int i = 0; i < n; i++) {
String ssid = WiFi.SSID(i);
// 检查是否找到目标SSID
if (ssid.equals(WIFI_SSID)) {
found_target = true;
target_rssi = WiFi.RSSI(i);
break;
}
}
// 如果找到目标SSID,尝试连接
if (found_target) {
Serial.print("找到目标网络: ");
Serial.print(WIFI_SSID);
Serial.print(", 信号强度: ");
Serial.print(target_rssi);
Serial.println(" dBm");
Serial.print("尝试连接到 ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASS);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
connected = true; // 设置连接标志为true,退出循环
} else {
Serial.println("连接失败,5秒后重新尝试...");
delay(5000); // 等待5秒后重新尝试
}
} else {
Serial.println("未找到目标网络,5秒后重新扫描...");
delay(5000); // 等待5秒后重新扫描
}
// 清理扫描结果
WiFi.scanDelete();
// 在My_wifi.cpp的init_wifi()中,WiFi连接成功后添加
if (WiFi.status() == WL_CONNECTED) {
Serial.println("测试互联网连接...");
HTTPClient http;
if (http.begin("http://www.baidu.com")) { // 用HTTP测试(避免HTTPS证书问题)
int code = http.GET();
if (code == HTTP_CODE_OK) {
Serial.println("互联网连接正常");
} else {
Serial.printf("互联网连接失败,状态码:%d\n", code);
}
http.end();
}
}
}
}
2)ESP32DEVKI连接ONENET
void OneNetClient::init() {
// 初始化MQTT客户端
client.setClient(espClient);
client.setServer(mqtt_server, mqtt_port);
client.setCallback([this](char* topic, byte* payload, unsigned int length) {
this->callback(topic, payload, length);
});
// 尝试初始连接
reconnect();
}
void OneNetClient::setFanCallback(FanSetCallback callback) {
this->fanCallback = callback;
}
void OneNetClient::reconnect() {
// 如果未连接,则尝试连接
if (!client.connected()) {
Serial.print("尝试MQTT连接...");
// 尝试连接
if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
Serial.println("已连接");
// 订阅属性设置主题
if (client.subscribe(sub_topic)) {
Serial.println("订阅属性设置主题成功");
} else {
Serial.println("订阅属性设置主题失败");
}
} else {
Serial.print("失败, rc=");
Serial.print(client.state());
Serial.println(" 稍后将重试");
}
}
}
四、手机APP的创建
这里我是用HBuilder X编了一个简单的控制平台,下面是主要的关键代码:
<view class="page-container">
<view class="app-header">
<text class="app-title">智能设备控制中心</text>
</view>
<view class="content">
<!-- 数据显示卡片 -->
<view class="data-card">
<view class="card-header">
<text class="card-title">环境监测</text>
</view>
<view class="data-grid">
<!-- 温度显示 -->
<view class="data-item">
<view class="data-icon temperature-icon">
<text class="icon">🌡️</text>
</view>
<view class="data-info">
<text class="data-label">温度</text>
<text class="data-value">{{ temp || '加载中...' }} °C</text>
</view>
</view>
<!-- 湿度显示 -->
<view class="data-item">
<view class="data-icon humidity-icon">
<text class="icon">💧</text>
</view>
<view class="data-info">
<text class="data-label">湿度</text>
<text class="data-value">{{ humidity || '加载中...' }} %</text>
</view>
</view>
</view>
</view>
<!-- 设备控制卡片 -->
<view class="control-card">
<view class="card-header">
<text class="card-title">设备控制</text>
</view>
<!-- 灯光开关 -->
<view class="control-item" @click="handleLedClick">
<view class="control-icon light-icon">
<text class="icon">💡</text>
</view>
<view class="control-info">
<text class="control-name">灯光开关</text>
<text class="control-status">{{ led ? '开启' : '关闭' }}</text>
</view>
<switch
:checked="led"
@change="handleLedChange"
class="switch-item"
active-color="#409eff"
/>
</view>
<!-- 风扇开关 -->
<view class="control-item" @click="handleFanClick">
<view class="control-icon fan-icon">
<text class="icon">🌀</text>
</view>
<view class="control-info">
<text class="control-name">风扇开关</text>
<text class="control-status">{{ fan ? '开启' : '关闭' }}</text>
</view>
<switch
:checked="fan"
@change="handleFanChange"
class="switch-item"
active-color="#409eff"
/>
</view>
</view>
<!-- 状态提示 -->
<view class="status-message" v-if="statusMessage" :class="statusType">
<text class="message-text">{{ statusMessage }}</text>
</view>
然后需要下载到手机端,剩下的我会在下篇文章教剩下的步骤;
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)