【Proteus仿真】【STM32单片机】水质监测报警系统设计

news2024/11/24 13:31:45

文章目录

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


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用按键、LED、蜂鸣器、LCD1602、PCF8591 ADC、PH传感器、浑浊度传感器、DS18B20温度传感器、继电器模块等。

主要功能:
系统运行后,LCD1602显示温度、浑浊度、PH浓度值;
可通过按键K3进入阈值设置模式,K3键用于切换选择温度阈值、浑浊度、PH浓度,K1和K2用于调节对应阈值,K4用于确定并返回主界面。
当温度高于上限,温度高指示,打开降温,蜂鸣器报警;
当浑浊高于上限,浑浊度高指示,蜂鸣器报警;
当PH高于上限,PH上限指示,蜂鸣器报警;
当PH低于下限,PH下限指示,蜂鸣器报警;
当PH正常,关闭指示和报警。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[5];
	while(1)
	{
		//正常模式显示
		if(sys_ctrl.mode==0)
		{
			//温度显示
			buf[0]=sys_ctrl.temp/100+0x30;
			buf[1]=sys_ctrl.temp%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temp%100%10+0x30;
			buf[4]='\0';
			lcd1602_show_string(5,0,buf);
			//浑浊度显示
			lcd1602_show_nums(4,1,sys_ctrl.turbid,2,0);
			//PH显示
			buf[0]=sys_ctrl.ph/100+0x30;
			buf[1]=sys_ctrl.ph%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.ph%100%10+0x30;
			buf[4]='\0';
			lcd1602_show_string(12,1,buf);	
		}
		//阈值设置显示
		else
		{
			//PH下限值显示
			buf[0]=sys_ctrl.phl/100+0x30;
			buf[1]=sys_ctrl.phl%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.phl%100%10+0x30;
			buf[4]='\0';
			lcd1602_show_string(3,0,buf);
			//PH上限值显示
			buf[0]=sys_ctrl.phh/100+0x30;
			buf[1]=sys_ctrl.phh%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.phh%100%10+0x30;
			buf[4]='\0';
			lcd1602_show_string(8,0,buf);
			//温度阈值显示
			buf[0]=sys_ctrl.temph/100+0x30;
			buf[1]=sys_ctrl.temph%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temph%100%10+0x30;
			buf[4]='\0';
			lcd1602_show_string(3,1,buf);
			//浑浊度阈值显示
			lcd1602_show_nums(13,1,sys_ctrl.turbidh,2,0);

			//阈值设定,数据位置闪烁
			switch(sys_ctrl.mode)
			{
				case 1://PH下
					lcd1602_show_string(3,0,"    ");
					delay_ms(100);
					buf[0]=sys_ctrl.phl/100+0x30;
					buf[1]=sys_ctrl.phl%100/10+0x30;
					buf[2]='.';
					buf[3]=sys_ctrl.phl%100%10+0x30;
					buf[4]='\0';
					lcd1602_show_string(3,0,buf);
					break;
				case 2://PH上
					lcd1602_show_string(8,0,"    ");
					delay_ms(100);
					buf[0]=sys_ctrl.phh/100+0x30;
					buf[1]=sys_ctrl.phh%100/10+0x30;
					buf[2]='.';
					buf[3]=sys_ctrl.phh%100%10+0x30;
					buf[4]='\0';
					lcd1602_show_string(8,0,buf);
					break;
				case 3://温度
					lcd1602_show_string(3,1,"    ");
					delay_ms(100);
					buf[0]=sys_ctrl.temph/100+0x30;
					buf[1]=sys_ctrl.temph%100/10+0x30;
					buf[2]='.';
					buf[3]=sys_ctrl.temph%100%10+0x30;
					buf[4]='\0';
					lcd1602_show_string(3,1,buf);
					break;
				case 4://浑浊
					lcd1602_show_string(13,1,"  ");
					delay_ms(100);
					lcd1602_show_nums(13,1,sys_ctrl.turbidh,2,0);
					break;	
			}
		}

		break;			
	}
}


//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;
	
	key=KEY_Scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>=5)sys_ctrl.mode=1;
		if(oneflag==0)
		{
			oneflag=1;
			_parm_set_show();//系统参数设置显示
		}
	}
	if(sys_ctrl.mode!=0)
	{
		//在设置模式下,加
		if(key==KEY1_PRESS)
		{	
			switch(sys_ctrl.mode)
			{
				case 1://PH下 
					sys_ctrl.phl++;
					if(sys_ctrl.phl>140)sys_ctrl.phl=0;
					break;
				case 2://PH上 
					sys_ctrl.phh++;
					if(sys_ctrl.phh>140)sys_ctrl.phh=0;
					break;
				case 3://温度 
					sys_ctrl.temph++;
					if(sys_ctrl.temph>999)sys_ctrl.temph=0;
					break;
				case 4://浑浊 
					sys_ctrl.turbidh++;
					if(sys_ctrl.turbidh>99)sys_ctrl.turbidh=0;
					break;
			}				
		}
		//在设置模式下,减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://PH下 
					sys_ctrl.phl--;
					if(sys_ctrl.phl<0)sys_ctrl.phl=140;
					break;
				case 2://PH上 
					sys_ctrl.phh--;
					if(sys_ctrl.phh<0)sys_ctrl.phh=140;
					break;
				case 3://温度 
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=999;
					break;
				case 4://浑浊 
					sys_ctrl.turbidh--;
					if(sys_ctrl.turbidh<0)sys_ctrl.turbidh=99;
					break;
			}
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.mode=0;
			oneflag=0;
			sys_open_show();//系统开机界面显示		
		}	
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//正常工作模式下
	if(sys_ctrl.mode==0)
	{
		//温度高于上限,温度高指示,打开降温,蜂鸣器报警
		if(sys_ctrl.temp>sys_ctrl.temph)
		{
			LED_TPH=0;
			JW_RELAY=0;
			beep_alarm(10,1000);
		}
		else
		{
			LED_TPH=1;
			JW_RELAY=1;
		}
		//浑浊高于上限,浑浊度高指示,蜂鸣器报警
		if(sys_ctrl.turbid>sys_ctrl.turbidh)
		{
			LED_HZH=0;
			beep_alarm(10,1000);	
		}
		else
		{
			LED_HZH=1;
		}
		//PH高于上限,PH上限指示,蜂鸣器报警
		if(sys_ctrl.ph>sys_ctrl.phh)
		{
			LED_PHH=0;
			beep_alarm(10,1000);
		}
		//PH低于下限,PH下限指示,蜂鸣器报警
		else if(sys_ctrl.ph<sys_ctrl.phl)
		{
			LED_PHL=0;
			beep_alarm(10,1000);	
		}
		else
		{
			LED_PHH=1;
			LED_PHL=1;	
		}				
	}	
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车标定技术(七)--基于模型开发如何生成完整的A2L文件(2)

目录 1. 自定义ASAP2文件 2. asap2userlib.tlc需要修改的部分 3. 标定量观测量地址替换 3.1 由elf文件替换 3.2 由map文件替换 3.3 正则表达式&#xff08;含asap2post.m修改方法&#xff09; 4.小结 书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-C…

考研408-计算机网络 第二章-物理层学习笔记及习题

第二章 物理层 一 通信基础 1.1 物理层基本概念 1.1.1 认识物理层 物理层目的&#xff1a;解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是具体的传输媒体。 物理层主要任务&#xff1a;确认与传输媒体接口有关的一些特性&#xff0c;需要进行定义标…

Kafka(消息队列)--简介

1、kafka&#xff1a; 是一个高吞吐的分布式消息系统&#xff0c;与Hdfs比较相似&#xff0c;但是与hdfs的区别是在于hdfs是存储的是历史的、海量的数据&#xff0c;然而kafka存储的是实时的、最新的数据。 2、消息队列&#xff1a; 指的是在Kafka中的数据队列。可以存放数据在…

华为数通方向HCIP-DataCom H12-831题库(多选题:141-160)

第141题 项目实施方案主要包含哪些项? A、风险控制措施 B、人员安排 C、时间规划 D、割接流程 答案:ABCD 解析: 项目实施方案主要包括:时间规划、人员安排、割接流程、风险控制措施。 第142题 以下哪些广域网链路属于报文交换网? A、PSIN B、ISDN C、X.25 D、ATM E、MSTP…

大语言模型(LLM)综述(六):大型语言模型的基准和评估

A Survey of Large Language Models 前言7 CAPACITY AND EVALUATION7.1 基本能力7.1.1 语言生成7.1.2 知识利用7.1.3 复杂推理 7.2 高级能力7.2.1 人类对齐7.2.2 与外部环境的交互7.2.3 工具操作 7.3 基准和评估方法7.3.1 综合评价基准7.3.2 评估方法 7.4 实证评估7.4.1 实验设…

数字化工厂的实施挑战与解决方法

随着科技的快速发展&#xff0c;数字化工厂成为现代制造业的重要趋势之一。数字化工厂通过整合信息技术和制造技术&#xff0c;可以提高生产效率、降低成本、优化资源利用&#xff0c;同时也给企业带来了更多的挑战。 1. 技术挑战 数字化工厂实施过程中最大的挑战之一是技术方…

运动耳机怎么选?精选五款优秀的运动耳机分享

​对于喜欢运动的我来说&#xff0c;不管是在室内健身&#xff0c;还是在户外跑步&#xff0c;我都会边运动边听歌&#xff0c;运动耳机里放着自己喜欢的音乐会很放松。然而&#xff0c;市面上的运动耳机品牌和型号众多&#xff0c;质量参差不齐。今天&#xff0c;我们就为大家…

ZKP8.2 FRI (Univariate) Polynomial Commitment

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 8: FRI-based Polynomial Commitments and Fiat-Shamir (Justin Thaler) 8.2 FRI (Univariate) Polynomial Commitment Recall: Univariate Polynomial Commitments Initial Attempt from Lecture 4 (Merkle Tree) Fixing…

AI智能助理源码系统+智能创作 带完整搭建教程

大家好啊&#xff0c;罗峰今天来给大家介绍一款AI智能助理源码系统。 以下是部分核心功能实现代码模块 系统特色功能一览&#xff1a; 高效便捷&#xff1a;AI智能助理能够帮助用户完成各种任务&#xff0c;无论是写作、论文、代码、小说、创意策划&#xff0c;还是Excel表格…

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

如何利用ChannelPipeline在Netty中搭建无懈可击的数据处理流水线?

在上篇文章&#xff08;Netty 入门 — ChannelHandler&#xff0c; Netty 的数据加工厂&#xff09;提到 ChannelHandler 虽然是一个好的打工人&#xff0c;但是在我们实际业务线中&#xff0c;他不可能一个人干所有的活啊&#xff0c;毕竟都 21 世纪了&#xff0c;我们是要讲究…

通过对多个思维链进行元推理来回答问题11.8

通过对多个思维链进行元推理来回答问题 摘要1 引言2 背景3 方法3.1 生成推理链3.2 对推理链进行元推理 4 实验4.1 实验设置4.1.1 数据集4.1.2 方法 摘要 现代的多跳问题回答&#xff08;QA&#xff09;系统通常将问题分解为一系列推理步骤&#xff0c;称为思维链&#xff08;C…

基于SSM的旅游管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

el-select下拉框默认显示全部选项

这里一直不默认显示全部,但这部分代码是正确的, 经过查询发现: 所以找到了这段: 发现之前role_id和status是 修改成0后就可以默认选中全部选项了

程序设计:控制台输出二叉树 二叉树的形象显示

本文指导你编写一个输出到字符控制台的形象的二叉树展示。 目录 一般的Tree显示方式 理想的显示方式 实现方法 计算显示位置 输出数据 计算显示位置的代码 输出数据的代码 一般的Tree显示方式 编写二叉树算法时调试是很头疼的&#xff0c;如何显示成一目了然的树结构呢…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发003:架构搭建-需求分析及TCP通信方式的实现

文章目录 1 项目总体架构2 项目需求2.1 服务器职责2.2 消息的格式和定义 3 基于Tcp连接的通信方式3.1 通道层实现GameChannel类3.1.1 TcpChannel类3.1.2 Tcp工厂类3.1.3 创建主函数&#xff0c;添加Tcp的监听套接字3.1.4 代码测试 3.2 协议层与消息类3.2.1 消息的定义3.2.2 消息…

算法训练 第六周

一、用栈实现队列 本题要求我们使用栈这个数据结构来模拟实现队列的各种操作&#xff0c;我们的具体思路是使用两个栈&#xff0c;将一个栈当作输入栈&#xff0c;用于压入 push传入的数据&#xff1b;另一个栈当作输出栈&#xff0c;用于 pop和 peek 操作。每次 pop 或 peek 时…

CHOME、EDGE无法打开网页问题处理方法

最近有多位同时反馈CHOME/EDGE无法打开网页&#xff0c;如下提示 右键点CHOME/EDGE图标&#xff0c;在属性-兼容性&#xff0c;勾上以兼容模式运行这个程序&#xff0c;确定即可。

【Verilog 教程】7.4Verilog CIC 滤波器设计

积分梳状滤波器&#xff08;CIC&#xff0c;Cascaded Integrator Comb&#xff09;&#xff0c;一般用于数字下变频&#xff08;DDC&#xff09;和数字上变频&#xff08;DUC&#xff09;系统。CIC 滤波器结构简单&#xff0c;没有乘法器&#xff0c;只有加法器、积分器和寄存器…

方法----JAVA

方法 使用方法提高了代码的复用性 方法的定义和调用 方法概述:JAVA 方法的调用,不调用不执行,就只会在硬盘上待着 带参方法 无参方法 无参方法 调用格式: 方法名(); 方法格式: //最简单的方法格式 public static void 方法名(){ //方法体 } 带参方法 调用格式: 方…