文章目录
一、功能简介
本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶显示模块、WIFI模块、蜂鸣器、LED按键、ADC、角度/可燃气检测传感器等。
主要功能:
系统运行后,LCD1602显示井盖切斜角和阈值、可燃气浓度和阈值、井盖和可燃气状态;如果井盖正常,WIFI传输井盖角度、可燃气浓度及状态信息到终端;如果井盖正常,可燃气超限,蜂鸣器报警,指示灯亮,同时WIFI传输报警信息到终端;如果井盖未断裂和丢失,井盖倾斜角大于阈值,蜂鸣器报警,同时WIFI传输报警信息;如果井盖断裂或丢失,蜂鸣器报警,报警指示灯亮,WIFI传输报警信息;可通过按键K1和K2修改井盖角度阈值,K3和K4键修改可燃气浓度阈值;
二、软件设计
/*
作者:嗨小易(QQ技术交流群:570487280)
*/
//系统数据显示
void sys_data_show(void)
{
while(1)
{
//角度显示
lcd1602_show_nums(3,0,sys_ctrl.angle,3,0);
//燃气浓度显示
lcd1602_show_nums(3,1,sys_ctrl.gas,2,0);
//角度阈值显示
lcd1602_show_nums(8,0,sys_ctrl.angleh,3,0);
//燃气浓度阈值显示
lcd1602_show_nums(7,1,sys_ctrl.gash,2,0);
//井盖状态显示
if(sys_ctrl.sta==0)lcd1602_show_string(14,0,"OK");
else if(sys_ctrl.sta==1)lcd1602_show_string(14,0,"DL");
else if(sys_ctrl.sta==2)lcd1602_show_string(14,0,"DS");
//燃气状态显示
if(sys_ctrl.gassta==0)lcd1602_show_string(12,1," ");
else lcd1602_show_string(12,1,"Gash");
break;
}
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=key_scan(0);
//角度+
if(key==KEY1_PRESS)
{
sys_ctrl.angleh++;
if(sys_ctrl.angleh>180)sys_ctrl.angleh=0;
}
//角度-
else if(key==KEY2_PRESS)
{
sys_ctrl.angleh--;
if(sys_ctrl.angleh<0)sys_ctrl.angleh=180;
}
//燃气+
else if(key==KEY3_PRESS)
{
sys_ctrl.gash++;
if(sys_ctrl.gash>99)sys_ctrl.gash=0;
}
//燃气-
else if(key==KEY4_PRESS)
{
sys_ctrl.gash--;
if(sys_ctrl.gash<0)sys_ctrl.gash=99;
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
static u8 cnt[3];
u8 buf[4];
//如果井盖正常
if(sys_ctrl.sta==0)
{
//如果井盖角度倾斜高于阈值和可燃气超限,报警
if(sys_ctrl.angle>sys_ctrl.angleh || sys_ctrl.gassta==1)
beep_alarm(1,1000);
//如果井盖角度倾斜高于阈值,报警
if(sys_ctrl.angle>sys_ctrl.angleh)
{
cnt[0]++;
if(cnt[0]%SPEED==0)
{
UART_SendString("\r\n井盖倾斜\r\n");
}
}
else
{
LED_DL=1;LED_DS=1;
cnt[0]++;
if(cnt[0]%SPEED==0)
{
UART_SendString("\r\n井盖OK\r\n");
}
}
//如果可燃气超限
if(sys_ctrl.gas>sys_ctrl.gash)sys_ctrl.gassta=1;
else sys_ctrl.gassta=0;
if(sys_ctrl.gassta==1)
{
LED_KRQ=0;
cnt[1]++;
if(cnt[1]%SPEED==0)
{
UART_SendString("\r\n可燃气超限...\r\n");
}
}
//如果天然气正常
else
{
LED_KRQ=1;
cnt[1]++;
if(cnt[1]%SPEED==0)
{
UART_SendString("\r\n可燃气OK\r\n");
}
}
//WIFI传输数据,角度、可燃气
cnt[2]++;
if(cnt[2]%SPEED==0)
{
UART_SendString("\r\n井盖角度:");
buf[0]=sys_ctrl.angle/100+0x30;
buf[1]=sys_ctrl.angle%100/10+0x30;
buf[2]=sys_ctrl.angle%100%10+0x30;
buf[3]='\0';
UART_SendString(buf);
UART_SendString("\r\n");
UART_SendString("可燃气浓度:");
buf[0]=sys_ctrl.gas/10+0x30;
buf[1]=sys_ctrl.gas%10+0x30;
buf[2]='\0';
UART_SendString(buf);
UART_SendString("\r\n");
}
}
//如果井盖不正常正常,断裂或丢失
else
{
beep_alarm(1,1000);
//如果井盖断裂,指示灯报警
if(sys_ctrl.sta==1)
{
LED_DL=0;LED_DS=1;
cnt[0]++;
if(cnt[0]%SPEED==0)
{
UART_SendString("\r\n井盖断裂...\r\n");
}
}
//如果井盖丢失,指示灯报警
if(sys_ctrl.sta==2)
{
LED_DL=1;LED_DS=0;
cnt[0]++;
if(cnt[0]%SPEED==0)
{
UART_SendString("\r\n井盖丢失...\r\n");
}
}
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。