【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单位cm
		sys_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设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正交投影矩阵与透视投影矩阵的推导

正交投影矩阵 正交投影矩阵的视锥体是一个长方体 [ l , r ] [ b , t ] [ f , n ] [l,r][b,t][f,n] [l,r][b,t][f,n]&#xff0c;我们要把这个长方体转换到一个正方体 [ − 1 , 1 ] [ − 1 , 1 ] [ − 1 , 1 ] [-1,1][-1,1][-1,1] [−1,1][−1,1][−1,1]中&#xff0c;如下图所…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

C++结合OpenCV:图像的基本表示方法

1.二值图像 二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中&#xff0c;通过一个栅格状排列的数据集&#xff08;矩阵&#xff09;来表示和处理图像。例如&#xff0c;图1是一个字母A的图像&#xff0c;计算机在处理该图像时&#xff0c;会首先将其划分为一个个的小…

Mysql show Profiles详解

1.简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况&#xff0c;包括CPU的使用&#xff0c;CPU上下文切换&#xff0c;IO等待&#xff0c;内存使用等&#xff0c;这个命令对于分析某个SQL的性能瓶颈非常有帮助&#xff0c;借助于show profile的输出信息&…

jenkins+selenium+python实现web自动化测试

jenkinsselenium可以做到对web自动化的持续集成。 Jenkins的基本操作&#xff1a; 一、新建视图及job 新建视图&#xff1a; 新建job&#xff1a; 可以选择构建一个自由风格的软件项目或者复制已有的item 二、准备工作&#xff1a; 安装Jenkins插件&#xff0c;SSH plugin …

快速入门Visual Studio 2022开发.Net Framework研发环境指南

IDE工具 Visual Studio 2022 Vs2022企业版 - VisualStudioSetup.exe Visual Studio Code VSCodeUserSetup-x64-1.66.2.exeVSCodeUserSetup-x64-1.67.0-insider.exe IDE环境 编程字体YaHei.Consolas YaHei.Consolas.1.12.ttf IDE插件 Visual Studio Code常用插件 Chinese…

分布式锁3: zk实现分布式锁4 使用临时顺序节点+watch监听+可重入(threadLocal)

一 zk实现分布式锁的可重入性 1.1 使用ThreadLocal属性 引入ThreadLocal线程局部变量保证zk分布式锁的可重入性。 1.2 关键代码说明 1.3 代码 1.3.1 初始化客户端 1.3.2 分布式锁代码 package com.atguigu.distributed.lock.config;import com.baomidou.mybatisplus.core…

Java:Lambda表达式、方法引用

文章目录 1、Lambda表达式1.1 Lambda表达式体验1.2 Lambda表达式的省略形式1.3 Lambda表达式练习 2、方法引用体验3、方法引用符4、引用静态方法5、引用对象的实例方法6、引用类的实例方法7、引用构造方法8、引用数组的构造方法9、方法引用练习9.1 练习19.2 练习29.3 练习3 10、…

差分电路原理以及为什么输出电压要偏移

我们在使用放大器芯片的时候&#xff0c;除了对放大器芯片本身应用外&#xff0c;通常还需要搭建一些外围电路来满足放大器芯片的使用条件&#xff0c;最终满足应用的功能&#xff0c;下面通过一个差分电路来熟悉这些应用。 差分运算放大电路&#xff0c;对共模信号得到有效抑…

函数——系统函数2(c++)

这次主要就只有一个系统函数&#xff1a; &#xff08;注&#xff1a;a为变量名&#xff09; 名称 用法 用处 sqrt sqrt(a) 算出变量a的平方根 &#xff08;注&#xff1a;使用sqrt函数时&#xff0c;需要用到头文件 #i…

leetcode算法题之递归--综合练习(一)

此专题对我们之前所学的关于递归的内容进行一个整合&#xff0c;大家可以自行练习&#xff0c;提升自己的编码能力。 本章目录 1.找出所有子集的异或总和在求和2.全排列II3.电话号码的字母组合4.括号生成5.组合6.目标和7.组合总和8.字母大小写全排列9.优美的排列 1.找出所有子…

Python自动点击器

一、如何制作一个Python自动点击器&#xff1f; 当用户单击开始键时&#xff0c;代码将从键盘获取输入&#xff0c;并在用户单击退出键时终止自动点击器&#xff0c;自动点击器开始单击指针放置在屏幕上的任何位置。我们将在这里使用pynput模块。 二、什么是自动点击器&#…

FineBI实战(1):mysql实战案例简介

下面我通过案例来介绍FineBI的使用。 1 业务背景介绍 本案例围绕某个互联网小型电商的订单业务来开发。某电商公司&#xff0c;每天都有一些的用户会在线上采购商品&#xff0c;该电商公司想通过数据分析&#xff0c;查看每一天的电商经营情况。例如&#xff1a;电商公司的运…

并发(2)

目录 6.通常线程有哪几种使用方式&#xff1f; 7.基础线程机制有哪些&#xff1f; 8.线程的中断方式有哪些&#xff1f; 9.线程的互斥同步方式有哪些&#xff1f;如何比较和选择&#xff1f; 10.Synchronized可以作用在哪里&#xff1f; 6.通常线程有哪几种使用方式&#x…

Python基础知识总结3-面向对象进阶知识

面向对象三大特征介绍 继承子类扩展父类语法格式关于构造函数&#xff1a;类成员的继承和重写查看类的继承层次结构 object根类dir() 查看对象属性重写 __str__() 方法 多重继承MRO方法解析顺序super()获得父类定义多态特殊方法和运算符重载特殊属性 对象的浅拷贝和深拷贝组合_…

【提示学习论文五】Conditional Prompt Learning for Vision-Language Models论文原理及复现工作

Conditional Prompt Learning for Vision-Language Models 视觉语言模型的条件提示学习 文章介绍 这篇文章于2022年发表在CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;&#xff0c;作者是kaiyang.zhou, jingkang001, ccloy, ziwei.li…

PostgreSQL的常见错误和解决方法

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在学习新的东西时&#xff0c;会犯很多的错误&#xff0c;会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…

【QT】自定义代理类

目录 1 我们为什么要使用自定义代理类&#xff1f; 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类&#xff1f; 传统的模型-视图框架可以让我们实现逻辑展示相分离&#xff0c;我们…

trino-435:dynamic catalog数据库存储代码实现

一、dynamic catalog数据库存储源码分析 dynamic catalog的实现主要涉及到两个类&#xff1a;CoordinatorDynamicCatalogManager、WorkerDynamicCatalogManager&#xff0c;这两个类的详细信息如下&#xff1a; 这两个类主要提供了对catalog的增删改查的方法。trino-435源码中…

C++补充内容--EasyX-UI界面

esay x 其他 地图打印(利用二维数组) 双缓冲 当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题 开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可…