基于stm32设计的智能家居控制系统(华为云iot 语音控制 环境检测)【玩转华为云】-4008云顶国际网站
1. 前言
如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展,能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。在安全防护上,智能家居安防系统则够在原来的基础上提供立体化防护,帮助用户时刻守护住宅安全,更符合人们的安全需求。节能减排方面的也有积极作用。比如说,智能家居照明系统,它充分利用了自然光的照明作用,自动调节灯具的亮度,在保证室内明亮度的同时,将能耗降到最低,而对于洗手间、储藏室等地方,更是做到了人来灯亮、人走灯灭,一方面方便了用户的日常生活,另一方面也能防止用户忘记及时关灯而造成浪费。
2. 设计要求总结
设计题目:基于物联网的语音和环境检测的智能家居控制系统设计
第一种:控制方式需经结合语音命令控制, 控制开关门、灯、电视、开关空调、开关电扇、开关窗帘等。
第二种:控制方式是基于环境检测自动执行控制,根据环境检测结果控制相应的执行机构协作,比如: 当光照低于一定程度(比如低于5olux)且有人在家里自动开灯,没人在家时自动关灯;如温度高于阈值并且有人在家时打开空调,没人在家时自动关闭等;如光照强度低于一定程度会自动关闭窗帘。电脑和手机app两端云平台可以展示温湿度,光照等信息,还有各家居的状态,可以在云平台控制家居的开关,可以在云平台进行两种控制方式的切换。
技术选项总结:
(1)物联网平台采用华为云iot:华为云iot是华为旗下的物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网4008云顶国际网站的解决方案。
(2)主控芯片采用:stm32f103c8t6
(3)语音控制芯片采用:ld3320 支持普通话识别。
(4)开关空调、开关风扇 采用继电器模拟:两个1路5v继电器控制
(5)开关窗帘采用步进电机模拟: 28byj4步进电机模拟
(6)室内照明灯(卧室、客厅):2盏 3w大功率led灯模拟
(7)环境光检测检测:bh1750数字传感器
(8)联网的wifi :选择esp8266
(9)oled屏幕:模拟电视显示
(11)温湿度检测:dht11模块
其中:
(1)stm32主控芯片、语音控制芯片ld3320、室内照明大功率led灯、环境光检测bh1750、esp8266-wifi 通过排母插在pcb板子上。
(2)步进电机ul2003驱动板、继电器 使用排针外接。
上位机运行效果:
3. 硬件选型
3.1 stm32f103c8t6
stm32f103c8t6是一款基于arm cortex-m 内核stm32系列的32位的微控制器,程序存储器容量是64kb,需要电压2v~3.6v,工作温度为-40°c ~ 85°c。
3.2 语音识别模块: ld3320
3.3 esp8266 -串口wifi
3.4 led灯-rgb灯
3.5 3w大功率led灯
3.6 oled模块
3.7 步进电机模块
3.8 继电器模块
3.9 杜邦线(母对母)
3.10 红外寻迹/循迹模块
3.11 温湿度-dht11
3.12 bh1750光敏传感器
4. 华为云创建产品与设备
4.1 创建产品、配置产品模型
华为云4008云顶国际集团官网:
在产品选项框里找到华为云的iot产品。选择设备接入 iotda
设备接入 iotda:
点击产品页面,先创建产品。产品一个项目的模型,产品下面可以创建多个具体的设备。
根据自己的实际产品信息填充。
创建成功。
查看产品的详情。
在详情页,创建产品的模型。这个产品的模型就是传感器数据的属性,根据自己上传的传感器数据实际创建。
创建自定义模型。
服务id smarthome 服务类型 smarthome 服务描述 智能家居
添加属性。
接来来根据自己设备的实际情况添加属性即可。
所有的属性创建完毕,属性的名字可以使用中文。但是要注意,设备上传时,中文数据的编码要正确,否则会乱码。
4.2 创建设备
接在在左边选项页面选择设备,创建一个设备。
设备可以调用api在程序里自动创建也可以的。
地址:
单设备注册。
注册之后,保存设备信息,接下来生成mqtt参数需要。
{
"device_id": "62aead8b538e623c4287ef43_smart_home_dev_1",
"secret": "12345678"
}
5. mqtt协议登录
5.1 mqtt服务器地址信息
华为云物联网平台的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
华为云物联网平台的ip地址是: 121.36.42.100
端口号是 1883
5.1 mqtt订阅主题,发布主题
帮助文档:
格式: $oc/devices/{device_id}/sys/messages/down
//订阅主题: 平台下发消息给设备
$oc/devices/62aead8b538e623c4287ef43_smart_home_dev_1/sys/messages/down
格式: $oc/devices/{device_id}/sys/properties/report
//设备上报数据
$oc/devices/62aead8b538e623c4287ef43_smart_home_dev_1/sys/properties/report
上属性的数据格式:
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
{"services": [{"service_id": "smarthome","properties":{"空调":1}}]}
5.2 mqtt参数生成
设备创建完成接来下生成mqtt登录账号、密匙,方便设备登录云端平台。
4008云顶国际集团官网工具地址:
clientid 62aead8b538e623c4287ef43_smart_home_dev_1_0_0_2022061905
username 62aead8b538e623c4287ef43_smart_home_dev_1
password 1052c27bd7ccce57b316005a677f50291cf4a50fc90e0bb1c33dee6beda1ae53
5.3 mqtt客户端模拟登录测试
mqtt客户端下载地址:
在mqtt工具里填上mqtt的登录参数,主题发布、订阅信息进行登录测试。
然后打开设备页面,可以看到设备已经在线了。
并且在设备页面详情里可以看到刚才上传的数据。
主题发布时,一次可以上传多个状态。
例如:
{"services": [{"service_id": "smarthome","properties":{"空调":1,"风扇":1,"电视":0,"卧室灯":1}}]}
6. ld3320语音识别模块编程
下载程序示例。 将开发板的串口通过usb转ttl模块连接电脑即可。
波特率是9600,语音识别时,想要说小杰
,唤醒语音识别,然后再说出指令,唤醒语音识别就,模块上有一个红色的led灯会亮。
当前支持的指令如下:
小杰,开卧室灯
小杰,关卧室灯
小杰,开客厅灯
小杰,关客厅灯
小杰,打开电视
小杰,关闭电视
小杰,打开风扇
小杰,关闭风扇
小杰,打开窗帘
小杰,关闭窗帘
小杰,打开空调
小杰,关闭空调
7. stm32设备端开发
7.1 程序下载
7.2 原理图
7.3 硬件接线
本设计的硬件接线说明:
(1)oled显示屏接线:
d0----(sck)------------------->>pb14
d1----(mosi)------------------>>pb13
res—(复位脚低电平有效)-------->>pb12
dc--(数据和命令控制管脚)------>>pb1
cs--(片选引脚)---------------->>pa7
gnd--------------------------->>gnd
vcc--------------------------->>3.3v或者5v
(2)atk-esp8266 wifi接线
pa2(tx)--rxd 模块接收脚
pa3(rx)--txd 模块发送脚
gnd---gnd 地
vcc---vcc 电源(3.3v~5.0v)
(3)ld3320语音识别模块接线说明
gnd----gnd
vcc---3.3v
pb11----ld3320语音模块_tx
pb10----ld3320语音模块_rx
(4)开关空调:1路5v继电器控制
pa6------led
(5)开关风扇:1路5v继电器控制
pa4------led
(6)开关窗帘采用步进电机模拟: 28byj4步进电机模拟
uln2003接线:
in-d: pb5 d
in-c: pb4 c
in-b: pb3 b
in-a: pb2 a
: 5v
- : gnd
(7)卧室照明灯:一盏3w大功率led灯模拟
pb8------led
(8)客厅照明灯:一盏3w大功率led灯模拟
pb9------led
(9)环境光检测检测:bh1750数字传感器
sda-----pb7
scl-----pb6
gnd---gnd 地
vcc---vcc 电源(3.3v~5.0v)
(10)温湿度传感器: dht11
vcc--vcc
gnd---gnd
dat---pa5
(11)红外寻迹/循迹模块
vcc--3.3v
gnd---gnd
dat---pa8
(--)板载led灯:低电平亮
led1--pc13
beep2--pc14
(--)板载按键:
key1--pa0 按下为高电平
7.4 核心代码
连接华为云服务器采用esp8266wifi,加上mqtt协议实现数据通信。标准的esp8266本身不带mqtt协议栈,也就是说esp8266默认是没有mqtt协议相关的指令,不能直接通过指令连接mqtt服务器通信,但是也可以自己烧写第三方的sdk,用于支持mqtt指令。 我这里的代码是自己实现的mqtt协议,包括我的其他物联网相关的文章里,只要用到esp8266的都是自己写的mqtt协议,也就是在代码里实现了mqtt协议栈,使用esp8266普通的tcp相关的指令就可以完成数据传输,不依赖于esp8266的sdk版本,任何esp8266都可以直接使用,为的就是方便移植,通用–通用-通用。
esp82 stm32实现的mqtt协议栈工程在这里,如果需要带完整mqtt协议工程的可以去这里下载。
这份工程里实现了esp8266与华为云iot平台实现数据交互,数据通信,也就是登录、主题发布、订阅,心跳包等操作。
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <string.h>
#include <stdlib.h>
#include "timer.h"
#include "oled.h"
#include "fontdata.h"
#include "esp8266.h"
#include "app.h"
#include "mqtt.h"
#include "iic.h"
#include "bh1750.h"
#include "dht11.h"
#include "motor.h"
/*
本设计的硬件接线说明:
(1)oled显示屏接线:
d0----(sck)------------------->>pb14
d1----(mosi)------------------>>pb13
res—(复位脚低电平有效)-------->>pb12
dc--(数据和命令控制管脚)------>>pb1
cs--(片选引脚)---------------->>pa7
gnd--------------------------->>gnd
vcc--------------------------->>3.3v或者5v
(2)atk-esp8266 wifi接线
pa2(tx)--rxd 模块接收脚
pa3(rx)--txd 模块发送脚
gnd---gnd 地
vcc---vcc 电源(3.3v~5.0v)
(3)ld3320语音识别模块接线说明
gnd----gnd
vcc---3.3v
pb11----ld3320语音模块_tx
pb10----ld3320语音模块_rx
(4)开关空调:1路5v继电器控制
pa6------led
(5)开关风扇:1路5v继电器控制
pa4------led
(6)开关窗帘采用步进电机模拟: 28byj4步进电机模拟
uln2003接线:
in-d: pb5 d
in-c: pb4 c
in-b: pb3 b
in-a: pb2 a
: 5v
- : gnd
(7)卧室照明灯:一盏3w大功率led灯模拟
pb8------led
(8)客厅照明灯:一盏3w大功率led灯模拟
pb9------led
(9)环境光检测检测:bh1750数字传感器
sda-----pb7
scl-----pb6
gnd---gnd 地
vcc---vcc 电源(3.3v~5.0v)
(10)温湿度传感器: dht11
vcc--vcc
gnd---gnd
dat---pa5
(11)红外寻迹/循迹模块
vcc--3.3v
gnd---gnd
dat---pa8
(--)板载led灯:低电平亮
led1--pc13
beep2--pc14
(--)板载按键:
key1--pa0 按下为高电平
*/
//物联网服务器的设备信息
#define mqtt_clientid "dev1"
#define mqtt_username "507546"
#define mqtt_password "version=2018-10-31&res=products/507546/devices/dev1&et=1680445911&method=md5&sign=qgas0ncoxqsnifzgl/z81q=="
//订阅与发布的主题
#define set_topic "$sys/507546/dev1/#" //订阅
#define post_topic "$sys/507546/dev1/dp/post/json" //发布
//设置连接的路由器信息
#define connect_wifi "ds小龙哥" //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define connect_pass "12345678" //将要连接的路由器密码
#define connect_server_ip "183.230.40.96" //服务器ip地址
#define connect_server_port 1883 //服务器端口号
char mqtt_message[100];
//wifi发送数据存储区域
char data_buff[500];
u8 esp8266_state=0;
double longitude=120.196517; //经度
double latitude=30.194493; //纬度
float bh1750=0;
u8 dht11_temp;
u8 dht11_humidity;
u8 sw1=0;
u8 sw2=0;
u8 sw3=0;
u8 sw4=0;
u8 sw5=0;
u8 sw7=0;
/*
主函数: 程序执行的入口
*/
int main(void)
{
u8 dian_shi=0; //1表示电视开 0表示电视关
u8 mode=0; //0 表示手动模式 1表示自动模式
u32 i=0;
u8 key_val;
u32 timecnt=0;
u32 wifi_timecnt=0;
jtag_set();
usart1_init(115200); //串口1的初始化
usart2_init(115200); //串口-wifi
timer2_init(72,20000); //超时时间20ms
usart3_init(9600); //串口-语音模块
timer3_init(36,20000); //超时时间20ms
//板载按键初始化
key_init();
//板载led灯初始化
led_init();
//外接led初始化
led2_init();
//bh1750的iic接口
iic_init();
//初始化dht11
dht11_init();
//步进电机初始化
moto_init();
//初始化
app_init();
printf("正在初始化oled...\r\n");
oled_init(0xc8,0xa1); //oled显示屏初始化--正常显示
oled_clear(0x00);//清屏
printf("正在初始化esp8266..\r\n");
for(i=0;i<5;i)
{
if(esp8266_init()==0)
{
esp8266_state=1;
break;
}
else
{
esp8266_state=0;
printf("esp8266硬件检测错误.\n");
}
}
if(esp8266_state)
{
printf("准备连接服务器....\r\n");
//非加密端口
printf("wifi:%d\n",esp8266_sta_tcp_client_mode(connect_wifi,connect_pass,connect_server_ip,connect_server_port,1));
//2. mqtt协议初始化
mqtt_init();
//3. 连接服务器
for(i=0;i<5;i)
{
if(mqtt_connect(mqtt_clientid,mqtt_username,mqtt_password)==0)
{
esp8266_state=1;
break;
}
esp8266_state=0;
printf("服务器连接失败,正在重试...\n");
delay_ms(500);
}
printf("服务器连接成功.\n");
//3. 订阅主题
if(mqtt_subscribetopic(set_topic,0,1))
{
printf("主题订阅失败.\n");
}
else
{
printf("主题订阅成功.\n");
}
}
........
........
........
........
8. qt上位机软件开发
8.1 应用层下发的指令
为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提供了应用侧开发的api接口、sdk接口,为了方便通用一点,我这里采用了api接口完成数据交互,上位机软件采用qt开发。
帮助文档地址:
8.2 查询设备属性接口
设备属性就是设备上传的传感器状态数据信息,应用侧提供了api接口,可以主动向设备端下发请求指令;设备端收到指令之后需要按照约定的数据格式上报数据;所以,要实现应用层与设备端的数据交互,需要应用层与设备端配合才能完成。
应用层下发的指令:
帮助文档地址: l
接口的在线调试地址:
如果请求参数和返回值不清楚,写代码前,先使用在线调试接口体验一下,验证数据交互是否ok。
请求参数里比较总要的两个必填参数,是设备id和服务id,这两个参数在第3章节就介绍过如何获取了,在产品页面创建自定义属性时可以看到服务id。
8.2 开发环境介绍
上位机软件采用qt框架设计,qt是一个跨平台的c 图形用户界面应用程序框架。qt是一个1991年由qt company开发的跨平台c 图形用户界面应用程序开发框架。它既可以开发gui程序,也可用于开发非gui程序,比如控制台工具和服务器。简单来说,qt可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。
qt4008云顶国际集团官网:
8.3 主要的代码
下面代码里介绍了更新token、获取token、查询设备属性,上传设备属性等主要请求代码。
/*
功能: 获取token
*/
void widget::gettoken()
{
//表示获取token
function_select=3;
qstring requesturl;
qnetworkrequest request;
//设置请求地址
qurl url;
//获取token请求地址
requesturl = qstring("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(server_id);
//自己创建的tcp服务器,测试用
//requesturl="http://10.0.0.6:8080";
//设置数据提交格式
request.setheader(qnetworkrequest::contenttypeheader, qvariant("application/json;charset=utf-8"));
//构造请求
url.seturl(requesturl);
request.seturl(url);
qstring text =qstring("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":"
"{\"user\":{\"domain\": {"
"\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}},"
"\"scope\":{\"project\":{\"name\":\"%4\"}}}}")
.arg(main_user)
.arg(iam_user)
.arg(iam_password)
.arg(server_id);
//发送请求
manager->post(request, text.toutf8());
}
//更新token
void widget::on_pushbutton_update_token_clicked()
{
gettoken();
}
//查询设备属性
void widget::get_device_properties()
{
//表示获取token
function_select=0;
qstring requesturl;
qnetworkrequest request;
//设置请求地址
qurl url;
//获取token请求地址
requesturl = qstring("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id=%4")
.arg(server_id)
.arg(project_id)
.arg(device_id)
.arg(service_id);
//自己创建的tcp服务器,测试用
//requesturl="http://10.0.0.6:8080";
//设置数据提交格式
request.setheader(qnetworkrequest::contenttypeheader, qvariant("application/json"));
//设置token
request.setrawheader("x-auth-token",token);
//构造请求
url.seturl(requesturl);
request.seturl(url);
//发送请求
manager->get(request);
}
//更新设备属性
void widget::on_pushbutton_update_device_clicked()
{
get_device_properties();
}
- 点赞
- 收藏
- 关注作者
评论(0)