一、主要功能
1、压力液位检测
2、阈值设定,超限报警
3、压力液位显示
4、补排水自动控制
二、硬件资源
1、51单片机核心模块
2、PCF8591 AD/DA模块
3、LCD1602液晶模块
4、蜂鸣器模块
5、排水、补水控制电路
6、按键模块
三、软件设计
#include "appdemo.h"
#include "lcd1602.h"
#include "key.h"
#include "beep.h"
#include "pcf8591.h"
#include "exti.h"
//定义补水控制脚
sbit MOTOR_BS=P1^0;
//定义排水控制脚
sbit MOTOR_PS=P1^1;
//定义结构体
_sys_ctrl sys_ctrl;
//阈值设定
void key_set_threshold(void)
{
u8 key=0;
key=key_scan(0);
//模式设定显示
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>=3)sys_ctrl.mode=1;
lcd1602_clear();
switch(sys_ctrl.mode)
{
case 1://液位上限设置显示界面
lcd1602_show_string(0,0,"LevelH Set:");
break;
case 2://液位下限设置显示界面
lcd1602_show_string(0,0,"LevelL Set:");
break;
default :
lcd1602_show_string(0,0,"Display Error");
break;
}
}
//确定,返回主界面
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
lcd1602_clear();
lcd1602_show_string(0,0," Current Level ");
lcd1602_show_string(0,1," mm");
}
//液位上限设置
if(sys_ctrl.mode==1)
{
if(key==KEY1_PRESS)//加
{
sys_ctrl.levelh+=THRESHOLD_STEP;
if(sys_ctrl.levelh>MAX_VALUE)sys_ctrl.levelh=0;
}
else if(key==KEY2_PRESS)//减
{
sys_ctrl.levelh-=THRESHOLD_STEP;
if(sys_ctrl.levelh<0)sys_ctrl.levelh=MAX_VALUE;
}
lcd1602_show_nums(0,1,sys_ctrl.levelh,4,0);
}
//液位下限设置
else if(sys_ctrl.mode==2)
{
if(key==KEY1_PRESS)//加
{
sys_ctrl.levell+=THRESHOLD_STEP;
if(sys_ctrl.levell>MAX_VALUE)sys_ctrl.levell=0;
}
else if(key==KEY2_PRESS)//减
{
sys_ctrl.levell-=THRESHOLD_STEP;
if(sys_ctrl.levell<0)sys_ctrl.levell=MAX_VALUE;
}
lcd1602_show_nums(0,1,sys_ctrl.levell,4,0);
}
}
//参数初始化
void sys_para_init(void)
{
sys_ctrl.mode=0;
sys_ctrl.levelh=80;
sys_ctrl.levell=20;
}
//数据采集
void sys_get_data(void)
{
u8 i=0;
u8 ad_value=0;
float vol=0;
while(sys_ctrl.mode==0)
{
i++;
if(i%200==0)
{
//读取压力AD值
ad_value=pcf8591_read_adcvalue(0);
//计算电压
vol=(float)ad_value*5.0/256;
//计算液位高度VO=K*H+∮=0.038*H+1.105(V) //H单位mm
sys_ctrl.level=(vol-1.105)/0.038;
if(sys_ctrl.level<=0)sys_ctrl.level=0;
break;
}
delay_ms(1);
}
}
//采集数据显示
void sys_data_show(void)
{
while(sys_ctrl.mode==0)
{
lcd1602_show_nums(0,1,sys_ctrl.level,4,0);
break;
}
}
//液位自动控制
void auto_control(void)
{
while(sys_ctrl.mode==0)
{
//上限阈值,排水开启,补水关闭,蜂鸣器报警
if(sys_ctrl.level>sys_ctrl.levelh)
{
MOTOR_PS=0;
MOTOR_BS=1;
beep_alarm(100,20);
}
//下限阈值,排水关闭,补水开启,蜂鸣器报警
else if(sys_ctrl.level<sys_ctrl.levell)
{
MOTOR_PS=1;
MOTOR_BS=0;
beep_alarm(100,20);
}
//正常液位,排水关闭,补水关闭
else
{
MOTOR_PS=1;
MOTOR_BS=1;
}
break;
}
}
//智能温湿度大棚控制系统
void appdemo_show(void)
{
lcd1602_init();
//初始界面
lcd1602_show_string(0,0," Current Level ");
lcd1602_show_string(0,1," mm");
sys_para_init();//系统参数初始化
sys_get_data();
while(1)
{
key_set_threshold();//阈值设定
sys_get_data();//数据采集
sys_data_show();//采集数据显示
auto_control();//温湿度自动控制
}
}
四、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。