-
开发板介绍
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模块与阿里云模块
- 模块实现
数据模块: 需要实现数据的获取。
这部分的关键是需要能准确读取数据,要弄清楚对应的接口信息。尤其是在扩展板之后的连线差异。
配置好底层接口,上层读取数据后,进行算法处理,优化数据。
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);
}
-
功能展示
-
心得体会
这次尝试IOT平台,遇到一些问题。
最开始想尝试国外的平台,没找到好用的。要么要收费,要么注册异常复杂。
转过来尝试阿里云,体验不错,文档全,支持也不错。
总体来说,这次体验很不错,学到很多。
从单一的读取数据到数据与IOT平台的联动,可以做更多想象力的产品未来可期。
感谢主办方,希望以后活动更加精彩。