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

功能:
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/

作者:极寒钛科技

物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32单片机的智能水表水流量计原理图与PCB设计

发表评论