整体描述
项目基于STM32F103RC开发板,软件使用keil5实现系统程序开发,实现一套具有一定交互水平的云端智能家居环境控制系统,通过传感器采集温湿度、光照强度、环境分贝数据上传OneNET云端,实现用户友好的平台GUI并设计用户控制及自动控制功能。实现扩展包括分贝检测、web端控制下发,可视化界面等功能。
视频介绍链接:https://www.bilibili.com/video/BV1LL4y1P7wR
代码链接:https://download.csdn.net/download/S_igh_/85764326
设计内容
a) 测量温湿度和光照强度等家庭环境数据,并显示在OLED显示屏上;
b) 可实时监测相应温湿度、光照强度数据;
c) 通过wifi模块联网,将数据上传云端,实现计算机端显示;
d) 通过网络回传控制参数。
e) 实现光照、湿度自动控制
f) 实现光照、湿度WEB端控制
设计框图
硬件采购
- STM32F103RCT6魔女开发板
- 正点原子ESP8266模块
- OLED串口显示屏
- BH1750FVI光强模块
- DHT11温湿度模块
- 雾化器模块
- LM386声音采集模块
主函数解释
//单片机头文件
#include "stm32f10x.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "bsp_BH1750.h"
#include "dht11.h"
#include "bsp_led.h"
#include "oled.h"
#include "i2c.h"
#include "adc.h"
#include "ws2812.h"
//C库
#include <string.h>
#include <math.h>
float light = 0.0; // parameter saving intensity of light
float dB = 0.0; // parameter saving db of voice
int t_h_sta = 0; // dht11 work state
u8 humidityH;
u8 humidityL;
u8 temperatureH;
u8 temperatureL;
char OLEDBUF[20];
char PUBBUF[256];
/*
************************************************************
* 函数名称: Hardware_Init
*
* 函数功能: 硬件初始化
*
* 入口参数: 无
*
* 返回参数: 无
*
* 说明: 初始化单片机功能以及外接设备
************************************************************
*/
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Delay_Init(); //systick初始化
Usart1_Init(14400); //串口1,打印信息用
Usart2_Init(172800); //串口2,驱动ESP8266用
UsartPrintf(USART_DEBUG, " Hardware init Start\r\n");
Led_Init(); // LED 初始化
ADCx_Init(); // ADC初始化
BH1750_Init(); // BH1750模块初始化
OLED_Init(); // OLED
OLED_Clear();
UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
}
/*
************************************************************
* 函数名称: main
*
* 函数功能:
*
* 入口参数: 无
*
* 返回参数: 0
*
* 说明:
************************************************************
*/
u16 voice;
int main(void)
{
const char *devSubTopic[] = {"Temp","Humi","Light"};
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
Hardware_Init(); //初始化外围硬件
OLED_Clear();
sprintf(OLEDBUF,"WELCOME TO SIGH");
OLED_ShowString(0,0,(u8*)OLEDBUF);
sprintf(OLEDBUF,"ENVIRONMENT");
OLED_ShowString(16,2,(u8*)OLEDBUF);
sprintf(OLEDBUF,"PARAMATERS");
OLED_ShowString(20,4,(u8*)OLEDBUF);
sprintf(OLEDBUF,"CONTROL SYSTEM");
OLED_ShowString(8,6,(u8*)OLEDBUF);
DelayXms(5000);
ESP8266_Init(); //初始化ESP8266
DHT11_Init();
Ws2812_Init();
t_h_sta=DHT11_GetData(&humidityH,&temperatureH); //judge work state of dht11
UsartPrintf(USART_DEBUG,"dht11 state:%d\r\n",t_h_sta); //show dht11 work state
while(OneNet_DevLink()) //接入OneNET
DelayXms(500);
OneNet_Subscribe(devSubTopic, 3);
while(1)
{
if(timeCount % 20 == 0) // refresh delay 1200ms
{
OLED_Clear();
LED_RED_TOGGLE; // red led alternatively shining
t_h_sta=DHT11_GetData(&humidityH,&temperatureH); //judge work state of dht11
dB = sqrt((float)(abs(voice-2048))/2048)*80+10; // read data from LM386 ADC
light = BH1750_GetData(); // read data from BH1750
UsartPrintf(USART_DEBUG,"BH1750 intensity:%4.1f\r\n", light); // show light intensity
UsartPrintf(USART_DEBUG,"LM386 intensity:%4.1f\r\n", dB); // show light intensity
UsartPrintf(USART_DEBUG,"dht11 state:%d\r\n",t_h_sta); //show dht11 work state
UsartPrintf(USART_DEBUG,"humidity %d.%d%\r\n",humidityH,humidityL); // show humidity
UsartPrintf(USART_DEBUG,"temperature %d.%d\r\n",temperatureH,temperatureL); // show temperature
//lighting oled up
OLED_ShowString(8,0,(u8*)"ENV PARAMETERS");
sprintf(OLEDBUF,"voice:%4.1fdB",dB);
OLED_ShowString(16,2,(u8*)OLEDBUF);
sprintf(OLEDBUF,"ints:%4.1f lx",light);
OLED_ShowString(16,4,(u8*)OLEDBUF);
sprintf(OLEDBUF,"tem:%d'C",temperatureH);
OLED_ShowString(0,6,(u8*)OLEDBUF);
sprintf(OLEDBUF,";hum:%d%%",humidityH);
OLED_ShowString(64,6,(u8*)OLEDBUF);
}
if(++timeCount >= 100) //发送间隔5s(不准确,自己估算的)
{
if(t_h_sta==1&&humidityH < 60) HUMI_CTRL_ON;
if(t_h_sta==1&&humidityH > 80) HUMI_CTRL_OFF;
if(light < 30.0) LED_BLUE_ON;
if(light > 100.0) LED_BLUE_OFF;
timeCount = 0;
OneNet_SendData(); //发送数据
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(3);
if(dataPtr != NULL)
OneNet_RevPro(dataPtr);
DelayXms(5);
}
}
WEB端界面
以下部分对WEB端接收数据方法及控制下发方法进行解释:
A. 在设备管理界面创建数据源,本项目包含三个数据源,分别为湿度数据、温度数据以及光照强度数据,以此数据源为基础创建数据源模板。
B. 在数据可视化界面创建可视化项目,此处无法绑定产品或设备,只需数据源绑定为对应设备的数据源即可。
C. 在界面设计中设计折线图,绑定数据源分别为湿度数据源模板、温度数据源模板以及光照强度数据源模板,设置私有滤波器,x轴设为数据解包中的AT,即时间节点,y轴设为数据解包中的value,即数据大小。
D. 在界面设计中设计旋钮接口,绑定数据源同上,滤波器配置中,需将数据调整为百分比情况,以数据阈值为封顶。故而当旋钮值达到100%的时候需要进行控制。
E. 在界面设计中设计开关按钮和命令下发框,绑定数据源同上,命令机构设置为键值对的CJSON格式,基本格式如下:{“LED_SW”:,“HUMI_SW”:}