基于STM32的智能家居系统设计:构建一个聪明的家 您所在的位置:网站首页 设计一个简单的物联网系统智能社区系统 基于STM32的智能家居系统设计:构建一个聪明的家

基于STM32的智能家居系统设计:构建一个聪明的家

#基于STM32的智能家居系统设计:构建一个聪明的家| 来源: 网络整理| 查看: 265

目录 第1章 前言 1 1.1 课题研究的背景和实际意义 1 1.1.1课题背景 1 1.1.2实际意义 1 1.2国内外发展现状、存在问题以及前景 2 1.2.1发展现状 2 1.2.2存在问题 2 1.2.3发展前景 2 1.3 主要工作、内容安排及预期成果 3 1.3.1主要研究工作 3 1.3.2预期成果 3 第2章 总体设计方案 5 2.1 系统总体方案设计 5 2.2 系统方案选择 6 2.2.1 无线通讯方案选择 6 2.2.2 显示器方案选择 6 第3章 系统硬件设计 7 3.1 控制单元模块 7 3.2 人机交互模块 8 3.3 GPRS电路设计 9 3.4 温湿度传感器电路设计 10 3.5 光强检测电路设计 10 3.6 窗帘控制电路设计 11 3.6.1 步进电机的选用 11 3.6.2 步进电机28BYJ-48介绍 11 3.6.3 步进电机驱动 12 3.7 继电器驱动电路设计 12 3.8 电源电路设计 13 第4章 系统软件设计 15 4.1 软件开发环境介绍 15 4.2 软件总体设计 15 4.2.1 程序结构分析 15 4.2.2 主程序设计 15 4.2.3 OLED驱动程序分析 17 4.2.4 SIM900通信程序设计 17 第5章 系统调试与结果分析 19 5.1 程序仿真设计 19 5.2 实物调试 20 结论 22 致谢 23 参考文献 24 1.3 主要工作、内容安排及预期成果 1.3.1 主要研究工作 消费者们对于智能家居呈现出一种多样化的迫切性需求,一方面是居住环境的安全性,体现在门窗安全、煤气泄漏及火灾隐患自动报警等要求;另一方面是居住环境的舒适便捷性,体现在无线通信的控制方式、室内灯光以及直观性人机交互操作等方面。 在了解到消费者对智能家居实质性需求的基础上,结合本人自身的开发能力,本课题最终确定研究的简易智能家居控制系统涵盖了如下几个模块:传感器模块、控制器模块,GPRS通讯模块,继电器输出控制模块,显示器模块等五大电路模块。本系统主要是侧重点是在远程报警(室内温度异常时,通过GPRS通讯模块向手机发送报警短信)和远程控制(需要时,远程终端通过GPRS通讯模块向本地控制器发送控制指令,控制继电器开闭)方面。除此之外,还有窗帘根据光照强度自动开闭以及本地按键执行中断控制(应用于特殊情况,如自动控制出错时)。 1.3.2预期成果 通过本系统设计各个模块的搭建,预计能够实现如下功能: 1、本地温度湿度报警器实时监测室内情况,当温度异常时发送室内实时数据到设定手机上;测量范围为湿度:2090%RH;温度:050℃。所以本设计使用范围广泛,既可用于气候干燥的北方,也可用于较为湿润的南方;既可适用于工地环境,也可用于婴儿房环境; 2、窗帘的自动控制和按键控制(本设计中用电机正反转表示窗帘的开闭),这个功能解决了用户频繁手动打开窗帘的麻烦。日常生活中,当遇到有强光的晴天,本设计的窗帘则能自动关闭,减少用户亲自打开窗帘的麻烦,遇到相反情况则相反处理。此外设计的按键控制窗帘,也可减少用户手拨窗帘的不便; 3、手机发送控制指令的短信到GPRS通讯模块,实现继电器的开闭。本设计用两个发光二极管代替所控制的家电,实际应用中,可通过继电器控制空调、电饭煲等家用电器。例如炎炎夏季,空调制冷需要一定时间,用户在回家前提前远程控制空调打开,回家即可享受到冰爽的体验。 第2章 总体设计方案 2.1 系统总体方案设计 本设计硬件电路结构包含6个部分,分别是STM32控制器、输入部分、输出部分、电源模块、环境探测、SIM900无线通讯。其中控制器选用32位微控制器STM32F103R8T6OLED显示器;输入部分包含按键输入、SMS指令输入;输出部分包含0.96寸12864 OLED显示器、继电器输出、窗帘控制输出;环境探测包含一体化温湿度检测模块DHT11、光强检测4线制光敏传感器模块。结构框图如下图1.1所示。

光强检测选用的是光感电阻传感器模块,可输出模拟量(电压)至STM32控制器处理后由OLED显示器显示出当前光照强度,同时输出经比较器LM393比较后输出的开关量(0或1)至STM32来控制窗帘的开关从而控制家居的通光率。在系统接通电源开始运行后,控制器通过串口访问SIM900通讯模块,不断判断是否收到绑定手机发送的短信指令,若接受到有效命令则解析指令控制继电器的开闭,从而达到控制家电开闭的目的。在系统工作过程中,温湿度传感器DHT11不断采集环境的实时温湿度并通过串口送入控制器。设置阈值来判别正常和异常情况,本文转载自http://www.biyezuopin.vip/onews.asp?id=12500当发现异常时触发SIM900模块向设定手机号发送状态信息。此外,系统通过按键扫描的方式实现人机交互,控制器响应按键输入同时控制OLED显示各类相关数据信息。

//头文件调用 #include "usually.h" #include "usart.h" #include "oled.h" #include "dht11.h" #include "rtc.h" #include "delay.h" #include "stm32f10x_adc.h" #include #include "BSP_Config.h" #include "gpio.h" #include "gsm.h" //宏定义 #define ADC_CH0 0 //通道0 #define ADC_CH1 1 //通道1 #define ADC_CH2 2 //通道2 #define ADC_CH3 3 //通道3 #define SEC 0 #define MIN 1 #define HOUR 2 #define DATE 3 #define MON 4 #define YEAR 6 #define MODE_NORMAL 0 #define MODE_SET_HOUR 1 #define MODE_SET_MIN 2 #define MODE_SET_SEC 3 #define MODE_SET_YEAR 4 #define MODE_SET_MON 5 #define MODE_SET_DATE 6 #define MODE_SET_HUMI_HIGH 8 #define MODE_SET_TEMP_HIGH 7 #define MODE_SET_LIGHT 9 #define KEY_MENU_IN PBin(0) #define KEY_ADD_IN PBin(1) #define KEY_SUB_IN PBin(2) //步进控制 A-AB-B-BC-C-CD-D-DA #define Motor1_A_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define Motor1_AB_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define Motor1_B_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define Motor1_BC_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define Motor1_C_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define Motor1_CD_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_SetBits(GPIOB,GPIO_Pin_11);} #define Motor1_D_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_SetBits(GPIOB,GPIO_Pin_11);} #define Motor1_DA_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_SetBits(GPIOB,GPIO_Pin_11);} #define Motor1_STOP_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);} #define motorSpdDelayUs 1100 //声明变量 extern struct Data_Time timer; unsigned char *pUart1_Rxd;//接收数据指针 unsigned int uart1_RxNum=0;//串口1接收字数 unsigned char Num_TXD=0;//串口1发送缓冲区的字节数 unsigned char Uart1_TxBuf[256]={0,2,3,};//串口1发送缓冲区 unsigned char Uart1_RxBuf[256]; //串口1接收缓冲区 unsigned char *pUart2_Rxd; //串口2接收数据指针 unsigned int uart2_RxNum=0; //串口2接收字数 unsigned char uart2_TxNum=0; //串口2发送缓冲区的字节数 unsigned char Uart2_TxBuf[256]={0,2,3,};//串口2发送缓冲区 unsigned char Uart2_RxBuf[256]; //串口2接收缓冲区 //变量声明 //extern struct tm timer; char line1str[17]="Welcome to use!"; char line2str[17]="Wating gsm... "; char line3str[17]=" "; char line4str[17]=" "; uint8_t dht11_buf[5]; uint8_t nowtemp,nowhumi;//当前温湿度值 uint8_t thalmflg; //温湿度过高报警 uint16_t adtemp[12]={0}; //连续采集12点算平均值 uint16_t light_adc,set_lit_high,lit_high; uint8_t almtmp_high,almhumi_high; uint8_t mode_status; //模式 uint8_t flashflg; //模式 uint8_t settimeflg; //时间被设置标志位 uint8_t solid1flg,solid2flg,winflg; unsigned char settime[8]={0x00,30,12,0x6,10,0x01,15};//??sec,min,hour,date,month,week,year char recephonenum[12]="13538510586"; char phonenum_flash; uint8_t adci=0; char strLs[32]; //按键输入初始化 void Key_init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 //Configure pin Pb1 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA13,PA14,PA15按键输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOB,&GPIO_InitStructure); } //继电器输出IO初始化 void Solid_Init(){ GPIO_InitTypeDef GPIO_InitStructure; //Configure pin Pb0 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); //Configure pin Pb1 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); /* GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOB,GPIO_Pin_6); */ } //步进输出IO初始化 void Motor_Init(){ GPIO_InitTypeDef GPIO_InitStructure; //Configure pin Pb0 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); //Configure pin Pb1 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); //Configure pin Pb0 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); //Configure pin Pb1 as output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); /* GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOB,GPIO_Pin_6); */ } //初始化ADC //这里我们仅以规则通道为例 //我们默认将开启通道0~3 void Adc_Init(void) { //先初始化IO口 RCC->APB2ENR|=1APB2ENR|=1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有