1.任务目的
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度/浊度/tds/pH值/电位/溶解氧中两项指标以上)的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。
2.硬件介绍
- Type-C: USB接口:4.75v-5.5v
- pH2.0锂电池接口:3.5-4.2v
- 2/D9 LED灯:使用2/09号脚控制的LED灯
- 充电指示灯:指示充电方式的红色LED,通过三种方式指示充电状态:1充满电或末充电时熄灭2、充电时常亮3、USB供电,末连接锂电池时高频闪烁
- RST复位引脚:单击复位按钮,将程序复位
- 5/D8 WS2812指示灯:使用5/D8引脚控制的WS2812RGB灯珠
低功耗焊盘:此焊盈专为低功耗设计,默认为连接状态,使用小刀轻轻刮粉中间的细线即可断开,断开后可降低500u4静态功耗,通过程序控制主控进入睡眠模式后可将功耗降低至131A。注意:焊盘断开后仅UsE方式供电可驱动RGE灯 - GD显示接口:DFRobot专用显示屏接口,详情后文GD显示接口
- ESP32模组:乐鑫公司推出的最新ESP32-E模组
- 按钮:连接27/D4的按钮
3.环境配置
(1). 配置URL网址到Arduino IDE
打开Arduino IDE,点击文件->首选项。
在新打开的界面中,点击如下图红色方框中的按钮
将如下链接地址复制到新弹出的对话框中:http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json
(2). 更新板卡
打开工具->开发板:->开发板管理器...,如下图所示:
开发板管理器会自动更新板卡,更新完成后,会在列表中看到DFRobot ESP32 Boards主板,点击安装:
(3). 安装OneWire库
打开工具->管理库...,如下图所示:
库管理器会自动更新,更新完成后,找到下图的OneWrie库,点击安装:
(4). 安装arduino阿里云库
下载arduino阿里云库:阿里云IOT库文件及样例代码
解压后将下面几个文件夹复制到arduino安装路径的libraries文件夹里面,如下图:
4.阿里云Iot创建产品
(1). 创建产品
(2). 编辑功能
(3). 添加设备
(4). 记下设备证书等参数
5.主要代码
(1). 初始化
初始化串口,连接wifi,连接阿里云。
void setup(){
Serial.begin(115200);
/*连接WIFI*/
connectWiFi();
/*初始化Alinyun的配置,可自动计算用户名和密码*/
myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);
client.setServer(myAliyun.mqtt_server,PORT);
/*连接到Aliyun*/
ConnectAliyun();
getTemp();
}
(2). 主循环
如果没连上云就继续连,连上了每隔5s,读取一次浊度跟温度并上报云。
void loop(){
if(!client.connected()){
ConnectAliyun();
}
else
{
float turbidity = analogRead(A0) * (5.0 / 1024.0);
float temperature = getTemp();
String tempMseg = "{\"id\":"+ClientId+",\"params\":{\"turbidity\":"+(String)turbidity+",\"temperature\":"+(String)temperature+"},\"method\":\"thing.event.property.post\"}";
char sendMseg[tempMseg.length()];
strcpy(sendMseg,tempMseg.c_str());
client.publish(pubTopic,sendMseg);
delay(5000);
}
client.loop();
}
(3). 读取温度
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
(3). 连接wifi
void connectWiFi(){
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID,WIFI_PASSWORD);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP Adderss: ");
Serial.println(WiFi.localIP());
}
(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);
}
}
}
6.实际演示
运行状态(未放进水中)
阿里云数据波形查看(放在水中一直运行的波形)
实时数据
7.总结感想
板子很有趣,厂家生态做的非常好,无论是硬件还是软件体验都很好,第一次感受到轻轻松松就完成一个小作品的乐趣。
8.意见建议
希望以后能多找些这种支持好的板卡,能让更多小伙伴感受到开发的乐趣,不过1000字还是很苦手啊。
注:代码并不能直接编译,需要先完成环境搭建与设置