当前位置: 首页 > news >正文

【Proteus仿真】【Arduino单片机】水箱液位监控系统

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶、按键、蜂鸣器、液位传感器、ADC转换器、水泵等。

主要功能:
系统运行后,LCD1602显示当前水位、上下限阈值和工作模式,系统默认处于自动模式。
若检测水位高于上限,声光报警,开启抽水。若检测水位低于下限,声光报警,开启加水。
可操作K4键切换为手动模式,然后通过K1/K2键开启加水和开启抽水。再次按下K4键回到自动模式。
若要修改上下限阈值,可通过K3键进入上下限设置,光标定位修改的值,K1和K2进行加减。
还可通过串口助手进行参数修改和模式切换,指令(十六进制)如下:
加–>01
减–>02
模式–>03
确定/自手动–>04


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)*///系统数据获取
void sys_data_get(void)
{u8 ad_value=0;float vol=0;while(1){//读取压力AD值ad_value=pcf8591_read_adcvalue(0);//计算电压vol=(float)ad_value*5.0/256;//计算液位高度VO=K*H+∮=0.038*H+1.105(V)	//H单位cmsys_ctrl.level=(vol-1.105)/0.038;if(sys_ctrl.level<=0)sys_ctrl.level=0;break;}
}//系统数据显示
void sys_data_show(void)
{while(1){//显示当前液位lcd1602_show_nums(5,0,sys_ctrl.level,3,0);//液位阈值显示lcd1602_show_nums(2,1,sys_ctrl.levell,3,0);lcd1602_show_nums(11,1,sys_ctrl.levelh,3,0);//自动手动模式显示if(sys_ctrl.auto_flag==1)lcd1602_show_string(12,0,"Manl");else lcd1602_show_string(12,0,"Auto");//阈值设置位置闪烁switch(sys_ctrl.mode){case 1://液位下限lcd1602_show_string(2,1,"   ");delay_ms(100);lcd1602_show_nums(2,1,sys_ctrl.levell,3,0);break;case 2://液位上限lcd1602_show_string(11,1,"   ");delay_ms(100);lcd1602_show_nums(11,1,sys_ctrl.levelh,3,0);break;}break;			}
}//系统数据设置
void sys_data_set(void)
{u8 key=0;key=KEY_Scan(0);//模式设置if(key==KEY3_PRESS || USART1_RX_BUF[0]==MODE_CMD){USART1_RX_BUF[0]=0;//自动模式下,模式设置if(sys_ctrl.auto_flag==0){sys_ctrl.mode++;if(sys_ctrl.mode>2)sys_ctrl.mode=1;}//手动模式下,停止开关else{MOTOR_JS=1;MOTOR_CS=1;	}}//在设置模式下,加else if(key==KEY1_PRESS || USART1_RX_BUF[0]==ADD_CMD){USART1_RX_BUF[0]=0;switch(sys_ctrl.mode){case 1://液位下限 sys_ctrl.levell++;if(sys_ctrl.levell>100)sys_ctrl.levell=0;break;case 2://液位上限 sys_ctrl.levelh++;if(sys_ctrl.levelh>100)sys_ctrl.levelh=0;break;}//手动模式,加水控制if(sys_ctrl.auto_flag==1){MOTOR_JS=0;MOTOR_CS=1;}}//在设置模式下,减else if(key==KEY2_PRESS || USART1_RX_BUF[0]==MIN_CMD){USART1_RX_BUF[0]=0;switch(sys_ctrl.mode){case 1://液位下限 sys_ctrl.levell--;if(sys_ctrl.levell<0)sys_ctrl.levell=100;break;case 2://液位上限 sys_ctrl.levelh--;if(sys_ctrl.levelh<0)sys_ctrl.levelh=100;break;}//手动模式,抽水控制if(sys_ctrl.auto_flag==1){MOTOR_JS=1;MOTOR_CS=0;	}}//确定/自手动else if(key==KEY4_PRESS || USART1_RX_BUF[0]==SWITCH_CMD) {USART1_RX_BUF[0]=0;if(sys_ctrl.mode!=0)//确定sys_ctrl.mode=0;else//自动/手动切换{sys_ctrl.auto_flag=!sys_ctrl.auto_flag;//自动模式下,关闭加水/抽水if(sys_ctrl.auto_flag==0){MOTOR_JS=1;MOTOR_CS=1;	}		}		}
}//系统功能控制
void sys_fun_ctrl(void)
{//正常模式if(sys_ctrl.mode==0){//自动模式下控制if(sys_ctrl.auto_flag==0){//如果液位高于上限,声光报警,开启抽水if(sys_ctrl.level>sys_ctrl.levelh){MOTOR_JS=1;MOTOR_CS=0;beep_alarm(100,20);}//如果液位低于下限,声光报警,开启加水else if(sys_ctrl.level<sys_ctrl.levell){MOTOR_JS=0;MOTOR_CS=1;beep_alarm(100,20);}//正常液位,关闭加水抽水else{MOTOR_JS=1;MOTOR_CS=1;}}}	
}//应用控制系统
void appdemo_show(void)
{sys_parm_init();//系统参数初始化KEY_Init();BEEP_Init();ctrl_pin_init();USART1_Init(9600);printf("USART1 Init OK...\r\n");pcf8591_init();lcd1602_init();//LCD1602初始化sys_open_show();//系统开机界面显示while(1){sys_data_get();//系统数据获取sys_data_show();//系统数据显示sys_data_set();//系统数据设置sys_fun_ctrl();//系统功能控制		}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

http://www.lryc.cn/news/273554.html

相关文章:

  • 【已解决】若依系统前端打包后,部署在nginx上,点击菜单错误:@/views/system/role/index
  • Java中compareTo方法使用
  • 【霹雳吧啦】手把手带你入门语义分割の番外11:U2-Net 源码讲解(PyTorch)—— 代码的使用
  • 威尔仕2023年的统计数据
  • Spring——Spring基于注解的IOC配置
  • spring常用注解(一)springbean生命周期类
  • 【软件测试】2024年准备中/高级测试岗技术面试...
  • 第11课 实现桌面与摄像头叠加
  • SAP 检验批状态修改(QA32质检放行报错:BS002 不允许 “访问使用决定“ (INL 101105415 ))
  • 华为交换机如何同时配置多个端口参数
  • Mybatis之多表查询
  • 部署node.js+express+mongodb(更新中)
  • 百度CTO王海峰:文心一言用户规模破1亿
  • 简单最短路径算法
  • 答案解析——C语言—第3次作业—算术操作符与关系操作符
  • 【数据结构】二叉树的链式实现
  • 八、QLayout 用户基本资料修改(Qt5 GUI系列)
  • tomcat、java、maven
  • IDEA好用插件
  • 面试官:CSS3新增了哪些新特性?
  • Vite5 + Vue3 + Element Plus 前端框架搭建
  • STM32 内部 EEPROM 读写
  • androidStudio sync failed GradlePropertiesModel (V2)
  • 结构方程模型(SEM)
  • 基于UDP的网络编程
  • vue判断组件有没有传入的slot有就渲染slot没有就渲染内部节点
  • MS713/MS713T:CMOS 低压、4Ω四路单刀单掷开关,替代ADG713
  • Android 内容生成pdf文件
  • Javaweb-日程管理
  • SwiftUI之深入解析如何创建一个灵活的选择器