硬件开发_基于STM32单片机的智能窗户系统
该文介绍了一套基于STM32的智能环境控制系统,通过集成传感器、语音和蓝牙模块实现室内环境监测与自动化调控。系统具备自动/手动双模式:自动模式下通过温湿度、光照和烟雾传感器触发门窗控制;手动模式下支持语音指令("开/关")和蓝牙指令(数字键1/2/3/4)操作。硬件采用STM32F103C8T6主控,搭配DS18B20温度传感器、光敏电阻、MQ-2烟雾传感器等模块,软件实现了传
一.系统概述
- 模块概述
集成语音、传感器数据采集、蓝牙三大模块,支持自动 / 手动模式切换,实现室内环境智能与个性化控制。 - 自动模式功能
系统启动默认进入自动模式,传感器实时检测温度、光照、烟雾(可燃气体)浓度;触发预设条件(温超阈值、气超标、光照弱)时,自动驱动舵机模拟门窗开合。 - 蓝牙模块控制
手机蓝牙连接后,发 “3” 切自动模式,发 “4” 切手动模式。 - 手动模式功能
语音控制:说 “开”/“关”,语音模块控制门窗对应动作;
蓝牙控制:手机发 “1” 开、“2” 关,控制门窗动作。

二.电路设计
电路图设计(Altium Designer)
主控核心:STM32F103C8T6 单片机,最小系统电路为核心;
温度检测:DS18B20,通过单总线与单片机通信;
光强检测:光敏电阻模块,模拟端接单片机模拟输入端;
烟雾检测:MQ-2,模拟输出脚接单片机模拟输入脚;
数据显示:0.96 寸 OLED12864,以 IIC 总线与单片机通信;
语音识别:LU-ASR01 模块,通过 UART 串口与单片机通信;
数据上传:ESP8266-01S,经 UART 串口将数据传至上位机;
窗户控制:舵机,控制线接单片机 GPIO 口。

三.程序设计
void qianjian(void)
{
u16 count=0;
while(count<=15)
{
ULN2003_GPIOA_Contol_Moto_Foreward(2);
count++;
}
}
void houtui(void)
{
u16 count=0;
while(count<=15)
{
ULN2003_GPIOA_Contol_Moto_Reversal(2);
count++;
}
}
/************************************
OLED显示屏
************************************/
void OLED_Display_Cotrol(void) //系统显示控制功能实现 OLED显示
{
static u8 timeCount = 0;
static char pl[16]=“”;
static u8 c = 0;
static float smo;
static u16 light = 0;
static u8 flag = 0;//自动
static u8 flags = 0;//窗帘
static u8 flagsss = 0;//语音
static u8 temperature,humidity;
u8 key_choice=0;
char p1[16]=" ";
static u16 key_value[8] = {30,50,50,1000}; //0 年 1月 2日 3 时 4分 5秒 6药品a 7药品b
u16 count=0;
light = Get_adc_light();
Get_Adc_Convert_mq_so2(&smo);
sprintf((char*)p1,":%d ",(int)light);
OLED_ShowStr(32,2,p1,2);
sprintf((char*)p1,":%d ",(int)smo);
OLED_ShowStr(32,4,p1,2);
DHT11_Read_Data(&temperature,&humidity);
sprintf((char*)p1,":%d ",(int)temperature);
OLED_ShowStr(32,0,p1,2);
sprintf((char*)p1,":%d ",(int)humidity);
OLED_ShowStr(96,0,p1,2);
key_choice = KEY_Scan(0);
if(key_choice==1)
{
c++;
if(c==4)
{
c=0;
}
}
else if(key_choice==2)
{
key_value[c]++;
}
else if(key_choice==3)
{
key_value[c]--;
}
if(c==0)
OLED_ShowCN(48,6,4);
else if(c==1)
OLED_ShowCN(48,6,6);
else if(c==2)
OLED_ShowCN(48,6,8);
else if(c==3)
OLED_ShowCN(48,6,18);
sprintf((char*)pl,"%d ",key_value[c]);
OLED_ShowStr(80,6,pl,2);
OLED_ShowStr(0,6,"SET:",2);
if(flag==0)//自动模式
{
OLED_ShowCN(80,2,16);
OLED_ShowCN(96,2,17);
if(temperature<key_value[0]||humidity<key_value[1])
Relay_0=0;
else
Relay_0=1;
if(smo>key_value[3])
Relay_1=0;
else
Relay_1=1;
if(light>50&&flags==0)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Foreward(2);
count++;
}
flags=1;
count=0;
}
else if(light<50&&flags==1)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Reversal(2);
count++;
}
flags=0;
count=0;
}
}
else if(flag == 1)//手动模式
{
OLED_ShowCN(80,2,14);
OLED_ShowCN(96,2,15);
ASR01_Uart1_HandleD(&flagsss);
if(flags==0&&flagsss==1)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Foreward(2);
count++;
}
flags=1;
count=0;
flagsss=0;
}
else if(flags==1&&flagsss==2)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Reversal(2);
count++;
}
flags=0;
count=0;
flagsss=0;
}
}
timeCount++;
if(timeCount==3){send_datas(&temperature,&humidity);}
else if(timeCount==5){send_datass(&light,&smo);}
else if(timeCount==8){send_datasss(&key_value[0],&key_value[1]);}
else if(timeCount==10){timeCount=0;send_datassss(&key_value[2],&key_value[3]);}
if (Serial_GetRxFlag() == 1)
{
if(CommBuff[0]==0xA5)
{
if(CommBuff[1]==0xFF&&CommBuff[2]==0xFF)
flag = 1;
else if(CommBuff[1]==0xEE&&CommBuff[2]==0xEE)
flag = 0;
if(flag == 1)
{
if(CommBuff[1]==0xAA&&CommBuff[2]==0xAA)
{
key_value[0]++;
}
else if(CommBuff[1]==0xBB&&CommBuff[2]==0xBB)
{
key_value[0]--;
}
else if(CommBuff[1]==0xCC&&CommBuff[2]==0xCC)
{
key_value[1]++;
}
else if(CommBuff[1]==0xDD&&CommBuff[2]==0xDD)
{
key_value[1]--;
}
else if(CommBuff[1]==0x11&&CommBuff[2]==0x11&&flags==0)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Foreward(2);
count++;
}
flags=1;
count=0;
}
else if(CommBuff[1]==0x22&&CommBuff[2]==0x22&&flags==1)
{
while(count<=1000)
{
ULN2003_GPIOA_Contol_Moto_Reversal(2);
count++;
}
flags=0;
count=0;
}
memset(CommBuff,0,BUFFER_SIZE);
}
}
}
}
四.资料内容

24-32-88
更多推荐



所有评论(0)