基于STM32的水库预警系统的Proteus仿真

文章目录

  • 一、水库预警系统
    • 1.题目要求
    • 2.思路
      • 2.1 OLED显示汉字
      • 2.2 水质传感器等等
      • 2.3 步进电机
      • 2.4 驱动水泵
    • 3.仿真图
      • 3.1 未仿真时
      • 3.2 开始仿真,OLED开始显示
      • 3.3 提高水位,开启阀门和预警
      • 3.4 通过按键增大水位阈值,取消报警
    • 4.仿真程序
      • 4.1 程序说明
      • 4.2 主函数
      • 4.3 OLED显示函数
  • 二、总结


一、水库预警系统

1.题目要求

基于STM32F103C8单片机做一个水库预警系统,有以下传感器:步进电机(代表阀门的开关),雨量传感器 ,水流速传感器 ,压力传感器(测水压),风速传感器(测风速)等等,OLED显示屏显示传感器的内容,显示水位水质这些。蜂鸣器高水位报警,电机阀门水位高的时候打开,低水位不报警,水位设定值从0mm到1000mm。蜂鸣器响的时候灯亮,水泵在仿真运行之后开始运行就行。

2.思路

2.1 OLED显示汉字

OLED要显示中文,这需要用到取模软件,如下所示:

在这里插入图片描述

参数设置如下:
在这里插入图片描述

2.2 水质传感器等等

Proteus仿真里面没有这些传感器,统一用滑动变阻器来模拟,再通过STM32的ADC去采集,如果是采用的51单片机,内部没有集成ADC,可以通过PCF8591这种ADAC模块进行采集。

在这里插入图片描述

2.3 步进电机

这里采用ULN2003来驱动步进电机。

这里简单介绍下ULN2003驱动芯片。

ULN2003是一个单片高电压(最高可达50V)、高电流(单个额定输出500mA)的达林顿晶体管阵列集成电路。 它是由7对NPN达林顿晶体管组成的,它的高电压输出特性和阴极钳位二极管可以转换感应负载。单个达林顿晶体管对的集电极电流为500mA,达林顿管并联可以承受更大的电流。

ULN2003可以作为继电器驱动器,字锤驱动器、灯驱动器、显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。ULN2003的每一对达林顿晶体管的基极都有一个2.7k的串联电阻,可以直接和TTL或者5V的CMOS装置连接。它实际上就是一个功率放大器,输出端具有较大的驱动能力(电流较大)。

在这里插入图片描述

2.4 驱动水泵

水泵的驱动则是NPN驱动继电器的电路,当PUMP为低电平时,继电器不闭合,水泵不工作,当PUMP为高电平时,继电器闭合,水泵工作。

在这里插入图片描述

3.仿真图

3.1 未仿真时

在这里插入图片描述

3.2 开始仿真,OLED开始显示

由于OLED显示的界面有限,所以这里做了两个界面进行切换,仿真开启,水泵也开始工作,用于模拟水库。

界面1显示:水位,水质,水位阈值

在这里插入图片描述
界面2显示:雨量,流速,水压,风速

在这里插入图片描述

3.3 提高水位,开启阀门和预警

在这里插入图片描述

3.4 通过按键增大水位阈值,取消报警

在这里插入图片描述

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms
串口(Uart1):9600(PA9:tx1,PA10:rx1)

OLED显示屏:SCL(PB10),SDA(PB11)、

LED模块:LED(PA7)

水位模块:ADC1(PA0)
水质模块:ADC2(PA1)
雨量传感器:ADC3(PA2)
水流速传感器:ADC4(PA3)
压力模块:ADC5(PA4)
风速模块:ADC6(PA5)

水泵:PUMP(PB2)

KEY按键:
KEY1(PB0)
KEY2(PB1)

MOTOR电机:
IN1(PB4)
IN2(PB5)
IN3(PB6)
IN4(PB7)

4.2 主函数

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"

/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	UserSystemInit();//用户配置初始化		
	while (1)
	{					
		if (stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms
		{
			stSysTime.flg._10ms = Time_millis();
      Key_Scan();//按键扫描		
      Warning_function();//预警函数					
		}
		if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms
		{
			stSysTime.flg._50ms = Time_millis();
      ADC_Scan();	//ADC扫描				
			OLED_Handel();//OLED显示			
		}
		if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
		{
			stSysTime.flg._100ms = Time_millis();	
			Receive_data_Handel();//数据接收判断		
			IWDG_ReloadCounter();//清开门狗 
		}
  }
}

4.3 OLED显示函数

/*******************************************************************************
 * 函数名:OLED_Handel
 * 描述  :OLED显示
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :100ms
*******************************************************************************/
void OLED_Handel(void)
{  	
		if(ADC_Flag)
		{		
			if(Interface_switching == 0)
			{
					OLED_Show_Character(1,1,0,16);//水
					OLED_Show_Character(1,2,1,16);//质	
					OLED_Show_Character(1,3,13,16);//:	
				
					OLED_ShowNum(1,8,ADC2_Value,4);										
					OLED_ShowString(1, 13, "kg/s");					

					OLED_Show_Character(2,1,0,16);//水
					OLED_Show_Character(2,2,2,16);//位	
					OLED_Show_Character(2,3,13,16);//:		
				
					OLED_ShowNum(2,8,ADC1_Value,4);					
					OLED_ShowString(2, 13, "mm");						

					OLED_Show_Character(3,1,11,16);//阈
					OLED_Show_Character(3,2,12,16);//值	
					OLED_Show_Character(3,3,13,16);//:		

					OLED_ShowNum(3,8,ADC1_Threshold,4);					
					OLED_ShowString(3, 13, "mm");						
				
					if(++switching_count > 2)
					{
							OLED_Clear();							
							switching_count = 0;
							Interface_switching = 1;				
					}					
			}	
			else if(Interface_switching == 1)		
			{
					OLED_Show_Character(1,1,3,16);//雨
					OLED_Show_Character(1,2,4,16);//量	
					OLED_Show_Character(1,3,13,16);//:	
				
					OLED_ShowNum(1,8,ADC3_Value,4);		
					OLED_ShowString(1, 13, "mm");					

					OLED_Show_Character(2,1,6,16);//流
					OLED_Show_Character(2,2,7,16);//速	
					OLED_Show_Character(2,3,13,16);//:	

					OLED_ShowNum(2,8,ADC4_Value,4);						
  			  	    OLED_ShowString(2, 13, "m/s");	

					OLED_Show_Character(3,1,0,16);//水
					OLED_Show_Character(3,2,8,16);//压	
					OLED_Show_Character(3,3,13,16);//:
				
					OLED_ShowNum(3,8,ADC5_Value,4);						
  				    OLED_ShowString(3, 13, "Pa");					

					OLED_Show_Character(4,1,10,16);//风
					OLED_Show_Character(4,2,7,16);//速	
					OLED_Show_Character(4,3,13,16);//:	

					OLED_ShowNum(4,8,ADC6_Value,4);						
  				    OLED_ShowString(4, 13, "m/s");	
				
					if(++switching_count > 2)
					{
							OLED_Clear();							
							switching_count = 0;
							Interface_switching = 0;				
					}							
			}
		}			
}


二、总结

今天主要讲了基于STM32的水库预警系统的Proteus仿真。

感谢你的观看!

在这里插入图片描述

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

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

相关文章

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点&#xff1a;使用场景&#xff1a; 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点&#xff1a;使用场景&#xff1a; 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…

前端表单校验完成之后,点击确认功能无反应FormInstance, FormRules

**产生原因&#xff1a;可能是在el-form 中添加的ref 前面加了“&#xff1a;”&#xff0c;也可能是ref中的值写错了** FormInstance, FormRules

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

装饰器,状态管理和if判断(HarmonyOS学习第六课)

Builder装饰器-自定义构建函数 前面介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使方法进行数据传递。ArkUI还提供了一种更轻量的UI 元素复用机制Builder&#xff0c;Builder 所装饰的函数遵循build( )函数语法规则&#xff0c;开发者可以将重…

网页安全登陆的设计思路

对于Web网站来讲,不管是企业内容信息化系统,还是公共站点(博客、音视频站等),都有需要用户注册和登录的功能。用以识别用户、信息交互、信息隔离以及商业行为等场景。用户数据已成为网站的重要资产。保护用户信息(数据)是网站安全运行的关键任务。本文以用户安全登录的场…

AI产品导航站

1、AI产品导航站 (chat2ai.cn)

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程 下图展示了自然语言处理&#xff08;NLP&#xff09;领域内使用的深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程的简化图。 在神经网络的NLP领域&#xff1a; 语料…

mybatis异常:Invalid bound statement (not found): com.lm.mapper.ArticleMapper.list

现象&#xff1a; 原因&#xff1a; 无效绑定&#xff0c;应该是mybatis最常见的一个异常了&#xff0c;接口与XML文件没绑定。首先&#xff0c;mapper接口并没有实现类&#xff0c;所以框架会通过JDK动态代理代理模式获取接口的代理实现类&#xff0c;进而根据接口全限定类名…

高清矩阵是什么?

在数学中&#xff0c;矩阵是一个按照长方阵列排列的复数或实数集合&#xff0c;最早来自于方程组的系数及常数所构成的方阵。如图为m行n列的矩阵&#xff1a; 由此延伸可以想到矩阵图片是把一个三维空间分切成多个行和列的区域进行图像捕获&#xff0c;将捕获图像再进行拼合成为…

C51学习归纳1 --- led点亮、led闪烁、led流水灯

第一节主要是针对LED的控制学习。这个过程中我们需要掌握的&#xff1a;1、控制的实现方法&#xff0c;控制实现的方法在后续的学习中是通用的。2、如何知道谁控制谁&#xff0c;通过查找开发板原理图获取&#xff0c;原理图的阅读的能力&#xff0c;在日后也是非常常用的。 一…

PySide6在VScode中提示:vscode module not found error: no module named ‘pyside6‘解决方案

最近在B站学习PySide6&#xff1a;PySide6百炼成真&#xff0c;带你系统性入门Qt https://www.bilibili.com/video/BV1c84y1N7iL?p3&vd_source256724e7f8bba144c62a17f9fa758a04 学习到第3节&#xff1a;003基础框架 003基础框架 from PySide6.QtWidgets import QApplicat…

小白也能看得懂的基于HTML+CSS+JS实现的五子棋小游戏

五子棋是一种起源于中国的传统棋类游戏&#xff0c;具有悠久的历史。 基本规则 棋盘&#xff1a; 五子棋通常在一个 15x15 的棋盘上进行&#xff0c;但也可以在更大的棋盘上进行。棋盘上的每个交叉点称为一个“点”。 棋子&#xff1a; 五子棋使用黑白两色的棋子。两名玩家分别…

44-3 waf绕过 - WAF绕过方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后在安装pikachu靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客一、首先验证云WAF是否存在于靶场(老师的靶场是部署在阿里云) 靶场地址:http://127.0.0.1/pikachu-master/v…

追寻美的指引--纪念西蒙斯

周六早上醒来&#xff0c;James Simons&#xff08;西蒙斯&#xff09;辞世的消息刷屏了。多数人知道他&#xff0c;是因为他的财富和量化对冲基金公司-文艺复兴。但他更值得为人纪念的身份&#xff0c;则是数学家和慈善家。 西蒙斯1938年生于麻省&#xff0c;毕业于MIT&#…

1.JAVA小项目(零钱通)

一、说明 博客内容&#xff1a;B站韩顺平老师的视频&#xff0c;以及代码的整理。此项目分为两个版本&#xff1a; 面向过程思路实现面向对象思路实现 韩老师视频地址&#xff1a;【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…

Java大文件上传、分片上传、多文件上传、断点续传、上传文件minio、分片上传minio等解决方案

一、上传说明 文件上传花样百出&#xff0c;根据不同场景使用不同方案进行实现尤为必要。通常开发过程中&#xff0c;文件较小&#xff0c;直接将文件转化为字节流上传到服务器&#xff0c;但是文件较大时&#xff0c;用普通的方法上传&#xff0c;显然效果不是很好&#xff0c…

nginx的配置粗记

小白nginx的配置随笔&#xff08;随便记记&#xff09; 前言 我们都知道nginx有很多用途&#xff0c;比如&#xff1a;负载均衡&#xff0c;反向代理&#xff0c;网关路由&#xff0c;解决跨域等问题。我这次开发项目&#xff0c;用到的一些功能也涉及到了对nginx的配置&#…

Spark介绍及RDD操作

Spark介绍及RDD操作 PySpark简介spark特点运行原理spark实例化 SparkCore-RDDRDD创建转换&#xff08;Transformation&#xff09;行动&#xff08;Action&#xff09; PySpark简介 spark特点 运行速度快&#xff1a;DAG内存运算容易使用&#xff1a;Java、Scala、Python、R通…

Kubernetes——YAML文件编写

目录 一、创建Kubernetes对象YAML文件必备字段 1.apiVersion 2.kind 3.metadata 4.spec 二、YAML格式基本规范 1.结构表示 2.键值对 3.列表&#xff08;数组&#xff09; 4.字典&#xff08;映射&#xff09; 5.数据类型 6.注释 7.多文档支持 8.复杂结构 9.示例 …

快速排序与归并排序(非递归)

目录 快速排序&#xff08;双指针法&#xff09; 原理 代码 快速排序&#xff08;非递归&#xff09; 原理 代码 归并排序 介绍 优点 缺点 图片 原理 代码 归并排序&#xff08;非递归&#xff09; 代码 快速排序&#xff08;双指针法&#xff09; 快速排序的精…