FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。
它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。产品的现状,让项目成员了解当前存在的问题与痛点。
- 1.深度支持ArduinoIDE编程
- 2.即将支持Scratch图形化编程及MicroPython编程
- 3.邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间
-
任务一:渔业养殖水质监控系统
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数描述本项目期望达成的目标
- 记录温度/浊度/tds变化
- 把数据上传到IoT网站上
- 可实时动态显示监测水质的变化情况。
- TDS
- 浊度
- 温度
- oled display
(1)TDS | SEN0244
总溶解固形物(TDS)表示在一升水中溶解了多少毫克的可溶性固形物。一般情况下,TDS值越高,水中溶解的可溶性固形物越多,水质越不干净。因此,TDS值可作为反映水质清洁度的参考指标之一。
支持3.3 ~ 5.5V宽电压输入,0 ~ 2.3V模拟电压输出,可兼容5V或3.3 v控制系统或板。励磁源为交流信号,可有效防止探头极化,延长探头寿命,同时增加输出信号的稳定性。TDS探头具有防水性能,可长时间浸入水中进行测量。
NUM
Lable
description
1
-
Power GND(0V)
2
+
Power VCC(3.3V~5.5V)
3
A
Analog Signal Output(0~2.3V)
4
TDS
TDS Probe Connector
5
LED
Power Indicator
注意:这种探针不能在摄氏55度以上的水中使用。探头不能太靠近容器边缘,否则会影响读数。探头的头部和电缆是防水的,但连接器和信号发射板不防水。请注意使用。
//TDS 测试程序 #define TdsSensorPin A1 #define VREF 5.0 //ADC的模拟参考电压 #define SCOUNT 30 int analogBuffer[SCOUNT]; //将模拟值存储在数组中,读取ADC int analogBufferTemp[SCOUNT]; int analogBufferIndex = 0,copyIndex = 0; float averageVoltage = 0,tdsValue = 0,temperature = 25; //定义单精度浮点数类型 void setup() { Serial.begin(115200);pinMode(TdsSensorPin,INPUT); //波特率为115200,引脚模式输入 } void loop() { static unsigned long analogSampleTimepoint = millis(); if(millis()-analogSampleTimepoint > 40U) //每40毫秒读取一次 { analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //读取模拟值并存储到缓冲区中 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; // 通过中值滤波算法读取更稳定的模拟值,并转换为电压值 float compensationCoefficient=1.0+0.02*(temperature-25.0); //温度补偿公式: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); float compensationVolatge=averageVoltage/compensationCoefficient; // 温度补偿 tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compens ationVolatge)*0.5; //将电压值转换为TDS值 Serial.print("TDS Value:"); //串口发送 Serial.print(tdsValue,0); //串口发送 Serial.println("ppm"); //串口发送 }
(2)浊度|SEN0189
浑浊度传感器通过测量浑浊度来检测水质。它利用光来检测水中的悬浮颗粒,通过测量光的透过率和散射率,散射率随水中总悬浮固体(TSS)含量的变化而变化。随着TTS的增大,液体浊度增大。浊度传感器用于测量河流和溪流的水质,废水和流出物测量,沉降池控制仪器,沉积物运输研究和实验室测量。该传感器提供模拟和数字信号输出模式。在数字信号模式下,阈值可调。可以根据MCU选择模式。
该板共有两种模式可供选择 :
D/A输出信号开关
1. “A”:模拟信号输出,在高浊度液体中输出值会降低。
2. "D" :数字信号输出,高电平和低电平,可由阈值电位器调整。
阈值电位器: 在数字信号模式下,通过调整阈值电位器可以改变触发条件。
这是根据不同温度从输出电压到NTU的映射参考图如下:
//浊度 测试程序 void setup() { Serial.begin(9600); //波特率:9600 } void loop() { int sensorValue = analogRead(A0);// 将模拟读数从(0 - 1023)转换为电压(0 - 5V) Serial.println(voltage); // 输出读取值 delay(500); }
(3)温度|DS18B20
DS18B20,该防水温度传感器它包含一个带有电阻模块的探头,很容易在Arduino板上连接。DS18B20温度传感器通过1线接口提供9至12位(可配置)温度读数,因此只需从中央微处理器连接一根线(接地)。兼容3.0-5.5V系统。
工作电压:3.0~5.5V
使用温度范围:-55至125°C(-67°F至+257°F)
//温度传感器测试程序 #include <OneWire.h> int DS18S20_Pin = 25; OneWireds(DS18S20_Pin); float getTemp() { byte data[12]; byte addr[8]; if ( !ds.search(addr)) { 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); //开始转换 byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // 读寄存器 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); float TemperatureSum = tempRead / 16; return TemperatureSum; }
(4)oled display|SSD1306
0.66英寸(SSD1306)与其他OLED显示器相比,屏幕更小。然而,它仍然可以显示64x48的分辨率,并保持其性能,例如:高亮度,低功耗,背面有Grove接口等特点。你可以使用I2C接口点亮微型显示器与你的微控制器显示文字,图像或任何你想要的。0.66英寸显示屏可以让信息显示在更小的地方,可以用作Arduino OLED显示屏、Raspberry Pi PLED显示屏等。这款Grove-OLED显示器支持由Olikraus编写的U8g2单色显示器库。该库非常方便,兼容性好,可以支持SSD1306和其他芯片。
Parameter
Value
Input voltage
3.3V / 5V
Output Voltage
0 ~ 2.3V
Pixels
64 x 48
Temperature Range
-40℃~ +85℃
Interface
I2C
//屏幕测试程序 #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> U8G2_SSD1306_128X64_NONAME_F_SW_I2Cu8g2(U8G2_R0,/* clock=*/21,/* data=*/22,/* reset=*/U8X8_PIN_NONE); voidsetup(void) { u8g2.begin(); } voidloop(void) { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(32,30,"我是 \n"); u8g2.drawStr(32,45,"强桑!"); u8g2.sendBuffer(); delay(500); }
云平台——Blinker
blinker是一套专业且快捷的、跨硬件、跨平台的物联网解决方案,提供APP端、设备端、服务器端支持,使用公有云服务进行数据传输存储。//Blinker测试程序 #define BLINKER_PRINT Serial #define BLINKER_WIFI #include <Blinker.h> char auth[] = "Your Device Secret Key"; char ssid[] = "Your WiFi network SSID or name"; char pswd[] = "Your WiFi network WPA password or WEP key"; // 新建组件对象 BlinkerButton Button1("btn-abc"); BlinkerNumber Number1("num-abc"); int counter = 0; // 按下按键即会执行该函数 void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); } // 如果未绑定的组件被触发,则会执行其中内容 void dataRead(const String & data) { BLINKER_LOG("Blinker readString: ", data); counter++; Number1.print(counter); } void setup() { // 初始化串口 Serial.begin(115200); #if defined(BLINKER_PRINT) BLINKER_DEBUG.stream(BLINKER_PRINT); #endif // 初始化有LED的IO pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); // 初始化blinker Blinker.begin(auth, ssid, pswd); Blinker.attachData(dataRead); Button1.attach(button1_callback); } void loop() { Blinker.run(); }
软件流程图:
活动心得第一次参加Funpack活动,通过这次项目让我明白了物联网的乐趣,项目中有很多东西刚开始不太懂,也是一边学习一边做,最后做成功还是很有成就感的,增加了对嵌入式的兴趣;同时这也是我第一次做东西写这种技术文档,从头到位下来梳理一遍,感觉收获颇多,这是一个好习惯,会继续保持。很开心参加这次的Funpack第二季第三期活动,预祝活动越办越好,让更多有相同兴趣的人在一起做项目,期待下一次的活动!