Funpack2-3---基于FireBeetle ESP32-E开发板的渔业养殖水质监控系统
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数(温度、浊度)的变化,并能把数据上传到阿里云网站上,可实时动态显示监测水质的变化情况。
标签
嵌入式系统
Funpack活动
ESP32
阿里云
冷月烟
更新2023-01-03
431

1.任务目的    

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

 

2.硬件介绍

FiQNfg5-QpehKtFfmlfHcpAYXS_6

  • 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,点击文件->首选项

FkPWrbBW026_XS4SikpviufDfOwt

在新打开的界面中,点击如下图红色方框中的按钮

FpL_xOeq8-Ul_6eRDSFDg6nPrTHu

将如下链接地址复制到新弹出的对话框中:http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json

Fqoc8wG9qXXk9CErg_ihjie1nqb6

(2). 更新板卡
打开工具->开发板:->开发板管理器...,如下图所示:

Fh_3NGqoGHR8s7ExBLh9SBv7K0wL

开发板管理器会自动更新板卡,更新完成后,会在列表中看到DFRobot ESP32 Boards主板,点击安装:

FmwuTFcC4sMaaMQf8SJ4tbeGJ1zW

(3). 安装OneWire库

打开工具->管理库...,如下图所示:

FrwFN9e1SjpOvDXvxe2oE14fnyBJ

库管理器会自动更新,更新完成后,找到下图的OneWrie库,点击安装:

FvAKSb9d3vHtQHe2dmltg_qxzOC9

(4). 安装arduino阿里云库

下载arduino阿里云库:阿里云IOT库文件及样例代码

解压后将下面几个文件夹复制到arduino安装路径的libraries文件夹里面,如下图:

FgkT71g_JmggIr2ZdVLfTkIvmoGb

 

4.阿里云Iot创建产品

(1). 创建产品

Fo_es7ZjvjCwu69h5Q1g4mQXFMs_

(2). 编辑功能

FihvBU1QRQSsgoKVlzzL-ZX-mkSgFp_Wvz0EDzzgwjiFoys1kO9I3gGi

(3). 添加设备

FuKCRl-7g_0CFZjrxSuMMUy1gsUh

(4). 记下设备证书等参数

FqoIVPKhvPjIOAyB5yaVqZCNA_S3

FigxnhxR2-dtL_hRAvuDXLQtAv8q

 

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.实际演示

运行状态(未放进水中)

FhaeTlDhxrAYzvSVZ13VoRgRzYu3

阿里云数据波形查看(放在水中一直运行的波形)

Fn2A7q1UjMoL8EfIofB2AmRw7ABx

FqezEqWE-xB2sgcDZ9_g7zvBafsF

实时数据

FgjAdGhbyjcA2BqSpE9y8zXUZzYx

7.总结感想

板子很有趣,厂家生态做的非常好,无论是硬件还是软件体验都很好,第一次感受到轻轻松松就完成一个小作品的乐趣。

 

8.意见建议

希望以后能多找些这种支持好的板卡,能让更多小伙伴感受到开发的乐趣,不过1000字还是很苦手啊。

 

注:代码并不能直接编译,需要先完成环境搭建与设置

Fis7NXU6CDBHFVaS5NMhxZxbRCuD

附件下载
代码.zip
团队介绍
团队成员
冷月烟
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号