基于FireBeetle 2 ESP32-E的水质监控系统
基于FireBeetle 2 ESP32-E的水质监控系统,可以实时测试TDS 与温度 到阿里云平台。
标签
Funpack活动
ESP32
FireBeetle 2
水质监控
安先生
更新2023-01-04
638
  • 开发板介绍

    FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。

    支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。

    FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。 我们提供了详细的在线教程和应用案例,以及上千种免焊接的Gravity接口传感器与执行器,可轻松上手制作,大幅度降低你的学习时间。邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间。

  •  任务介绍

任务一:渔业养殖水质监控系统

用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度/浊度/tds/pH值/电位/溶解氧中两项指标以上)的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。

本文用TDS传感器+温度传感器+拓展板,实时把TDS值与温度值通过WIFI 传到阿里云的网站上。

TDS(Total Dissolved Solids),中文名总溶解固体,又称溶解性固体总量,表明1升水中溶有多少毫克溶解性固体。一般来说,TDS值越高,表示水中含有的溶解物越多,水就越不洁净。因此,TDS值的大小,可作为反映水的洁净程度的依据之一。 

温度(temperature)是表示物体冷热程度的物理量。

通过以上参数来评估水质的质量。

开发板的资料 FireBeetle 2:Gravity IO扩展板 (dfrobot.com.cn)

传感器资料:DFROBOT SEN0244 模拟TDS传感器 产品资料 使用教程

扩展版资料:FireBeetle 2:Gravity IO扩展板 (dfrobot.com.cn)

 

  • 思路整理

整体来说,分成两大模块,数据模块 与传输模块。

数据模块,获取TDS值 与温度值

传输模块,分成wifi模块与阿里云模块

Ft1JR_z0Gm_8SzXvK89qgxWEiZ27

 

  • 模块实现

数据模块: 需要实现数据的获取。

这部分的关键是需要能准确读取数据,要弄清楚对应的接口信息。尤其是在扩展板之后的连线差异。

配置好底层接口,上层读取数据后,进行算法处理,优化数据。

TDS部分需要特别注意,他是每80ms读取数据  和后续的每秒的传输是存在一定冲突。

需要单独放在loop里面运行 不依赖其他。

温度值则相对比较宽泛,每次发送数据的时候 读取一次即可。

传输模块:

这个模块分成两部,wifi的网络连接 与 阿里云的交互

wifi网络连接: 主要依赖官网的sdk  从wifi链路建立到异常重连

可以主要参考这篇 DFR0654_FireBeetle_Board_ESP32_E (dfrobot.com.cn)

阿里云交互:在前面wifi连接成功的基础上,配置阿里云的连接。

首先需要在阿里云上配置好设备的相关信息,产品-设备- 物模型等

这类参考阿里云的文档 很详细  从这里按照步骤 设备接入 (aliyun.com)

得到设备的三元组信息  写到代码里面。然后建立MQTT连接,订阅的形式进行数据交互。

  • 功能代码

1. TDS值获取

void tds_data()
{
  static unsigned long analogSampleTimepoint = millis();
  if (millis() - analogSampleTimepoint > 40U)  //every 40 milliseconds,read the analog value from the ADC
  {
    analogSampleTimepoint = millis();
    analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
    analogBufferIndex++;
    if (analogBufferIndex == SCOUNT)
      analogBufferIndex = 0;
  }
  static unsigned long printTimepoint = millis();
  if (millis() - printTimepoint > 800U)
  {
    printTimepoint = millis();
    for (copyIndex = 0; copyIndex < SCOUNT; copyIndex++)
      analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
    averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
    float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
    float compensationVolatge = averageVoltage / compensationCoefficient; //temperature compensation
    tdsValue = (133.42 * compensationVolatge * compensationVolatge * compensationVolatge - 255.86 * compensationVolatge * compensationVolatge + 857.39 * compensationVolatge) * 0.5; //convert voltage value to tds value
    //Serial.print("voltage:");
    //Serial.print(averageVoltage,2);
    //Serial.print("V   ");
    Serial.print("TDS Value:");
    Serial.print(tdsValue, 0);
    Serial.println("ppm");
  }
}

2. 温度的获取

// temp data 
void update_temp_data(void)
{
    uint16_t val;
    val=analogRead(A0);//
    tempValue = (float) val * (5/10.24);
    Serial.print("Tep:"); //Display the temperature on Serial monitor
    Serial.print(12);
    Serial.println("C");
//    delay(500);
}

3. 阿里云数据上传

void ConnectAliyun(){
while(!client.connected()){
  Serial.print("Attempting MQTT connection...");
  /*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/
  if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){
    Serial.println("connected");
    client.subscribe(subTopic);
  }else{
    Serial.print("failed, rc=");
    Serial.print(client.state());
    Serial.println(" try again in 5 seconds");
    delay(5000);
  }
}
}


void  send_data(void){
 String tempMseg = "{\"id\":"+ClientId+",\"params\":{\"TDS\":"+(String)(tdsValue)+",\"WaterTemperature\":"+(String)(tempValue)+"},\"method\":\"thing.event.property.post\"}";
 char sendMseg[tempMseg.length()];
 strcpy(sendMseg,tempMseg.c_str());
 client.publish(pubTopic,sendMseg); 
 }
  • 功能展示

Fs2o39_x1sq2bSinh6k8BYmdVVQF

FnEA-frZWf_FA9RJr5pyt4NV7u_OFh5kL9IP6xwM1BosRpdcPwl1nRba

  • 心得体会

这次尝试IOT平台,遇到一些问题。

最开始想尝试国外的平台,没找到好用的。要么要收费,要么注册异常复杂。

转过来尝试阿里云,体验不错,文档全,支持也不错。

总体来说,这次体验很不错,学到很多。

从单一的读取数据到数据与IOT平台的联动,可以做更多想象力的产品未来可期。

感谢主办方,希望以后活动更加精彩。

附件下载
demo.ino
demo code
团队介绍
安迪,热爱嵌入式的攻城狮
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号