项目介绍
一、 项目需求
1.水资源保护与管理的需求
随着工业化和城市化的快速发展,水资源的污染问题日益严重,对水质进行实时监测和 管理变得尤为重要。水质检测与水位控制器项目的实施,旨在提高水质监测的效率和准确性,为水资源保护和管理提供科学依据。
2.技术进步的推动
近年来,传感器技术、物联网技术、大数据分析等先进技术的快速发展,为水质检测和 水位控制提供了强有力的技术支持。这些技术的应用,使得水质检测更加精准,水位控制更加智能化。
3.市场需求与政策导向
国家和地方政府对水资源保护和管理的重视程度不断提高,出台了一系列相关政策法规,要求加强水质监测和水位控制。同时,随着人们生活水平的提高,对水质安全和水资源有效利用的需求也日益增长。
二、设计方案
本方案底层有节点和网关 2 部分组成。
节点板采用 STM32F103C8T6 芯片作为主控芯片,节点和网关通过 Lora 进行组网和远 距离传输,其中lora通信距离在三千米左右。网关主控芯片采用 STM32F103RET6 芯片,搭载了 oled 显示屏,实现界面的设计、实时传感器数据的显示以及设备运行状态的显示,并可以通过电能检测模块监控电机的过载 情况。同时网关搭载有人 CAT-1 4G 联网模组,通过 Modbus 协议把数据传输给有人云物 联网平台,并通过有人云物联网平台,实现监控大屏的显示和报警信息的推送。
三、相关技术点
- 采集水箱内的水质传感器的水质和水温,功率等参数 。
- 检测到没水之后,可以通过电机进行上水,并可以调节电磁阀的大小,并通过电能检测 模块检测电机的负载情况(空载保护和过载保护)。
- 局域网 Lora 通信,该系统包含网关和节点板组成,节点板和网关通过 Lora 进行组网, 把传感器的数据传输给网关 。
- 网关使用 oled 显示屏,实现数据的显示,并可以通过按键对系统的参数(温度,水质, 功率)阈值进行设置。
- 广域网 4G 通信,网关通过 4G 模组,把数据传输给有人云物联网平台,同时实现 web 监控大屏显示和手机报警信息推送。
四、预计效果
1.开机后自动设置LORA通信模块的工作方式及其地址和信道,并且4G模块自动连接有人云。
2.节点板通过tds传感器将采集的数据通过LORA模块发送给主控板。
3.主控板采集的数据和节点板采集的数据通过oled屏显示出来。
4.将采集到的数据通过4G模块传送至有人云。
5.判断水位是否过低或已满,若过满则打开电机进行上水,若水满则关闭电机停止上水。
设备开发
一、TDS模块
DS水质传感器是我公司研制的一款高精度产品,用于测量水的TDS值,TDS数值可反应水的洁净程度,可用于生活用水、水培等领域的水质检测。
TDS (Total Dissolved Solids), 中文名:总溶解固体,又称溶解性固体总量,表明1升水中溶有多少毫克溶解性固体。一般来说,TDS值越高,表示水中含有的溶解物越多,水就越不洁净。因此,TDS值的大小,可作为反映水的洁净程度的依据之一。
引脚定义
tds内部原理图
本项目采用串口三进行收发数据,在中断中收发。
实物图
通信基本参数:
主动发送格式如下:
数据计算模式
TDS1计算:TDS1_H256+TDS1_L(ppm)
TDS2计算:TDS2_H256+TDS2_L(ppm)
例如:
发送:FF 00 64 00 0A 2A 0A AA
TDS1表示=TDS1_H256+TDS1_L转换十进制=0X0064转换十进制=100ppm
TDS2表示TDS2_H256+TDS2_L转换十进制=0X000A转换十进制=10ppm
TEM1表示=0X2A转换十进制=42℃
TEM2表示=0X0A转换十进制=10℃
由于TDS探头的个体差异或者未进行温度补偿等原因,会导致测量值有较大的误差。因此,为获得更精确的TDS值,在测量之后,必须进行校准,校准公式如下:
TDS=[TDS实测值+(T温度-25℃)*0.0108]/[1+(T温度-25)*0.0388]
其中TDS实测值为读取浓度值,T温度为待测溶液测量温度,通过温补公式算出最TDS后值。
#include "tds1.h"
USART3_DATA tds1Data={0};
float get_tds1,get_tds2,get_tem1,get_tem2;
uint8_t Get_Usart3_Data(void)
{
if(tds1Data.myflag==0)
{
return 0;
}
printf("%d %d %d %d %d %d %d %d\r\n",tds1Data.mydata[0],tds1Data.mydata[1],tds1Data.mydata[2],tds1Data.mydata[3],tds1Data.mydata[4],tds1Data.mydata[5],tds1Data.mydata[6],tds1Data.mydata[7]);
tds1Data.myflag=0;
if(tds1Data.mydata[0]!=0xff)
{
printf("帧头错误\r\n");
memset(&tds1Data,0,sizeof(tds1Data));
return 2;
}
if(tds1Data.mydata[7]!=0xaa)
{
printf("帧尾错误\r\n");
memset(&tds1Data,0,sizeof(tds1Data));
return 2;
}
if(tds1Data.datalen!=8)
{
printf("数据长度错误\r\n");
memset(&tds1Data,0,sizeof(tds1Data));
return 3;
}
get_tds1 = ((tds1Data.mydata[1]<<8)+tds1Data.mydata[2]);
get_tem1 = tds1Data.mydata[5];
get_tds1=(get_tds1+(get_tem1-25)*0.0108)/(1+(get_tem1-25)*0.0388);
printf("tds1=%.1f\r\ntem1=%.1f\r\n",get_tds1,get_tem1);
memset(&tds1Data,0,sizeof(tds1Data));
return 1;
}
二、LORA模块
产品介绍:
E32-433T20D 是一款基于 Semtech 公司 SX1278射频芯片的无线串口模块(TTL 电平),透明传输方式,工作在 410~441MHz 频段(默认 433MHz),采用 LoRa 扩频技术。
SX1278 支持 LoRa 扩频技术,LoRa 直序扩频技术具有更远的通讯距离,抗干扰能力强的优势,同时有极强的保密性。在低速通信领域 SX1278具有里程碑意义,并受到业内人士的青睐。该系列默认空中速率为2.4kbps,发射功率为 20dBm,采用工业级晶振,保证其稳定性、一致性精度均小于业内普遍采用的 10ppm。目前已经稳定量产,已经大量应用三表行业、物联网改造、智能家具等领域。模块具有数据加密和压缩功能。模块在空中传输的数据,具有随机性,通过严密的加解密算法,使得数据截获失去意义。而数据压缩功能有概率减小传输时间,减小受干扰的概率,提高可靠性和传输效率。
实物图
引脚定义:
M0:与M1配合设置LORA工作模式
M1:与M0配合设置LORA工作模式
Tx:连接外部的RX
Rx:连接外部的TX
Aux:用于只是模块的工作模块
Vcc:电源,2.3-2.5V
Gnd:接地
lora连接指令格式:
通过将M0,M1设置为11进入休眠模式可进行指令的设置。
在休眠模式下(M0=1,M1=1),向模块串口发出命令(HEX 格式):C1 C1 C1,模块会返回当前的配置参数,比如:C0 00 00 1A 06 44。此作用是为了检测自己的lora模块可以正常工作。之后根据连接指令发布自己的连接设置
最后拉高AUX之后发布自己的数据,数据包括地址加信道加要传输的数据。我才用的是定点发射的模式。
**源码**
#include "lora.h"
UART2_DATA loraData={0};
//串口2通信
//测试模块
void getloraconfig(void)
{
HAL_GPIO_WritePin(GPIOA, M0_Pin|M1_Pin, GPIO_PIN_SET);
HAL_Delay(2000);
uint8_t a1[3]={0xC1,0xC1,0xC1};
HAL_UART_Transmit(&huart2,a1,sizeof(a1),100);
}
//接受信息
void waitflag(void)
{
while(1)
{
if(loraData.myflag==1)
{
printf("%x %x %x %x %x %x\r\n",loraData.mydata[0],loraData.mydata[1],loraData.mydata[2],loraData.mydata[3],loraData.mydata[4],loraData.mydata[5]);
memset(&loraData,0,sizeof(loraData));
return;
}
}
}
//发送选择的模式
void setloraconfig(void)
{
HAL_GPIO_WritePin(GPIOA, M0_Pin|M1_Pin, GPIO_PIN_SET);
HAL_Delay(2000);
uint8_t a2[6]={0xC0,0x00,0x01,0x1a,0x17,0xC0};
HAL_UART_Transmit(&huart2,a2,sizeof(a2),100);
}
//将float类型转换成u8类型发送
void FloatToUint8(float data,uint8_t *arr)
{
uint8_t *p=(uint8_t*)&data;
for(uint8_t i=0;i<4;i++)
{
*(arr + i)=*(p+i);
}
printf("\r\n");
}
void sendloradata(void)
{
while(1){
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==GPIO_PIN_SET){
uint8_t a3[11]={0X00,0X02,0X17};
FloatToUint8(get_tds1,&a3[3]);
FloatToUint8(get_tem1,&a3[7]);
HAL_UART_Transmit(&huart2,a3,sizeof(a3),100);
return;
}
}
}