一.系统概述

  1. 模块概述​
    集成语音、传感器数据采集、蓝牙三大模块,支持自动 / 手动模式切换,实现室内环境智能与个性化控制。​
  2. 自动模式功能​
    系统启动默认进入自动模式,传感器实时检测温度、光照、烟雾(可燃气体)浓度;触发预设条件(温超阈值、气超标、光照弱)时,自动驱动舵机模拟门窗开合。​
  3. 蓝牙模块控制​
    手机蓝牙连接后,发 “3” 切自动模式,发 “4” 切手动模式。​
  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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐