基于STM32单片机的智能水表水流量计原理图PCB

2023-05-16

功能:
0.本系统采用STM32F103C8T6作为单片机
1.该系统采用LCD1602液晶显示各种参数,包括瞬时流量速度,已经总流量,同时可通过按键设置最大阈值,一旦流量超过该值将启动报警
2.报警电路采用的是蜂鸣器和LED组成的声光报警系统
3.系统具有三个功能按键,同时具备蓝牙功能,可以与手机通信传输当前的流量信息
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.系统具备一路继电器来驱动水泵,水泵可通过软管与流量传感器相接,从而实现流量的检测

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include "bsp_lcd1602.h"
#include "exti.h"

#define ON 0
#define OFF 1

char dis0[18]; //显示暂存数组

unsigned long plu = 0; //脉冲计数
float shunShiVal = 0;  //瞬时流量mL/s
float leiJiVal = 0;	   //累计流量mL
float leiJiValMax = 1000; //累计最大流量mL

unsigned char dealLiuliang = 0; //流量处理
unsigned char sendDelay = 0; //流量处理

unsigned char i;

unsigned char relayFlag1 = 1; //继电器标志1
unsigned char relayFlag2 = 1; //继电器标志2

void CheckKey(void);

int main(void)
{
	NVIC_Configuration();
	UART_Init(9600);		  //串口初始化为9600
	TIM3_Int_Init(50000-1, 72-1); // 50ms

	LED_Init(); //初始化与LED连接的硬件接口
	KEY_Init();
	EXTIX_Init(); //外部中断初始化

	LCD_GPIO_Init();
	LCD_Init();
    LCD_Clear();
	LCD_DispStr(4,0,"Welcome!");
	DelayMs(200);
	DelayMs(200);
	DelayMs(200);
	DelayMs(200);
	while (1)
	{
		CheckKey();		  //按键处理
		if (disFlag == 1) //显示
		{
			disFlag = 0;

			dealLiuliang++;		   //处理数据
			if (dealLiuliang >= 5) //计数500ms
			{
				dealLiuliang = 0;							//定时发送数据清空
				shunShiVal = (float)plu * 2 * 1000 / 43 / 60;		//计算瞬时流量 500ms一次 *2表示1s的量 mL/s // f = (43*Q) Q=L/min
				leiJiVal = leiJiVal + shunShiVal; //累计计算累计流量
				plu = 0;									//清空周期计数
			}

			sprintf(dis0, "S:%3.1fL/m L:%4.1fL", shunShiVal*60/1000, leiJiVal/1000);  //打印瞬时流量L/min和累计流量L
			LCD_DispStr(0, 0, dis0); //显示

			sendDelay++;
			if (sendDelay > 50) //5s
			{
				sendDelay = 0;
				sprintf(dis0, "S:%3.1fL/m L:%4.1fL\r\n", shunShiVal*60/1000, leiJiVal/1000);  //打印瞬时流量L/min和累计流量L
				UART_SendStr(USART1, dis0, 18); //串口发送
			}

			sprintf(dis0, "LJ MAX:%4.1fL", leiJiValMax/1000); //打印累计水流量阈值
			LCD_DispStr(0, 1, dis0); //显示

			if (relayFlag2 == 1) //蓝牙控制继电器启动标志
			{
				if (leiJiVal > leiJiValMax) //累计流量超过最大值
				{
					relayFlag1 = 0;
					BUZZER = ON; //蜂鸣器打开
				}
				else
				{
					relayFlag1 = 1;
					BUZZER = OFF; //蜂鸣器关闭
				}
			
				if (relayFlag1 == 1)
				{
					RELAY = ON; //进水控制继电器启动
				}
				else
				{
					RELAY = OFF; //进水控制继电器关闭
				}
			}
			else
			{
				RELAY = OFF; //进水控制继电器关闭
                BUZZER = OFF; //蜂鸣器关闭
			}
			
		}
	}
}

void CheckKey(void)
{
	static unsigned char rekey = 0;
	if ((KEY1 == 0) || (KEY2 == 0) || (KEY3 == 0)) //检测到按键按下
	{
		DelayMs(10); //小抖动
		if (rekey == 0)
		{
			if (KEY1 == 0) //清空键
			{
				rekey = 1;
				leiJiVal = 0;
			}
			else if (KEY2 == 0) //+键
			{
				rekey = 1;
				leiJiValMax = leiJiValMax + 100;
				if (leiJiValMax > 10000) //大于10L
				{
					leiJiValMax = 1000;
				}
			}
			else if (KEY3 == 0) //-键
			{
				rekey = 1;
				leiJiValMax = leiJiValMax - 100;
				if (leiJiValMax < 1000) //小于10L
				{
					leiJiValMax = 10000;
				}
			}
		}
	}
	else
	{
		rekey = 0; //防止重复检测到按键
	}
}

实物演示视频:
https://www.bilibili.com/video/BV1oe41157KM/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32单片机的智能水表水流量计原理图PCB 的相关文章

随机推荐

  • TypeScript:类的继承

    类可以继承 继承可以说是对父类抽象的一次细化 通常基类 父类 用于描述更一般 更通用的属性及方法 继承类 子类 则用来描述更具体 更特别的属性及方法 并且继承类可以重写基类的方法以完成对方法的重新定义 class Phone owner s
  • C++(11):noexcept

    noexcept 用于描述函数不会抛出异常 xff0c 一旦有异常抛出 xff0c 会立刻终止程序 xff0c 它可以阻止异常的传播与扩散 noexcept可以带一个 常量表达式 作为参数 xff0c 常量表达式为true xff0c 表示
  • C++(11):bind

    bind函数可以将既有函数的参数绑定起来 从而生成一个函数对象 include lt iostream gt include lt functional gt using namespace std void func1 int d cou
  • Linux编程:time/gettimeofday获取时间戳

    时间戳 指格林威治时间从1970年1月1日 00 00 00 GMT 至当前时间的总秒数 需要注意的是 时间戳跟时区没有关系 不论在哪个时区 时间戳是一个值 linux下获得时间戳常用的的方式有两个 1 通过time函数 include l
  • Ubuntu(20.04):安装VNC

    1 首先安装tightvncserver nbsp sudo apt install tightvncserver 2 安装gnome panel 否则vnc后的画面是纯灰色 sudo apt nbsp install gnome pane
  • nlohmann json:struct与json的互转

    nlohmann json可以很方便的实现struct与json的互转 对于化定义结构体成员时有就地初始的情况 include lt iostream gt include lt string gt include lt nlohmann
  • C++(11):mem_fn,将类的成员函数转换为函数对象

    C 43 43 11 提供了mem fn xff0c 类似于std function xff0c 用于将类的成员函数转换为函数对象 xff1a include lt functional gt include lt iostream gt
  • C++(20):span防止数组越界

    C C 43 43 一直都有数组越界这个陷阱 xff0c 越界后容易造成数据不一致 xff0c 程序运行状态混乱 xff0c coredump C 43 43 20提供了span容器 xff0c 他用于表示一段连续的内存空间 xff0c 并
  • gcc:升级编译器版本

    Ubuntu 22 04 下升级gcc和g 的方法 1 添加工具链 sudo add apt repository ppa ubuntu toolchain r test nbsp 2 更新apt软件列表 sudo apt update 3
  • JAVA: String转JsonArray

    String str 61 34 34 JsonArray jsonArray 61 new JsonParser parse str getAsJsonArray JsonObject jsonObject 61 jsonArray ge
  • CPU性能天梯图

    查看更多榜单 gt gt 查看桌面CPU性能榜 二代酷睿三代酷睿四代酷睿五六代酷睿七代酷睿八代酷睿九代酷睿十代酷睿三代锐龙二代锐龙一代锐龙八代APU七代APU旧APU推土机 打桩机弈龙 速龙 线程撕裂者3990X 线程撕裂者3970X 线程
  • Ubuntu必备开发工具安装

    1 安装gcc g 43 43 gdb make 等基本编程工具 sudo apt get install build essential 2 安装常见开发工具 sudo apt get install autoconf automake
  • apt与apt-get区别

    apt包含了apt get apt cache apt config xff0c 属于包含与被包含关系 apt与apt get命令区别如下 xff1a
  • Java super关键字:super调用父类的构造方法、利用super访问父类成员

    由于子类不能继承父类的构造方法 xff0c 因此 xff0c 要调用父类的构造方法 xff0c 必须在子类的构造方法体的第一行使用 super 方法 该方法会调用父类相应的构造方法来完成子类对象的初始化工作 在以下情况下需要使用 super
  • 如何将ova转成vmdk文件

    ova是一个压缩文件 xff0c 使用7zip打开ova文件可以看到 xff0c 里面有三个文件组成 xff1a ovf 是一个XML描述符 xff0c 定义了虚拟机的元数据信息 xff0c 如名称 硬件要求 xff0c 并且包含了OVF文
  • 基于51单片机的温室大棚土壤湿度检测智能语音灌溉通风系统proteus仿真原理图PCB

    功能介绍 xff1a 0 本系统采用STC89C52作为单片机 1 系统实时监测当前的土壤湿度和空气温湿度 xff0c 并上传WIFI 2 支持手动 自动两种模式 3 自动模式下 xff0c 当温湿度超过阈值上限时 xff0c 打开通风机
  • 基于51单片机的自动窗户控制系统风速测量proteus仿真原理图PCB

    功能介绍 xff1a 0 本系统采用STC89C52作为单片机 1 系统实时监测当前的雨滴 温湿度 风速 xff0c 烟雾浓度 2 支持手动 自动两种模式 3 自动模式下 窗户关闭状态下 xff0c 当烟雾浓度超过阈值 xff0c 打开窗户
  • 基于51单片机的智能路灯控制系统proteus仿真原理图PCB

    功能 xff1a 0 本系统采用STC89C52作为单片机 1 LCD1602液晶实时显示当前时间 环境光强 工作模式 2 支持路灯故障检测 3 工作时间内 17 24时 xff0c 两个路灯同时点亮 xff0c 24时以后 xff0c B
  • 基于51单片机的温度控制系统数码管显示蜂鸣器报警proteus仿真原理图PCB

    功能 xff1a 0 本系统采用STC89C52作为单片机 1 系统实时监测并显示当前温度 xff0c 并通过四位数码管显示 2 超过设定阈值 xff0c 蜂鸣器将报警 xff0c 同时控制相应继电器实现降温或者加热 3 系统具备三个功能按
  • 基于STM32单片机的智能水表水流量计原理图PCB

    功能 xff1a 0 本系统采用STM32F103C8T6作为单片机 1 该系统采用LCD1602液晶显示各种参数 xff0c 包括瞬时流量速度 xff0c 已经总流量 xff0c 同时可通过按键设置最大阈值 xff0c 一旦流量超过该值将