功能:
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; //防止重复检测到按键
}
}