一.系统概述
本次设计的系统设计是以 STIM32 单片机作为核心控制器,可以通过控制温湿度传感器烟雾传感器、火焰传感器对相关环境信息进行采集,并且可以将采集到的烟雾浓度、温湿度值、火焰情况在显示屏上进行显示,可以通过按键对温湿度、烟雾的值进行设定,当温度超过闽值则控制继电器闭合,当湿度超过闯值则控制继电器闭合,当烟雾浓度超过闯值或者有火焰的时候,控制蜂鸣器报警、LED灯亮,同时可以通过控制无线通信模块将采集到的数据信息上传到监控端。
二.仿真概述
1. 进入仿真OLED显示屏端可以显示检测到的温湿度、烟雾浓度以及是否有火焰,另外还会显示参数的设定阈值,连接上就会弹出上位机端的界面,并会显示ready字样。
2. 调节DHT11红色按钮将湿度调节到等于或者超过阈值,并自动开启除湿并通过灯光进行报警。
3. 调节DHT11红色按钮将温度调节到等于或者超过阈值,并自动开启降温并通过灯光进行报警。
4. 调节烟雾传感器的滑动变阻器来调节输入烟雾浓度值,当超过设定阈值就会声光报警提醒。
5. 按下火焰检测开关代表检测到火焰,此时就会声光报警。
6. 按下通信模块按键就会将系统内检测到的数据上传到上位机端并进行实时显示。
三.程序设计
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "DHT11.h"
#include "EXTERN-Key.h"
#include "LED.h"
#include "Serial.h"
#include "MyI2c.h"
#include "Key.h"
DHT11_Data_TypeDef DHT11_Data;
extern uint16_t limittemp,limithumi,limitYW;
uint8_t bian;
uint8_t flag;
uint8_t ad;
uint8_t analog;
int main(void)
{
OLED_Init();
DHT11_GPIO_Config();
Externkey_Init();
LED_Init();
Serial_Init();
MyI2C_Init();
Key_Init();
Tx_Init();
Serial_SendString("ready!");
OLED_ShowString(1, 1, "WD: C");
OLED_ShowString(2, 1, "SD: %");
OLED_ShowString(3, 1, "YW: %");
OLED_ShowString(4, 1, "HY: NO ");
OLED_ShowNum(1, 10, limittemp, 2);
OLED_ShowNum(2, 10, limithumi, 2);
OLED_ShowNum(3, 10, limitYW , 2);
while (1)
{
ad = PCF8591_ADin(0x01);
analog=(int)ad/255.0*250;
if(Read_DHT11(&DHT11_Data) == SUCCESS)
{
if(bian!=0)
{
switch(bian)
{
case 1:
{
OLED_ShowString(1, 10, " ");
Delay_ms(500);
OLED_ShowNum(1, 10, limittemp, 2);
Delay_ms(500);
break;
}
case 2:
{
OLED_ShowString(2, 10, " ");
Delay_ms(500);
OLED_ShowNum(2, 10, limithumi, 2);
Delay_ms(500);
break;
}
case 3:
{
OLED_ShowString(3, 10, " ");
Delay_ms(500);
OLED_ShowNum(3, 10 ,limitYW, 2);
Delay_ms(500);
break;
}
}
}
if(bian == 0)
{
OLED_ShowNum(1, 4, DHT11_Data.temp_int, 2);
OLED_ShowNum(2, 4, DHT11_Data.humi_int, 2);
OLED_ShowNum(3, 4, analog, 3);
OLED_ShowNum(1, 10, limittemp, 2);
OLED_ShowNum(2, 10, limithumi, 2);
OLED_ShowNum(3, 10, limitYW , 2);
if(DHT11_Data.temp_int>=limittemp)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
if( DHT11_Data.humi_int>=limithumi)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
else
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
{
OLED_ShowString(4, 1, "HY: yes");
GPIO_SetBits(GPIOA, GPIO_Pin_8);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == 0)
Serial_SendString("警告!有火焰!\r\n");
}
else
{
OLED_ShowString(4, 1, "HY: NO ");
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == 0)
Serial_SendString("无火焰!\r\n");
}
if(analog>=limitYW)
GPIO_SetBits(GPIOA, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0||analog>=limitYW)
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
else
GPIO_SetBits(GPIOA, GPIO_Pin_6);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == 0)
{
Serial_SendString("温度:");
Serial_SendNumber(DHT11_Data.temp_int,2);
Serial_SendString("C");
Serial_SendString("\r\n");
Serial_SendString("湿度:");
Serial_SendNumber(DHT11_Data.humi_int,2);
Serial_SendString("%");
Serial_SendString("\r\n");
Serial_SendString("烟雾浓度:");
Serial_SendNumber(analog,3);
Serial_SendString("%");
Serial_SendString("\r\n");
}
}
}
}
}