目录
一.功能设计
本次设计的目标是想实现如下图所示的智能家居环境
本次设计所实现的功能:
用红外遥控输入密码,密码正确,绿灯亮,系统工作,实现后面的功能,密码不正确红灯亮,不工作。
红外避障检测到汽车靠近,自动抬杆
检测光照强度,显示到TFTLCD屏幕上,天亮自动开窗
检测温湿度数值,温度高,自动开风扇。
火焰传感器检测到有火,烟雾传感器检测到有烟雾,蜂鸣器就报警。
通过WIFI模块连接到原子云, 从云端远程控制开门、开窗,同时将温度 湿度 光照信息上传到原子云显示
二.演示视频
完成后的演示视频如下:
基于探索者开发板的智能家居_功能演示
正点原子WIFI模块连接原子云的讲解
三.硬件选择
所有硬件的实物图如下:
1.单片机
单片机选择stm32f407,用的是正点原子的探索者开发板。
正点原子探索者开发板(Atomic Explorer)是一款基于STM32系列微控制器的开发板。它由正点原子推出,旨在方便开发者进行嵌入式系统的开发和调试。
该开发板采用了常见的DIP封装,具有丰富的外设和接口,包括数字量输入输出口、模拟量输入输出口、串口、SPI、I2C等接口,以满足不同项目的需求。开发板还配备了丰富的功能模块,如LED指示灯、继电器、按键、温湿度传感器等,方便开发者快速验证和验证项目的可行性。
开发者可以使用开发板上提供的开发环境和开源库进行程序开发,也可以与其他常用开发环境(如Keil、IAR)配合使用。开发板支持C语言和汇编语言编程,开发者可以根据自己的需要选择合适的编程方式。
总之,正点原子探索者开发板是一款功能丰富、易于使用的嵌入式系统开发工具,适用于学习、原型开发和小型项目开发等各种场景。
2.红外遥控
红外遥控用的是买单片机自带的。
通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。
红外接收设备是探索者板子上自带的,由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信号转换成电信号,再放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处理器。近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VOUT)。
3.红外探测模块
红外探测模块检测到有车靠近时,自动抬杆。使用模块如下所示:
该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距离范围2~30cm,工作电压为3.3v-5V。该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。
其原理图如下所示
4.光敏电阻模块
光敏电阻模块如下图所示:
光敏电阻模块(Photoresistor Module)是一种基于光敏电阻原理的传感器模块。它是一种被广泛应用于光敏感测领域的组件,常用于测量环境中的光强度。
光敏电阻模块通常由光敏电阻元件和调节电路组成。光敏电阻元件是一种能随着光照强度变化而改变电阻值的组件。当光照强度增加时,电阻值会减小;反之,当光照强度减小时,电阻值会增加。调节电路通常用于对光敏电阻的输出进行放大和转换。
光敏电阻模块可以通过数字或模拟信号进行输出。在数字输出模式下,当光敏电阻检测到的光强度超过预设阈值时,输出高电平;否则,输出低电平。在模拟输出模式下,光敏电阻模块会输出一个与光强度成正比的电压或电流信号。
光敏电阻模块广泛应用于自动调节和感知光照的场景中。例如,它可以用于光敏感控灯系统、光敏感自动窗帘系统、光敏感安防系统等。通过与其他模块或控制器结合,光敏电阻模块可以实现光强度的实时监测和光敏感应控制。
只要用单片机的AD转换功能,检测该模块输出电压的大小,都可以知道环境光照强度大小。
5.温湿度检测模块
温湿度传感器选择的是DHT11,实物图如下:
DHT11是一款广泛应用于温湿度测量的数字温湿度传感器。DHT代表Digital Humidity and Temperature(数字湿度和温度),11表示其具有11位的输出精度。
DHT11传感器由温湿度感测元件、AD转换电路和数字信号处理电路组成。它采用单总线传输方式,通过一个总线线路即可同时获取温度和湿度数据。DHT11的测量范围为温度0℃至50℃,湿度20%RH至90%RH。
DHT11传感器的使用非常简单,只需将其三个引脚分别连接到供电(VCC)、地(GND)和数据(DATA)引脚即可。通过单总线协议,可以通过读取引脚上的数字信号来获取温度和湿度值。通常情况下,开发者需要使用相应的库或驱动程序来与DHT11传感器进行交互,以便读取温湿度数据并进行进一步的处理和应用。
6.风扇模块
风扇模块实物图:
这种风扇自带驱动,直接用单片机IO口就可以控制它的转动,非常方便,不需要外加驱动模块,可以大大提高便利性。
7.舵机
本次使用小型数字舵机。实物:
可见,只要给该舵机一定时间的高电平,就能控制舵机转动到对应的角度!
8.WIFI模块
WIFI模块使用正点原子的WIFI模块,实物图如下:
WIFI模块(Wireless Fidelity Module)是一种用于无线网络通信的模块,可以使设备具备无线网络连接的能力。
WIFI模块通常与设备的主控芯片或微控制器结合使用,通过无线局域网(WLAN)技术实现设备与网络的连接。它可以通过无线方式传输数据、接入互联网、与其他设备进行通信等。
WIFI模块的工作原理主要基于标准的无线网络协议(如IEEE 802.11系列标准),其中常见的协议包括802.11b、802.11g、802.11n和802.11ac等。这些协议定义了WIFI模块与其他设备之间的通信规范,包括使用的频段、数据传输速率、安全认证等。
使用WIFI模块,设备可以利用现有的无线网络基础设施(如无线路由器)与互联网进行连接,以实现各种应用场景。例如,智能家居设备可以通过WIFI模块连接到家庭无线网络,实现远程控制和监控;物联网设备可以通过WIFI模块与云服务器进行通信,实现数据传输和远程控制等。
在探索者板子上,WIFI模块使用的是串口三,所以到时候直接用串口三控制这个WIFI模块就可以了。
在程序设计时,我用了一个按键控制了WIFI模块的连接,按下K0,才进行WIFI模块连接到原子云这一步工作。
9.LED和蜂鸣器
LED和蜂鸣器直接用板子上自带就即可。
10.火焰传感器
火焰传感器是专门用来探测火源的传感器。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为模拟电压信号输出。 本次使用的火焰传感器,火焰强度越大,输出的电压越低。火焰强度越小,输出的电压越大。是一个反比例关系。
所以,当有火焰时,该模块输出低电平。单片机检测到低电平就可以进行相关的控制操作。
11.气体传感器
气体传感器使用的是MQ2,MQ-2气体传感器对气体敏感,能检测出包括天然气、甲烷、酒精在内的多种可燃性气体,是一款高性价比传感器。下图为MQ-2传感器的实物图:
本次只使用了它的数字输出口,当传感器检测到有烟雾时就会输出低电平,单片机检测到这个低电平就知道有烟雾产生了。
四.程序设计
1.连线方式
/**
****************************************************************************************************
红外避障端口 数字输出端"D" 接到单片机PB3口
汽车抬杆控制口为PB0
光照传感器接PA5
控制开窗的舵机接PB1
温湿度传感器接PG9
风扇的INA接PC0 INB 接PC2
火焰传感器 数字输出端"D" 接PB6
气体传感器 数字输出端"D" 接PB7
控制大门的舵机接 PB2
****************************************************************************************************
*/
2.注意事项
//开机后,用遥控输入开机密码 初始密码为 123456 输入时 按键按下去的时间必须非常短暂,避免重复触发 密码输入完成后 按下遥控器电源键进行密码判断
//密码输入过程中 如果输错了数字 可以按下删除键进行删除
//密码输入正确后 按下KEY0键 进行WIFI连接 连接过程会在LCD上显示
//连接上原子云后 温度 湿度 光照会传到原子云显示 从原子云发送1 控制大门的舵机会打开 发送0 大门关闭
3.主程序代码
/**
****************************************************************************************************
红外避障端口 数字输出端"D" 接到单片机PB3口
汽车抬杆控制口为PB0
光照传感器接PA5
控制开窗的舵机接PB1
温湿度传感器接PG9
风扇的INA接PC0 INB 接PC2
火焰传感器 数字输出端"D" 接PB6
气体传感器 数字输出端"D" 接PB7
控制大门的舵机接 PB2
****************************************************************************************************
*/
//开机后,用遥控输入开机密码 初始密码为 123456 输入时 按键按下去的时间必须非常短暂,避免重复触发 密码输入完成后 按下遥控器电源键进行密码判断
//密码输入过程中 如果输错了数字 可以按下删除键进行删除
//密码输入正确后 按下KEY0键 进行WIFI连接 连接过程会在LCD上显示
//连接上原子云后 温度 湿度 光照会传到原子云显示 从原子云发送1 控制大门的舵机会打开 发送0 大门关闭
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/DHT11/dht11.h"
#include "./BSP/SENSOR/sensor.h"
#include "./BSP/REMOTE/remote.h"
#include "./BSP/TIMER/btim.h"
#include "string.h"
char mima[]="123456"; //密码
int light_yuzhi=200; //光照强度阈值(可根据实际情况修改)
int temp_yuzhi=20; //温度阈值
int main(void)
{
uint8_t key;
uint8_t flag=0; //若flag=1 说明输入的密码正确
uint8_t i = 0;
uint16_t adcx=0; //保存AD转换的值 该值的大小反应了光照强度
uint8_t temperature=0; //保存温度数据
uint8_t humidity=0; //保存湿度数据
char str[]="";
char *p;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
btim_timx_int_init(10 - 1, 8400 - 1); /* 84 000 000 / 84 00 = 10 000 10Khz的计数频率,计数10次为1ms */
usart3_init(115200); //WIFI 初始化 波特率必须为 9600
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
sensor_init(); //各种开关量传感器初始化
beep_init(); /* 初始化蜂鸣器 */
key_init(); /* 初始化按键 */
remote_init(); /* 红外接收初始化 */
dht11_init(); //温湿度传感器初始化
adc_init(); /* 初始化ADC 采集光照强度要用到ADC */
g_point_color = RED;
lcd_show_string(50, 40, 300, 32, 32, "SMART HOME SYSTEM", RED); //显示标题
lcd_show_string(50,100, 300, 16, 16, "key:", RED); //显示标题
lcd_show_string(30, 160, 200, 16, 16, "Light_Intensity", BLUE); //显示光照强度
lcd_show_string(30, 180, 200, 16, 16, "Light_yuzhi", BLUE); //显示光照强度阈值
lcd_show_xnum(110, 180, light_yuzhi, 5, 16, 0, BLUE);
lcd_show_string(30, 200, 200, 16, 16, "Temp: C", BLUE); //显示温度
lcd_show_string(30, 220, 200, 16, 16, "Humi: %", BLUE); //显示湿度
lcd_show_string(30, 240, 200, 16, 16, "Temp_yuzhi: C", BLUE); //显示温度阈值
lcd_show_num(30 + 84, 240, temp_yuzhi, 2, 16, BLUE);
while (1)
{
key = remote_scan(); //检测红外遥控是否有按键按下
if(key) //如果按键被按下
{
switch (key)
{
case 22:
str[i++] = '1';
break;
case 25:
str[i++] = '2';
break;
case 13:
str[i++] = '3';
break;
case 12:
str[i++] = '4';
break;
case 24:
str[i++] = '5';
break;
case 94:
str[i++] = '6';
break;
case 8:
str[i++] = '7';
break;
case 28:
str[i++] = '8';
break;
case 90:
str[i++] = '9';
break;
case 66:
str[i++] = '0';
break;
case 74:
str[--i] = ' '; //如果按了回退键,那么指针左移一位 相当于删除最后一位数字
break;
case 69: //69 是电源键 按下以后进行密码判断
if(strcmp(str,mima)==0) //如果密码正确
{
flag=1;
}
else
{
flag=0;
lcd_show_string(80, 100, 300, 16, 16, " ", RED); //清空前面输错的密码
}
i=0;
strcpy(str,""); //清空 便于下次输入密码
break;
}
}
lcd_show_string(80, 100, 300, 16, 16, str, RED); //显示输入的密码
if(flag==1)
{
LED1(0); //密码正确 绿灯亮
LED0(1);
lcd_show_string(50,100, 300, 16, 16, "welcaom to my smart home system", RED);
lcd_show_string(30, 320, 200, 16, 16, "press key0 to connect wifi", BLUE);
if(KEY0==0)
{
lcd_show_string(30, 340, 200, 16, 16, "WIFI Connecting......", BLUE);
u3_printf("AT+CWMODE=1\r\n");
delay_ms(3000);
u3_printf("AT+CWJAP=\"FAST_0A5C\",\"123456789\"\r\n"); //FAST_0A5C改成你自己的WIFI名字 后面的一串数字改成你自己的WIFI密码
delay_ms(8000);
u3_printf("AT+ATKCLDSTA=\"22021955902980447838\",\"88888888\"\r\n"); //这里的数字是设备编号 和 设备密码 改成你自己原子云里面对应的就行
delay_ms(3000);
lcd_show_string(30, 340, 200, 16, 16, "WIFI Conneced! ", BLUE);
}
if(Infrared==0) //如果红外避障检测到有车
{
rod_ctrl(180); //那么抬起杆子 (控制杆子的舵机接在PB0 角度控制范围为0-180°)
}
else
{
rod_ctrl(90); //否则杆子不抬起
}
adcx = adc_get_result_average(ADC_ADCX_CHY, 10); /* ADCX即为光照强度 范围为0-4095 值越大 代表光照越强 用手指蒙住传感器adcx为50左右
正常情况下为180左右 用手电筒照射,可达到3000多(设定光照阈值时 可供参考)*/
lcd_show_xnum(160, 160, adcx, 5, 16, 0, BLUE); /* 显示ADC采样后的原始值 */
if(adcx>light_yuzhi) //光照强度阈值 我设置为100
window_ctrl(180); //开窗
else
window_ctrl(90); //关窗
dht11_read_data(&temperature, &humidity); /* 读取温湿度值 */
lcd_show_num(30 + 40, 200, temperature, 2, 16, BLUE); /* 显示温度 */
lcd_show_num(30 + 40, 220, humidity, 2, 16, BLUE); /* 显示湿度 */
if(temperature>temp_yuzhi) //如果温度大于阈值
{
INB(1);
INA(0); //开风扇
}
else
{
INB(0);
INA(0); //关风扇
}
if(Fire==0 || Gas==0)
BEEP(1); //开启蜂鸣器
else
BEEP(0);
u3_printf("temp:%d,humi:%d,light:%d\r\n",temperature,humidity,adcx); //向原子云发送数据
}
else
{
LED0(0); //否则 红灯亮
LED1(1);
}
delay_ms(1000);
}
}
五.课题意义
基于STM32单片机的智能家居课题具有以下意义:
-
提升生活品质:智能家居系统可以通过自动化和智能化的方式,优化家居环境,提供更加舒适和便捷的生活体验。例如,通过自动调节照明、温度和湿度等参数,提高室内的舒适度;通过远程控制和智能时间表,实现家电的智能化管理,提供更加方便的生活方式。
-
节能环保:智能家居系统可以通过智能控制和能耗监测,实现能源的有效利用和节约。例如,通过智能照明控制,合理调节灯光亮度和开启时间,降低能耗;利用智能化的能源管理系统,定时监控和控制家电的用电量,提高能源利用效率。
-
安全保障:智能家居系统可以提供更高的安全性和防护性。通过安防监控系统、智能锁、入侵报警等智能设备的联动,实现家居的安全防护功能,提供实时的安全监控和警报系统。
-
开发创新:基于STM32单片机的智能家居课题可以促使开发者深入研究和应用嵌入式系统、物联网以及传感器技术等方面的知识。通过设计和开发智能家居系统,创新出更加智能、高效和可靠的解决方案,推动技术的发展和应用。
-
学习与实践机会:智能家居课题为学生提供了学习和实践的机会。在实际项目中,学生可以通过设计、搭建和调试智能家居系统,提高嵌入式系统开发、网络通信、传感器应用等技能,培养解决问题和创新思维的能力。
综上所述,基于STM32单片机的智能家居课题具有提升生活品质、节能环保、安全保障、开发创新和学习实践的重要意义,对于推动智能家居技术的发展和应用具有积极的推动作用。