1. 前言
随着科学技术的发展,人们的生活方式发生了巨大的变化。基于物联网技术的智能家居使我们的生活更加方便和快速。结合现代生活的具体需要,设计了一套基于物联网技术的智能家居电子系统设计,可以远程实时查看家庭照明强度、温湿度等信息,支持云控制家庭电气设备,实现远程控制。
2. 具体需求
通过实时监控光强、温湿度等信息,实时显示相关信息和设备状态信息ESP8266wifi联网模块可实现远程数据传输OneNET云平台,MQTT传输协议,编辑应用程序实现手机和计算机的远程控制显示,操作界面美观方便,使用方便。
硬件选项要求:
(1)ESP8266 串口WIFI,用来与OneNet远程通信。
(3)继电器,模拟控制家用电器。
(4)BH1750 检测环境光强度的光敏传感器
(5)MQ135 空气质量传感器。可检测可燃气体和烟雾浓度,实现火灾预警。
(6)OLED本地传感器当地传感器的参数,实时显示
3. 硬件选型
3.1 继电器
3.2 ESP8266 WIFI
(1)模块采用串口(LVTTL)与MCU(或其他串口设备)通信,内置TCP/IP协议栈可以实现串口和WIFI之间的转换 (2)模块支持LVTTL串口,兼容3.3V和5V单片机系统 (3)模块支持串口转移WIFI STA、串口转AP和WIFI STA WIFIAP快速构建串口的模式-WIFI数据传输方案
3.3 MQ-135空气质量传感器
MQ135传感器对氨、硫化物、苯蒸汽敏感,对烟雾等有害监测也很理想。该传感器可以检测到各种有害气体,是一种适合各种应用的低成本传感器。
3.4 DHT11温湿度传感器
DHT数字温湿度传感器是一种含有校准数字信号输出的温湿度复合传感器。采用特殊的数字模块采集技术和温湿度传感技术,确保产品具有可靠性和优良的长期稳定性、低成本、相对湿度和温度测量、响应快、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括电容式感湿元件和NTC与高性能8位单片机连接的测温元件。可用于暖通空调、除湿器、测试检测设备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗等相关湿度检测控制。
1.可检测周围环境的湿度
2.可以检测周围环境的温度
湿度测量范围:20%-95%(0度-50度)湿度测量误差:±5%4、温度测量范围:o温度测量误差-50度:±2度
4、工作电压3.3V-5V
5.输出形式的数字输出
3.5 STM32系统板
主控CPU采用STM32F103RCT6.这个芯片包括48 KB SRAM、256 KB Flash、2个基本定时器,4个通用定时器,2个高级定时器,51个通用定时器IO五串口,两串口DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片容量大,配置高,整体符合硬件选型设计。目前选择的开发板有一个1.4寸的TFT-LCD可显示当前传感器数据和一些运行状态信息的彩屏。
3.6 OLED显示屏
OLED有机发光二极管又称有机激光显示,OLED显示技术具有自发光的特点,采用非常薄的有机材料涂层和玻璃基板,当电流通过时,这些有机材料会发光OLED显示屏视角大,功耗低OLED由于同时具备自发光、不需背光源(只有当电源不亮,驱动程序和接线正确时,才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD需要背光,功耗高OLED由于发光材料不同,在不同的环境下,功耗低,更适合小系统,OLED显示效果好,模块供电可以3.3v也可以是5V、不需要修改模块电路,OLED屏幕有多个控制指令,可以控制oLED亮度、对比度、
开关升压电路等指令,操作方便,功能丰富,可显示汉字,ASCH、为了方便产品的应用,预留图案等4个M3固定孔、方便用户固在机壳上。
3.7 母对母杜邦线
3.8 BH1750光敏传感器
4. OneNet平台创建产品和设备
4.1 创建产品
(1)登录账号注册
官网: https://open.iot.10086.cn/
点击右上角的控制台。
(2)选择旧版控制台
(3)选择MQTT物联网套件
(4)创建产品
填写信息。
4.2 创建设备
(1) 添加设备
添加成功。
(2)添加数据流模板
接下来,根据传感器需要上传的数据添加相应的数据点。
添加完成。
4.3 软件模拟设备登录测试
(1)MQTT服务器地址信息
文档: https://open.iot.10086.cn/doc/v5/develop/detail/248
IP地址: 183.230.40.96 端口号: 1883
(2)生成登录密钥信息
查看MQTT登录报纸所需的参数来源和格式。
文档: https://open.iot.10086.cn/doc/v5/develop/detail/265
算法介绍文档:https://open.iot.10086.cn/doc/v5/develop/detail/241
下载token生成工具。
【1】res选项参数格式: products/{产品ID}/devices/{设备名称}
【2】et是设置token过期时间:计算1970-1-1到您想要设置的到期时间,单位为秒,填写即可。
比如: 超时时间设置为2022-4-7,那么这里填的秒是:1970-1-1-2022-4-7之间的秒单位时间。
【3】key的参数格式: 就是设备创建之后,在设备详情页的key
#include <stdio.h>
#include <time.h>
#include <time.h>
int main()
{
time_t time_sec;
time_sec=time(NULL); //当前的秒单位时间--UTC时间
printf("当前时间(秒):%ld\n",time_sec);
printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60);
return 0;
}
products/501579/devices/dev1
1680445911
NrbXMe5YHavoxRab+YscPKXcZhWmS04+KE3BHSYqJqA=
version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D
生成的数据就是MQTT服务器登录的密匙。
(3)主题订阅与发布的格式
文档地址:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html
订阅 topic 订阅效果
$sys/{
pid}/{
device-name}/dp/post/json/accepted 订阅设备数据点上报成功的消息
$sys/{
pid}/{
device-name}/dp/post/json/rejected 订阅设备数据点上报失败的消息
$sys/{
pid}/{
device-name}/dp/post/json/+ 订阅设备数据点上报结果
$sys/{
pid}/{
device-name}/cmd/request/+ 订阅设备所有命令消息
$sys/{
pid}/{
device-name}/cmd/response/+/+ 订阅设备所有命令应答结果消息
$sys/{
pid}/{
device-name}/cmd/# 订阅设备所有命令相关消息
$sys/{
pid}/{
device-name}/# 订阅设备所有相关消息
上传数据点的格式介绍:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html
topic 命名规则如下:
$sys/{
pid}/{
device-name}/dp/post/json
本例中,发布 topic 名称为:
$sys/238322/mqtts-test-device/dp/post/json
payload示例如下:
{
"id": 123,
"dp": {
"temperatrue": [{
"v": 30,
}],
"power": [{
"v": 4.5,
}]
}
}
IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: 501579
password: version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D
订阅主题: $sys/501579/dev1/#
发布主题: $sys/501579/dev1/dp/post/json
发布消息: {
"id":123,"dp":{
"BH1750":[{
"v":45}],"DHT11_H":[{
"v":88}],"DHT11_T":[{
"v":26}],"MQ135":[{
"v":66}]}}
发布消息:
{
"id":123,"dp":{
"BH1750":[{
"v":45}],"DHT11_H":[{
"v":88}],"DHT11_T":[{
"v":26}],"MQ135":[{
"v":66}],"motor":[{
"v":1}],"LED":[{
"v":1}]}}
(4)软件模拟登录测试
当前采用MQTT客户端模拟设备,登录Onetnet测试,完成数据交互,测试云端产品设备交互是否OK。
软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012
根据软件提示,填充好参数,点击连接服务器,接着订阅主题,发送主题。
然后网页登录OneNet查看设备状态,与数据显示。
查看上传的数据。
(5)云端下发命令给设备
onenet支持以同步的形式发送命令给设备,方便控制设备。
发送命令的方法和设备应答的说明文档:https://open.iot.10086.cn/doc/v5/develop/detail/267
云端下发的命令格式:
$sys/501579/dev1/cmd/request/3baf8324-e5d4-43f1-be89-118299c3b583
LED_ON
其中:
3baf8324-e5d4-43f1-be89-118299c3b583 表示当前的请求ID,设备应答的时候需要带上这个ID返回去。
LED_ON 表示云端下发的命令内容
设备收到这个命令之后,需要向云端回应。
回应的格式如下:
发布主题: $sys/501579/dev1/cmd/response/3baf8324-e5d4-43f1-be89-118299c3b583
发布的消息:111
其中:111 是返回给云端的消息内容,111是随便写的,举个例子。
登录OneNet官网,点开设备列表页面,先让设备登录服务器,点击更多操作,点击下发命令。
编辑好参数,点击发送。
这时MQTT设备端就会收到提示。
然后拼接好命令再发送应答给服务器。
网页上收到正确的响应。
4.4 创建web网页应用
(1)访问新版编辑器
地址:https://open.iot.10086.cn/develop/mqtts/product/#/app/independent?pid=501579
(2)新建项目
根据自己需求设计界面。
接下来需要绑定数据来源,可以显示设备上传的数据。
选中控件,再选择数据源。
点击管理数据源,添加新的数据源。
新增数据源。
注意:上面提示栏里的key从产品页面获取。
创建完之后,在将控件的数据源绑定起来。
然后接下来就继续创建每个仪表盘需要显示的数据源。
注意:为了让数据可以实时显示,这里获取数据点数要填1。
添加的数据源如下:
依次绑定每个仪表盘的数据源。
绑定两个开关的数据源。
每个开关可以向设备端发送命令,修改命令下发的格式。
这里的{V} 表示是一个变量,如果我设置成LED:{V} 那么就表示下发的命令就是LED:0或者是LED:1
表盘可以设置最大数值的范围。
(3)测试数据显示
整体界面已经设计完成,点击右上角的预览。
(4)发布页面
在数据可视化页面发布项目。
然后得到的链接,可以分享给其他人,直接浏览器打开就可以查看传感器数据了。
https://open.iot.10086.cn/view/main/index.html#/share2d?id=624f0a67bb4cd1003509e43b
5. STM32设备端代码
整个项目代码的下载地址: https://download.csdn.net/download/xiaolong1126626497/85588806
串口上会输出当前程序运行的状态信息,可以打开串口调试助手查看。
5.1 LCD汉字取模
LCD上需要显示汉字,使用点阵字模取模软件进行取模。
5.2 硬件连线
1. ESP8266 WIFI接线
ATK-ESP8266串口WIFI模块与STM32的串口2相连接。
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)
2. TFT 1.44 寸彩屏接线
GND 电源地
VCC 接5V或3.3v电源
SCL 接PC8(SCL)
SDA 接PC9(SDA)
RST 接PC10
DC 接PB7
CS 接PB8
BL 接PB11
3. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PA5
4. LED灯-模拟房间的照明灯
VCC--->5V
DAT--->PB12
GND--->GND
5. 智能窗帘-模拟家里的窗帘
VCC--->5V
DAT--->PB13
GND--->GND
6. MQ135空气质量检测传感器
VCC--->5V
GND--->GND
DAT--->PA1
7. BH1750环境光检测模块:
SDA-----PB5
SCL-----PB6
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)
8. 板载LED灯接线
LED1---PA8
LED2---PD2
9. 板载按键接线
K0---PA0
K1---PC5
K2---PA15
5.2 keil工程布局
5.3 main.c代码
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "motor.h"
#include "oled.h"
#include "dht11.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "mqtt.h"
#include "iic.h"
#include "bh1750.h"
/* (1)ESP8266 串口WIFI,用来与OneNet进行远程通信。 (2)DHT11 温度传感器,检测本地环境的温度湿度信息。 (3)继电器,来模拟控制家里的电器。 (4)BH1750 光敏传感器,检测环境光强度 (5)MQ135 空气质量传感器。可以检测可燃气体、烟雾浓度,实现火警预警。 (6)OLED显示屏显示本地的传感器的参数情况,实时展示 */
//物联网服务器的设备信息
#define MQTT_ClientID "dev1"
#define MQTT_UserName "501579"
#define MQTT_PassWord "version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D"
//订阅与发布的主题
#define SET_TOPIC "$sys/501579/dev1/#" //订阅
#define POST_TOPIC "$sys/501579/dev1/dp/post/json" //发布
//设置连接的路由器信息
#define CONNECT_WIFI "Xiaomi_meizi6" //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define CONNECT_PASS "12170307yu" //将要连接的路由器密码
#define CONNECT_SERVER_IP "183.230.40.96" //服务器IP地址
#define CONNECT_SERVER_PORT 1883 //服务器端口号
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp; //设置jtag模式
}
u8 motor_flag=0; //窗帘的状态 0表示关闭 1表示打开
u8 led_flag=0; //房间照明灯状态 0表示关闭 1表示打开
u16 MQ135_data=0; //MQ135烟雾传感器的值
u8 DHT11_T=0; //环境温度
u8 DHT11_H=0; //环境湿度
u8 BH1750_data=0; //环境光照强度
char request_id[100];
char mqtt_message[100];
//WIFI发送数据存储区域
char data_buff[300];
int main()
{
u8 esp8266_state=0;
u8 key;
u8 i;
u32 time_cnt=0;
u32 timer_hour_cnt=0; //记录定时的时间
JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
LED_Init();
KEY_Init();
USART1_Init(115200);
Moto_Init(); //风扇、加热棒初始化
USART2_Init(115200);//串口-WIFI
TIMER2_Init(72,20000); //超时时间20ms
DHT11_Init(); //初始化DHT11
Lcd_Init(); //LCD初始化
Lcd_Clear(0); //清屏为黑色
LCD_LED_SET;//通过IO控制背光亮
AdcInit(); //ADC初始化--检测MQ2烟雾传感器的数据
IIC_Init();
printf("正在初始化WIFI请稍等.\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");
}
}
//环境温度
LCD_ShowChineseFont(0,0,16,HZ_FONT_16[0],RED,0);
LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[1],RED,0);
LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[2],RED,0);
LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[3],RED,0);
//环境湿度
LCD_ShowChineseFont(0,16*1,16,HZ_FONT_16[4],RED,0);
LCD_ShowChineseFont(16*1,16*1,16,HZ_FONT_16[5],RED,0);
LCD_ShowChineseFont(16*2,16*1,16,HZ_FONT_16[6],RED,0);
LCD_ShowChineseFont(16*3,16*1,16,HZ_FONT_16[7],RED,0);
//光照强度
LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[8],RED,0);
LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[9],RED,0);
LCD_ShowChineseFont(16