本设计的硬件构成:
本设计由STM32单片机核心板+光敏感应电+OLED显示屏电路+DHT11温湿度传感器+继电器电路+散热风扇驱动电路+蜂鸣器电路+蓝牙模块电路+按键电路+电源电路组成。
功能介绍:
1、采用OLED12864显示屏作为显示屏,用于显示当前温度、湿度、及光照强度;显示各个参数的设定值;
2、光照强度使用光敏电阻对环境光进行感应;温度、湿度采用DHT11数字温度传感器对环境温度、湿度进行采集。
3、光照强度有上限值和下限值,当环境光强超出设定值时,蜂鸣器导通报警;如在设定值以内,蜂鸣器关闭;用户可通过按键对光照强度的上限值和下限值进行调整。
4、当温度和湿度均有上限值和下限值;散热风扇用于对温度或湿度进行调节;当温度或者湿度高于设定的上限值时,散热风扇电路导通,风扇工作,加热继电器关闭,蜂鸣器导通报警;
5、当温度或者湿度低于设定的下限值时,加热继电器开启,加热丝工作,风扇关闭,蜂鸣器导通报警;
6、当温度和湿度均在上下限值以内,散热风扇、加热继电器、蜂鸣器均关闭不工作;
7、设有三个按键,按键1为设置键,按键按下进入设置状态;按键2为在设置状态下的加一键(非设置状态下无效);按键3为在设置状态下的减一键(非设置状态下无效);
8、系统的蓝牙模块可实现与手机APP的连接;连接后,手机可实时获取系统的状态
主要物料清单及型号:
显示屏:OLED-0.96寸;
单片机:STM32F103C8T6;
温湿度传感器:DHT11;
蜂鸣器:5V有源蜂鸣器;
热敏电阻:5512;
继电器:SRD-05VDC;
蓝牙模块:HC-05/06;
部分程序源码:
int main(void)
{
u8 key=0;
u8 buffer[5],i=10;
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
KEY_Init(); //初始化按键
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
DHT11_Init();
LED_Init();
Adc_Init();
delay_ms(200);
TIM3_Int_Init(49,7199);//50ms
OLED_Clear();
OLED_ShowString(0,0," ",16);
OLED_ShowChinese(32,0,12,16);//温湿度
OLED_ShowChinese(48,0,13,16);//温湿度
OLED_ShowChinese(64,0,14,16);//温湿度
OLED_ShowChinese(80,0,15,16);//温湿度
OLED_ShowString(96,0," ",16);
OLED_ShowChinese(0,16,16,16);//温湿度
OLED_ShowChinese(16,16,17,16);
OLED_ShowString(32,16,": 00.0",16);
OLED_ShowChinese(80,16,21,16);
OLED_ShowChinese(0,32,18,16);//温湿度
OLED_ShowChinese(16,32,17,16);
OLED_ShowString(32,32,": 00.0%",16);
OLED_ShowChinese(0,48,19,16);//温湿度
OLED_ShowChinese(16,48,20,16);
OLED_ShowString(32,48,": 0000Lux",16);
OLED_Refresh();
buzzer=0;
delay_ms(500);
buzzer=1;
while(1)
{
key=KEY_Scan(0);
key_handle(key);
if(disFlag==1) //显示标志
{
disFlag = 0;
DHT11_Read_Data(&temp,&humi);//
light=Get_Adc_Average(9,10);
if(light>350)
light=(light-350)*1.1;
else
light=0;
if((temp>settemp)||(humi>sethumi))
{
buzzer=0;
fan=0;
heat=1;
}
else if((temp<settemp2)||(humi<sethumi2))
{
buzzer=0;
fan=1;
heat=0;
}
else if((light>setlight))
{
buzzer=0;
}
else if((light<setlight2))
{
buzzer=0;
}
else
{
buzzer=1;
fan=1;
heat=1;
}
if(set==0)
Display_State();
}
if(appFlag==1)
{
appFlag=0;
printf("当前温度: ");
SendData(temp/10+0x30);
SendData(temp%10+0x30);
printf(".0℃\r\n");
printf("当前湿度: ");
SendData(humi/10+0x30);
SendData(humi%10+0x30);
printf(".0 % \r\n");
printf("当前光强: ");
SendData(light/1000+0x30);
SendData(light%1000/100+0x30);
SendData(light%100/10+0x30);
SendData(light%10+0x30);
printf("Lux\r\n");
printf("\r\n");
printf("温度上限: ");
SendData(settemp/10+0x30);
SendData(settemp%10+0x30);
printf("℃\r\n");
printf("湿度上限: ");
SendData(sethumi/10+0x30);
SendData(sethumi%10+0x30);
printf("% \r\n");
printf("光强上限: ");
SendData(setlight/1000+0x30);
SendData(setlight%1000/100+0x30);
SendData(setlight%100/10+0x30);
SendData(setlight%10+0x30);
printf("Lux\r\n");
printf("\r\n");
printf("温度下限: ");
SendData(settemp2/10+0x30);
SendData(settemp2%10+0x30);
printf("℃\r\n");
printf("湿度下限: ");
SendData(sethumi2/10+0x30);
SendData(sethumi2%10+0x30);
printf("% \r\n");
printf("光强下限: ");
SendData(setlight2/1000+0x30);
SendData(setlight2%1000/100+0x30);
SendData(setlight2%100/10+0x30);
SendData(setlight2%10+0x30);
printf("Lux\r\n");
printf("\r\n");
}
}
}