一、需完成的任务:
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度/浊度/tds/pH值/电位/溶解氧中两项指标以上)的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。
完成情况:
可观察温度和浊度的情况,可上传到IoT网站。
二、各功能对应的主要代码片段及说明
1、浊度传感器sen0189外设部分
void NTUread()
{
int sensorValue = analogRead(A0);//读取ADC0的接口数据
//adc读到的数据给sensor变量
float voltage = sensorValue * 4.5 / 4095.0; // 计算采集到的adc转换为电压值
ntu = -1120.4*voltage*voltage+5742.3*voltage-4352.9;
//浊度的计算(公式来自于官网Wiki)
Serial.println(ntu);//串口调试的时候使用的数据查看
}
2、温度传感器ds18b20部分
void Temperature_read()
{
//Serial.println("发起温度转换");
sensors.requestTemperatures(); //向总线上所有设备发送温度转换请求
//Serial.println("温度转换完成");
temp = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据
if (temp != DEVICE_DISCONNECTED_C) //如果获取到的温度正常(调试用)
{
Serial.print("当前温度是: ");
Serial.print(temp);
}
}
3、阿里云物联网平台的互通——MQTT
void mqtt_interval_post()
{
char param[512];
char param2[512];
char jsonBuf[1024];
char jsonBuf2[1024];
sprintf(param,"{\"CurrentTemperature\":%f}",temp);//温度传输
sprintf(param2,"{\"NTU\":%f}",ntu);//浊度传输
//浊度转换和温度转换
sprintf(jsonBuf2, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param2);
sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);
Serial.println(jsonBuf);//串口测试
Serial.println(jsonBuf2);//串口测试
mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);//两个数据上传
mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf2);
}
4、主函数部分
void loop()
{
NTUread();//浊度传感器函数
Temperature_read();//温度函数
if (millis() - lastMs >= 20000)//MQTT的连接
{
lastMs = millis();
mqtt_check_connect();
/* Post */
mqtt_interval_post();
}
mqttClient.loop();
unsigned int WAIT_MS = 2000;
if (digitalRead(SENSOR_PIN) == HIGH)
{
Serial.println("Motion detected!");
}
else
{
Serial.println("Motion absent!");
}
delay(WAIT_MS); // ms
Serial.println(millis() / WAIT_MS);
}
三、功能展示及说明
1、总体电路
本次任务使用了一个ESP32主控和两个外设,分别是Fire beetle和SEN0189和DS18B20三个模块,然后用来实现水质检测的功能。
图1——整体硬件
2、温度和浊度在阿里云平台上的显示
使用DS18B20采集数据并使用,该传感器使用的是onwire总线的传输方式,可以把采集到的数据通过GPIO口进行传输,在ESP32采集数据后发送给IOT平台,如图2和图3,此时所检测的是水质为保温瓶中的温水,温度为68.62摄氏度,并且此时浊度为986.17。
再对第二种水质测试,该种水质为掺杂了其他物质的常温水,如图4和图5,此时温度为21.35摄氏度,浊度为2924.17
图2——物联网所接收的数据
图3——水质为温水和清水
图4——物联网平台此时所接收到的数据
图5——水质为掺杂了其他杂质的高浊度的常温水
四、对本活动的心得体会
1、本次活动所使用的ESP32并不是我所熟悉的开发板,所以在初期配置环境的时候,出现了很多问题,同时网上的参考资料也因为不同的环境有不一样的方式,这在初期学习的时候带来了较大困扰,不过后续根据官方的一些资料,最终还是选择了Arduino的开发环境来进行编写。
2、DS18B20传感器的传输方式比较特别,采用的是比较少见的单总线来进行数据的发送和接收,驱动该传感器时,刚开始是自己写的驱动,后来发现逻辑上以及方法都有很大漏洞,最后仔细查看了官方提供的该总线协议的库文件,及时更换了方法,选择直接调用官方文件更加方便,也大大缩短了时间。
3、本次调试的最大难点是阿里云平台的数据传输,学习的时候只实现了单次的数据传输,后续想实现多数据传输的时候,不知道为什么只能传输一个,后续经过仔细研究代码,以及在多个MQTT函数中不断试错,得到了答案,因为在interval函数部分漏了一个函数,导致传输数据的时候只有一个,最后添加了一个函数,成功实现多个数据的实时传输
4、本次因为疫情原因,导致了传感器只有两个,所以功能展示部分,个人感觉比较空洞,其实主控板上的资源仍有很多,想要改进的话,可以添加更多的传感器,实现多数据的检测,其次,因为代码原因较为臃肿,代码运行到MQTT传输数据到阿里云平台的时候,经过本人多次测试,大约10几s才传输一次数据给阿里云平台,这个我觉得可以继续完善,可以修整到时间更短的效果。