功能:
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;
float leiJiVal = 0;
float leiJiValMax = 1000;
unsigned char dealLiuliang = 0;
unsigned char sendDelay = 0;
unsigned char i;
unsigned char relayFlag1 = 1;
unsigned char relayFlag2 = 1;
void CheckKey(void);
int main(void)
{
NVIC_Configuration();
UART_Init(9600);
TIM3_Int_Init(50000-1, 72-1);
LED_Init();
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)
{
dealLiuliang = 0;
shunShiVal = (float)plu * 2 * 1000 / 43 / 60;
leiJiVal = leiJiVal + shunShiVal;
plu = 0;
}
sprintf(dis0, "S:%3.1fL/m L:%4.1fL", shunShiVal*60/1000, leiJiVal/1000);
LCD_DispStr(0, 0, dis0);
sendDelay++;
if (sendDelay > 50)
{
sendDelay = 0;
sprintf(dis0, "S:%3.1fL/m L:%4.1fL\r\n", shunShiVal*60/1000, leiJiVal/1000);
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)
{
leiJiValMax = 1000;
}
}
else if (KEY3 == 0)
{
rekey = 1;
leiJiValMax = leiJiValMax - 100;
if (leiJiValMax < 1000)
{
leiJiValMax = 10000;
}
}
}
}
else
{
rekey = 0;
}
}
实物演示视频:
https://www.bilibili.com/video/BV1oe41157KM/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)