本文详细介绍基于STM32F103C8T6的智能家居设计与实现,详细设计资料见文末链接
一、功能模块介绍
智能家居系统系统图如下所示,主要包括温湿度传感器、OLED液晶显示,WIFI物联网模块、人体红外预警模块、烟雾传感器模块、蜂鸣器模块
(1)温湿度传感器
温湿度传感器选用DHT11数字温湿度传感器,它采用专门的数字模块采集技术和温湿度传感技术。该传感器具有响应速度快、抗干扰能力强、适合测量室内温混度,可以将采集到的温度实时转换成输出信号在显示屏上显示
DHT11各引脚说明如下
(1)VCC:电源正,供电3-5.5V
(2)DATA:串行数据,单总线
(3)GND:电源地
DHT11和STM32的接线方式见下表
STM32F103 | DHT11 |
---|---|
3V3 | VCC |
GND | GND |
A0 | IO |
DHT11模块数据转换代码(完整见文末链接)
c
u16 dht11_read_data(u8 buffer[5])
{
u16 i = 0;
u8 checksum;
dht11_reset();//发送起始信号
if (dht11_scan() == RESET)
{
//等待响应信号结束
while (dht11_scan() == RESET);
while (dht11_scan() == SET);
for (i = 0; i < 5; i++)
{
buffer[i] = dht11_read_byte();
}
while (dht11_scan() == RESET);//接收结束,拉高片选
dht11_gpio_output();
DHT11_OUT_H;
checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校验数据
if (checksum != buffer[4])
{
// checksum error
return 1;
}
}
return 0;
}
(2)麦克风传感器模块
本文使用的是高灵敏度的麦克风传感器,其内置一个对声音敏感的电容式驻极体话筒,声波使话筒内的驻极体薄膜振动,导致电容的变化,而产生与之对应变化的微小电压。这一电压随后被转化成0-5V的电压,经过A/D转换被数据采集器接受,并传送给单片机。该模块有4个管脚输出,引脚介绍如下:
(1)VCC:电源正,5V供电
(2)GND:电源地
(3)AO:模拟量输出,实时输出麦克风的电压信号
(4)DO:数字量输出,当声音强度超过某一个阈值后输出高低电平,阈值可通过电位器调节(注意输出高电平也是5V)
此外,除了麦克风传感器外还有声音传感器模块,直接输出开关量,可根据实际情况选择
麦克风传感器和STM32的接线方式见下表
STM32F103 | 麦克风传感器 |
---|---|
5V | VCC |
GND | GND |
A0 | DO |
检测程序如下,仅检测对应管脚的高低电平变化即可
c
if( GPIO_ReadInputDataBit(KEY_PORT,KEY) != RESET)//检测对应管脚接收到的高低电平
(3)烟雾预警模块
烟雾预警选用MQ-2烟雾气体传感器,根据传感器的电导率随空气中可燃气体浓度的增加而增大的特性检测空气中可燃气体,然后将电导率的变化转换成对应的电信号
该模块有4个引脚,:
(1)VCC:电源正,5V供电,电流150mA
(2)GND:电源地
(3)AO:模拟量输出,相对无输出(0.1V-0.3V),高浓度(电压4V左右)
(4)DO:数字量输出,(注意输出高电平也是5V)
注意:传感器通电后需要预热一分钟,稳定后数据才准确,传感器发热是正常现象因为内部有电热丝,如果烫手那就有问题了
MQ-2烟雾传感器和STM32的接线方式同上述的声音传感器一样,选择一个普通的IO口就行,用于读入输入电平信号
(4)红外预警
红外预警模块选用HC-SR501人体红外传感器,人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温,一般在36~37度,所以会发出特定波长的红外线,被动式红外探头就是探测人体发射的红外线而进行工作的
该模块有3个引脚,:
(1)VCC:电源正,4.5V-20V电压,静态电流50uA
(2)GND:电源地
(3)OUT:信号输出,高电平3V3,低电平0V
对应引脚图如下:
人体红外传感器和STM32的接线方式见下表(输出脚接普通GPIO口即可,仅输入信号检测管脚)
STM32F103 | 人体红外传感器 |
---|---|
5V | VCC |
GND | GND |
B14 | OUT |
人体红外传感器初始化函数
c
void INFRARED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO_B
//INFRARED IO 初始化
GPIO_InitStructure.GPIO_Pin = INFRARED ; //发送高点平引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
GPIO_Init(INFRARED_PORT, &GPIO_InitStructure);
GPIO_ResetBits(INFRARED_PORT,INFRARED );
}
人体红外传感器读取数据函数
c
if( GPIO_ReadInputDataBit(INFRARED_PORT,INFRARED) != RESET)
{
PBout(13)=0; //低电平有效
delay_ms(600);
PBout(13)=1; //低电平有效
delay_ms(2000);
}
(5)OLED显示模块
显示模块主要用于显示温湿度数据,本文选用的是0.96寸的OLED屏幕,OLED被称为有机激光二极管,也被称为有机激光显示,OLED采用有机材料涂层和玻璃基板,当有电流通过时有机材料就会发光,所以OLED具有自发光特性,不需要背光源(只上电不会亮的,需要完整的程序驱动),0.96寸OLED其有4pin(IIC接口)和7pin(SPI接口)两种,本文选用的是其中的4pin的OLED
4pin OLED屏幕和STM32的接线方式如下
OLED | STM32F103 |
---|---|
VCC | 3.3V---5V |
GND | GND |
SCL | PB8 |
SDA | PB9 |
OLED部分显示函数如下
c
//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
unsigned char j=0;
while (chr[j]!='\0')
{ OLED_ShowChar(x,y,chr[j],Char_Size);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{
u8 t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
直接
(6)报警模块
报警模块主要使用无源蜂鸣器实现,如下图所示,蜂鸣器分为有源和无源两种,其中无源蜂鸣器其内部无振荡源直接直流电无法驱动它,需要2k-5k的方波;有源蜂鸣器是内部有振荡源直接外供电源即可,本文选用有源蜂鸣器说明
蜂鸣器模块和STM32的接线方式如下
蜂鸣器 | STM32F103 |
---|---|
VCC | 3.3V---5V |
GND | GND |
I/O | PB13 |
蜂鸣器驱动代码比较简单,直接输出高低电平驱动即可驱动
(7)wifi无线传输
WiFi模块选用ESP8266,主要实现将温湿度数值、烟雾报警信息传到物联网平台,同时接收物联网平台返回的数据并进行分析处理
ESP8266这个模块相对设置比较麻烦,可参考下面这篇博客进行配置
https://blog.csdn.net/u011816009/article/details/131014271
二、实物说明
以下视频详细说明智能家居各模块实现过程
基于STM32的智能家居系统
三、附完整资源链接
链接: https://pan.baidu.com/s/1SNdejMYt32UmhOmfXHxt0g?pwd=c6nb
提取码: c6nb
代码打开路径:bigiotSTM32-master\bigiot\Project\STM32F10x_LED\MDK-ARM\Project