基于STC8G1K08A的水压检测系统
- 前言
- 先来一饱眼福
- 设计和硬件的选型
- 压力传感器选择
- 单片机的选择
- WIFI透传模块选择
- 核心代码的开发
- STC8G1K08A单片机代码
- 读取水压传感器的电压
- 计算对应电压水的压力值
- 猪场水压正常、漏水、喝光水提醒功能的实现
- 数据通过ESP8266上报到云端
- 代码的实现
- 微信实时推送
- APP的开发
前言
由于今年天气持续干旱,给养猪行业带来了很大的用水压力,尤其是对于管理1600头猪的饲养员的我来说,最担心的就是猪没水喝,毕竟这群猪一天就可以喝掉20吨水,这也就是我设计这个项目的初衷。
先来一饱眼福
这是手机APP上显示的样子,用的是appinventor编写的
设计和硬件的选型
我大致的设计想法是利用STC单片机通过检测水压传感器电压的高低来确定水压的高低,再通过单片机的串口将数据发送给ESP8266,最后通过8266的WIFI透传功能将数据上传物联网服务器,最终用appinventor编写定制的APP来实时显示水塔的剩余水量水压值。
压力传感器选择
要实现水压的监测,必须有一个压力传感器,这里我选的是恒压供水传感器,其中原因之一因为它的电压信号范围是0.5-4.5V,刚好是单片机可以监测的范围
单片机的选择
这里之所以选择STC8G1K08A,原因之一STC8G1K08A集成了超高速ADC,支持10位精度15通道(通道0~通道14)的模数转换 ,另外一个原因就是这款单片机内部集成了晶振电路,只要接上5V电源就能工作。
WIFI透传模块选择
将数据上传到手机APP我选择如今流行的ESP8266,这个模块使用方便快捷,体积小
直接选这种带继电器的这种,5V的供电刚好跟单片机的工作电压相同,8266也不用另外加5V转3.3V的直流模块。
核心代码的开发
代码的开发我选择单片机开发软件KeiluVision以及ESP8266撸代码工具ArduionIDE
STC8G1K08A单片机主要负责接收水压传感器的电压信号,转换之后通过串口传送给ESP8266。
物联网模块8266再将数据上传到巴法云平台。
STC8G1K08A单片机代码
读取水压传感器的电压
Pre_Min = Pre_ADC[1]; //以下为10个adc数据中选取最小值
for(i=1; i<10; i++)
{
if(Pre_ADC[i] < Pre_Min)
{
temp = Pre_Min;
Pre_Min = Pre_ADC[i];
Pre_ADC[i] = temp;
}
}
sum = 0; //以下为10个adc数据取平均
for(i=2; i<10; i++)
{
sum = sum + Pre_ADC[i];
}
sum >>= 3;
计算对应电压水的压力值
//Vwater = ((unsigned long)sum * 5000) / 1024;//以实测电源电压返算水头电压 注意计算中存在超类型长度的可能性
Vwater = ((unsigned long)sum * (unsigned long)vcc) / 1024;
Vtemp = Vwater - 500; //扣除基础水头电压
Hwater = (Vtemp*5/2);//1MPA=10公斤/cm2,10000g共4000mv,每mv=10000/4000=2.5
//实测电压*2.5(x*5/2)
猪场水压正常、漏水、喝光水提醒功能的实现
正常水塔满水的情况下,水压数值在300以上,漏水或者水喝到一半之后,就要推送水压情况
设置水压数值210以下,如果在一分钟之内,有超过15个小于210的数值,则串口推送“A”,表示漏水,不到15个低于210的数值推送“B”,表示正常。实测管道水压为0的时候,数值为大于30000,所以当检测到数值为30000以上,串口推送“C”,表示水喝光。
if(Hwater<=210){N++;}
if(sec==60)
{
sec=0;
flag=0;
if(N>=15)
{
N=0;
UartSend('A');
}
else
{
UartSend('B'); N=0;
}
if(Hwater>30000){flag=0;UartSend('C');N=0;}
数据通过ESP8266上报到云端
我这里选择的是巴法云物联平台,它可以采集8266上传的数据并实时显示出来
代码的实现
串口接收到的数值转换为字符
String Read_Serial(){
String data = "";
while (Serial.available() > 0)
{
digitalWrite(led,!digitalRead(led));
data += char (Serial.read());//ASCII转字符
//data=(Serial.read());//ASCII转十进制
delay(2);
flag=1;
}
return data;
}
处理漏水,喝光水的微信提醒
void Serial_Handler(String data)
{
if(flag==1)
{
if(data=="A"){loushui();};
if(data=="C"){heguang();};
if((data=="C")&&((digitalRead(tuisong))==0)){Blynk.email("369818468@qq.com", "主人,猪已把水喝光光");};
flag=0;
String upstr = "";
upstr = "cmd=2&uid="+UID+"&topic="+TOPIC+"&msg=#"+data+"#"+123+"#\r\n";
sendtoTCPServer(upstr);
upstr = "";
Serial.print(data);
delay(2000);
}
微信实时推送
漏水
喝光水
APP的开发
我用的是appinventor
最终实现了文章开头的显示内容
过程虽辛苦,但是折腾使我快乐,哈哈
单片机的PCB也是自己设计,请忽略杂乱的线
水压传感器