智能家居系统设计[裸机stm32/μCOS-III]

​  在正式讲解之前,先来总结一下。该项目是对大学学过的部分知识进行整合,同时这也是我大学的毕业设计,也算是对大学的一个交待。
​  首先来讲述一下该项目具体实现了哪些功能,方便大家理清思路。该项目拥有四种控制方式,分别是语音识别、触摸屏、小程序、APP,而控制的对象是家用电器(这里利用一个多路继电器来模拟家用电器)。
​  这四种控制方式还能对采集的数据进行反馈显示:
​  在语音识别方面,语音模块识别到特定的关键词语后,会将采集到的温湿度数据通过语音播报模块进行播报反馈;
​  在触摸屏和APP方面,将采集到的温湿度、有害气体浓度、光照强度显示在触摸屏上,还可以设置湿度和有害气体浓度的阈值(湿度阈值的设置是当湿度超过设定阈值时,表明室外下雨了,让窗户自动关闭(这样也是利用一路继电器来模拟窗户的打开与关闭);有害气体浓度阈值的设置是当浓度超过设定阈值时,表明屋内有害气体浓度过高,让语音播报"煤气含量过高,请及时处理"来达到警示的目的),最后还能设置是否开启安防模式,在安防模式下,会通过人体感应模块不断检测周围是否有人,如果有人的话,蜂鸣器就会报警警示,同时在APP和小程序上也会改变相对应的图标。
  在小程序方面,除了可以显示采集到的数据和控制用电器之外,这里还可以显示当地的天气状态。

APP的远程控制可参考我之前写的文章:stm32+esp8266+onenet平台
小程序的远程控制可参考我之前写的文章:stm32利用mqtt与小程序通信
语音识别的控制可参考我之前写的文章:stm32利用语音识别与播报智能控制led灯
触摸屏的控制可参考淘晶驰官方文档:USART HMI资料中心

本项目所用到的器件如下:
STM32F103ZET6最小系统板
ESP8266-01S模块(2个,一个用于APP,一个用于小程序)
USB转microUSB数据线
DHT11温湿度
MQ-5模块
光敏电阻模块
HC-SR505人体感应模块
BEEP蜂鸣器
语音识别与播报模块(亚博智能)
串口触摸屏(淘晶驰X3系列 4.3寸)

为了让大家更加深刻的理解器件的摆放位置,这里利用soliwork画了一个三维理想模型,里面清楚表明了器件的具体位置。如下图所示:

由于本项目需要连接的线非常多,如果采用杜邦线连接的话,会非常繁琐,所以为了简化接线,这里画了一块PCB板来代替杜邦线,整体的效果也美观了许多。如下图所示:



本项目的接线定义如下所示:

/*  接线定义ESP8266(APP)            DHT11               MQ-5          光敏电阻      HC-SR505       BEEP(有源,低电平触发)TX->stm32 RX(PA3)   VCC->stm32 3.3V      VCC->stm32 5V    VCC->stm32 5V    VCC->stm32 5V    VCC->stm32 3.3VRX->stm32 TX(PA2)  GND->stm32 GND       GND->stm32 GND   GND->stm32 GND   GND->stm32 GND   GND->stm32 GND3.3V->stm32 3.3V    DATA->stm32 PF12 AO->stm32 PA1    AO->stm32 PA4    AO->stm32 PF13   AO->stm32 PF14GND->stm32 GND语音识别模块            语音合成播报模块        串口屏                 ESP8266(小程序)IIC1                IIC2                TX->stm32 RX(PD9)        TX->stm32 RX(PC11)VCC->单片机5V      VCC->单片机5V       RX->stm32 TX(PD8)        RX->stm32 TX(PC10)SCL->单片机PB8     SCL->单片机PB10     5V->stm32 5V         3.3V->stm32 3.3VSDA->单片机PB9       SDA->单片机PB11     GND->stm32 GND           GND->stm32 GNDGND->单片机GND     GND->单片机GND
*/

再来看看设计的页面效果图:
APP界面设计:

小程序界面设计:

触摸屏界面设计:

接着附上录制的相关视频:

1.小程序登录

2.语音识别(有声)

3.数据采集

4.按键控制

5.安防检测(有声)

最后附上32程序的主代码:

#include "stm32f10x.h"
#include "onenet.h"
#include "esp8266.h"
#include "delay.h"
#include "usart.h"
#include "serial.h"
#include "led.h"
#include "dht11.h"
#include "adc.h"
#include "hc-sr505.h"
#include "beep.h"
#include "bsp_i2c.h"#include "esp8266_mqtt.h"
#include "onenet_mqtt.h"//C库
#include <string.h>
#include <stdio.h>//网络卡导致发送到云平台的速度变慢/*  接线定义ESP8266(APP)            DHT11               MQ-5          光敏电阻      HC-SR505        BEEP(有源,低电平触发)TX->stm32 RX(PA3)  VCC->stm32 3.3V      VCC->stm32 5V    VCC->stm32 5V    VCC->stm32 5V    VCC->stm32 3.3VRX->stm32 TX(PA2)  GND->stm32 GND       GND->stm32 GND   GND->stm32 GND   GND->stm32 GND   GND->stm32 GND3.3V->stm32 3.3V    DATA->stm32 PF12 AO->stm32 PA1    AO->stm32 PA4    AO->stm32 PF13   AO->stm32 PF14GND->stm32 GND语音识别模块            语音合成播报模块        串口屏                 ESP8266(小程序)IIC1                IIC2                TX->stm32 RX(PD9)        TX->stm32 RX(PC11)VCC->单片机5V      VCC->单片机5V       RX->stm32 TX(PD8)        RX->stm32 TX(PC10)SCL->单片机PB8     SCL->单片机PB10     5V->stm32 5V         3.3V->stm32 3.3VSDA->单片机PB9       SDA->单片机PB11     GND->stm32 GND           GND->stm32 GNDGND->单片机GND     GND->单片机GND*//* 初始化阶段不要说话,防止被语音识别到,导致语音识别卡住 *//* 发送数据给服务器端,如果没有应答,可能是因为服务器不稳定,过段时间就好了 *//* 在开发过程中发现,有时候明明只延时了10ms但是实际上延时了足足100ms(多了十倍),其原因可能是:1、外部HSE没起震,结果使用的是内部HSI,这种情况下,默认的是没有倍频的。实际时钟速度就变成了8MHZ,而不是72MHZ,所以时间相差了接近10倍。解决方法是重新复位,直到他外部晶振起震2、语音识别模块使用的硬件IIC干扰到晶振的正常运行,可能是硬件设计电路的问题,如果要想正确延时的话,必须关闭语音识别模块,若想要打开语音识别模块,则会加长延时时间*/
extern SendData sendata;
extern unsigned short esp8266_cnt;const char *devSubTopic[] = {"/iot/1009/zsd1"};    //适用EMQX(无需主题前缀)、杰叔叔服务器(需要指定前缀)
const char *devPubTopic = "/iot/1009/zsd2";      //适用EMQX(无需主题前缀)、杰叔叔服务器(需要指定前缀)void Hardware_Init(void)                          //各种功能器件的初始化
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //中断控制器分组设置delay_init();                                    //systick初始化Usart1_Init(115200);                          //串口1,打印信息用Usart2_Init(115200);                          //串口2,驱动ESP8266用于APPUsart3_Init();                                  //串口3,与串口屏通信进行数据交互Uart4_Init(115200);                              //串口4,驱动ESP8266用于小程序LED_Init();                                      //LED灯初始化Device_Init();                                 //继电器六个IO的初始化HC_SR505_Init();                               //人体感应模块初始化Beep_Init();                                 //蜂鸣器初始化Adc_Init();                                     //ADC初始化while(DHT11_Init())                               //DHT11初始化delay_ms(200);    UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
}int main(void)
{char array[256];                      //将要发布主题的数据存储区unsigned char *dataPtr_mqtt = NULL;       //接收MQTT数据的数据包指针unsigned short timeCount = 0;         //发送间隔变量unsigned char *dataPtr = NULL;          //存储接收到的数据u8 i = 0;                             //LED灯闪烁计数位u8 j = 0;                                //ESP8266(APP)复位计数位bool flag = 0;                           //LED取反标志位Hardware_Init();                      //初始化外围硬件ESP8266_Init();                         //初始化ESP8266(APP)ESP8266_Init_MQTT();                    //初始化ESP8266(小程序)while(OneNet_DevLink())                   //接入OneNET服务器delay_ms(500);while(OneNet_DevLink_MQTT())            //接入EMQX服务器delay_ms(500);OneNet_Subscribe(devSubTopic, 1);      //MQTT的订阅主题voice_module();                          //语音模块初始化while (1) {if (++timeCount > 3) {//下面ESP8266_GetIPD函数执行完需要70-100ms的时间,这里计数30,表示大约3s发送一次数据;如果外部晶振不起作用,这里就设置为3也就是3s//UsartPrintf(USART_DEBUG, "data:%d\r\n",esp8266_cnt);       //判断串口2是否有数据接收到DHT11_Read_Data(&sendata.temp,&sendata.humi);               //读取温湿度值get_ppm_lx(&sendata.ppm, &sendata.lx);                     //获取煤气ppm、光强lx,这个函数大概花费50msdeal_with();                                                //判断湿度、煤气含量是否超阈值OneNet_SendData();                                          //发送数据给云平台sprintf(array, "{\"temp\":%.1f,\"humi\":%.0f,\"light\":%.1f,\"ppm\":%.0f,\"led1\":%d,\"led2\":%d,\\"win\":%d,\"cur\":%d,\"fan\":%d,\"cook\":%d,\"sec\":%d,\"sec_image\":%d}", \sendata.temp, sendata.humi, sendata.lx, sendata.ppm, sendata.light1, sendata.light2, sendata.window\, sendata.curtain, sendata. fan, sendata.rice_cooker, sendata.security, sendata.detect);OneNet_Publish(devPubTopic, array);                           //MQTT的发布主题memset(array, 0, sizeof(array));//发送数据给串口屏Screen_SendData(sendata.temp, sendata.humi, sendata.ppm, sendata.lx);                                    timeCount = 0;//ESP8266_Clear();                                   //清除esp8266_buf中的数据}speech_recognition(sendata.temp, sendata.humi);         //判断是什么指令并给出相应的回应data_handle();                                         //对串口返回的数据进行处理if (sendata.security == 1) {                            //安防模式开启if (HC_SR505 == 1) {                               //感应到人sendata.detect = 1;    beep = 0;                                      //蜂鸣器响} else if (HC_SR505 == 0) {                            //感应不到人sendata.detect = 0;beep = 1;                                     //蜂鸣器不响}} else if (sendata.security == 0) sendata.detect = 2; //安防模式关闭//若延时正常,这里设置等待的时间为10*10ms=100ms,确保进入一次函数后能收到数据,如果返回NULL,表示暂时接收不到数据//若延时不正常,这里可以设置等待1*10ms,虽然会使得数据在下一次才接受到,不过程序运行很快,这种的话会实时响应其他的程序代码,这里延时大概是50msdataPtr = ESP8266_GetIPD(10);                         if(dataPtr != NULL){OneNet_RevPro(dataPtr);j=0;}dataPtr_mqtt = ESP8266_GetIPD_MQTT(1);if(dataPtr_mqtt != NULL)OneNet_RevPro_MQTT(dataPtr_mqtt);i++;j++;if (i > 3) {                                            //这里计数10,表示1秒;如果外部晶振不起作用,这里计数1,表示1秒;如果进入此判断LED闪烁一次,表示系统正常运行i = 0;flag = !flag;LED0(flag);}if(j > 12){                                                //这里计数160,表示16秒;如果外部晶振不起作用,这里计数16,表示16秒;如果进入此判断表明设备掉线,需要重新连接ESP8266_Init();                                       //这里需要等待几分钟,要等到WIFI模块彻底断开连接后,串口才会接收到WIFI模块的AT指令返回值OneNet_DevLink();j = 0;}}
}

这里主要给大家列出main程序,几乎每个函数后面都有相应的注释,里面嵌套的函数也有相应的注释,由于函数过多,这里就不一一列举出来。该项目采用BSP工程管理的思想来进行模块化,方便代码的维护。如下图所示:

本项目具体的执行流程如下图所示:

上面只是给大家提供一个大概的思路,希望对大家能有所启发。在制作该项目过程中,考虑到实时性问题,将原来裸机的代码移植到μCOS-III中,从而来提高系统的响应。
附上整个智能家居项目代码链接:智能家居系统设计(stm32/μCOS-III)
代码要的下方留言邮箱我会第一时间发给你们的,有什么问题也可以下面评论!(其中包含裸机stm32和μCOS-III两个版本)

智能家居系统设计(裸机stm32/μCOS-III)相关推荐

  1. 基于STM32与OneNet平台的智能家居系统设计(代码开源含自制APP代码)

     前言:本文为手把手教学的基础物联网开发设计,项目包含对下位机(MCU对外设数据读取与控制)和上位机(包含服务平台和APP端)的设计.下位机选取STM32作为MCU,外设有LED灯和DHT11温湿度传 ...

  2. STM32毕业设计——基于STM32+MQTT+WiFi技术的智能家居系统设计与实现(毕业论文+程序源码)——智能家居系统

    基于STM32+MQTT+WiFi技术的智能家居系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+MQTT+WiFi技术的智能家居系统设计与实现,文章末尾附有本毕业设计的论文 ...

  3. 毕业设计| STM32单片机控制的智能家居系统设计

    每年这个时候,很多同学到毕业设计时候,想不出来要做什么项目,或者有了题目却没有思路,所以给大家分享一个智能家居项目,感兴趣的大家点个关注. 智能家居系统功能概述 上面视频演示的STM32智能家居的功能 ...

  4. 基于物联网的智能家居系统设计(课设)

    基于物联网的智能家居系统设计(课设) 摘 要 一.概述 二.系统分析 三.系统设计 四.系统实现 1.硬件实现 2.软件实现 五.结论与心得 六.参考文献 摘 要   科技的快速发展给人们的生活带来了 ...

  5. 基于语音控制的智能家居系统设计(毕业设计初版)

    基于语音控制的智能家居系统设计(毕业设计初版) 1.项目组成 2.参考博客 3.安卓APP工程(只贴主程序和主布局文件) 3.1.MainActivity.java 3.2.activity_main ...

  6. python与室内设计_基于树莓派和Python的智能家居系统设计

    基于树莓派和 Python 的智能家居系统设计 许礼捷 葛华 陈红 [摘 要] 介绍树莓派第 3 代开发平台,融合 Python 开发技术和 OneNET 云 平台通信技术等先进技术,设计一款智能化的 ...

  7. 基于Arduino的智能家居系统设计

    基于Arduino的智能家居系统设计 一.设计要求 1.利用DHT11温湿度检测模块和光敏电阻采集环境温度.湿度和光强信息: 2.通过Arduino开发板对DS1302时钟模块进行初始设置,并每隔一定 ...

  8. 基于智能家居c语言程序代码,基于单片机的智能家居系统设计(附程序代码)

    基于单片机的智能家居系统设计(附程序代码)(任务书,开题报告,外文翻译,论文10000字) 摘要 基于近年来通信电子技术的高速发展,使得一些原来可望不可及的事关民生的技术变为可能,条件允许的情况下,人 ...

  9. android 智能家居 pdf,基于Android的智能家居系统设计与实现.pdf

    1引言 随着我国互联网技术不断的发展, 给IT行业带来了新的 春天.越来越多的企业加入了互联网的发展浪潮, 使得智能 家居得到了飞速的发展.网络已经成为我们生活中必不可 少的部分, 网络电视. 网络空 ...

  10. 基于 ESP32 的智能家居系统设计

    基于 ESP32 的智能家居系统设计 摘 要:智能家居科技是在电子信息技术和无线通信技术以及软件和信息技术方面进一步开发所形成的新兴科学技术,这项科技可以改善我们的生活条件,并可以使居家条件显得更为适 ...

最新文章

  1. Winsock服务器设计的四个关键问题
  2. oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
  3. AV1编码时间下降,接近使用水平
  4. 如何实现从wgs-84到beijing54的坐标转换
  5. java 常规类的可见性_Java 12常规可用性
  6. java static 块 时机_java的static块执行时机
  7. 斯诺登NFT作品拍得者PleasrDAO将继续收藏NFT艺术品
  8. DEM数据(12米)精度获取方法
  9. ArcGIS Server中各种服务详解
  10. 『Hammerspoon』Mac 锁屏自动开关蓝牙
  11. 信号转换 | 如何将正弦波转换成方波?
  12. ERP系统中BOM的作用
  13. MDCC 2016参会总结
  14. 低频RFID读卡流程
  15. 浅谈UAC ByPass
  16. 石川 :学术界、管理人、投资者视角下的因子投资
  17. 如何有效的避免图片侵权(100%避免网站图片侵权)
  18. 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?
  19. 【人月神话】第二章:人月神话
  20. 赛门铁克未署名诺顿安全更新 防火墙警报引混乱

热门文章

  1. Qt Qlineedit右击自带的菜单默认英文转中文
  2. Unity3D天气系统插件UniStorm 3.0.1.1 插件使用说明
  3. 今天上班穿了一只拖鞋和一只凉鞋
  4. Linux kernel + busybox自制Linux系统
  5. 爱荷华州立大学计算机专业,爱荷华州立大学|Iowa State University|Department of Electrical and Computer Engineering_毕达留学...
  6. 圣诞帽php,微信小程序“圣诞帽”的实现思路详解
  7. mysql中删除两条重复的数据,只保留一条
  8. (滑稽保命)对于《数据结构》严蔚敏教程的吐槽,附:详细代码
  9. 数据分析的思维逻辑步骤
  10. 计算机函数sumif实例,「稻客说函数」SUMIF函数实例详解