Funpack第二季第三期基于FireBeetle ESP32-E的水质监控系统
用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数的变化,并能把数据上传到IoT网站上,可实时动态显示监测水质的变化情况。
标签
Funpack活动
测试
显示
Meatdd
更新2023-01-04
南京工业职业技术大学
434
Funpack2-3 |基于ESP32-E的水质检测系统
 
一、主控单元

FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。

它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。产品的现状,让项目成员了解当前存在的问题与痛点。

  • 1.深度支持ArduinoIDE编程
  • 2.即将支持Scratch图形化编程及MicroPython编程
  • 3.邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间Fh9kdHNndA0IvGqjfMYaqluqFr28
  • 任务一:渔业养殖水质监控系统

    用FireBeetle ESP32-E开发板作为控制单元,观察养殖水质参数描述本项目期望达成的目标

    1. 记录温度/浊度/tds变化
    2. 把数据上传到IoT网站上
    3. 可实时动态显示监测水质的变化情况。
    传感器
    • TDS
    • 浊度
    • 温度
    • oled display

    (1)TDS | SEN0244

    总溶解固形物(TDS)表示在一升水中溶解了多少毫克的可溶性固形物。一般情况下,TDS值越高,水中溶解的可溶性固形物越多,水质越不干净。因此,TDS值可作为反映水质清洁度的参考指标之一。

    支持3.3 ~ 5.5V宽电压输入,0 ~ 2.3V模拟电压输出,可兼容5V或3.3 v控制系统或板。励磁源为交流信号,可有效防止探头极化,延长探头寿命,同时增加输出信号的稳定性。TDS探头具有防水性能,可长时间浸入水中进行测量。

    Fvhqo2qaOAFlkOo9NtV4f7G83I7M

    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选择模式。

    Ftmw73DDXL0-zWbzLLHfGg8Tb8Cw

    该板共有两种模式可供选择 :

    D/A输出信号开关

    1. “A”:模拟信号输出,在高浊度液体中输出值会降低。

    2. "D" :数字信号输出,高电平和低电平,可由阈值电位器调整。

    阈值电位器: 在数字信号模式下,通过调整阈值电位器可以改变触发条件。

    这是根据不同温度从输出电压到NTU的映射参考图如下:

    Fi3-UmA5cnyuUu2aczvkeMOq-Ic2

    //浊度 测试程序
    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)

    FubbhxWGJxBZC5ZGwtvJRwQD8LXJ

    //温度传感器测试程序
    #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和其他芯片。

    Fs7xBBom1rLEHzTygU9oFBEHOMf1

    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();
    }

    软件流程图:
    Fvy2xiX2QLOJuv5QvcvQfZvgYWCQ

    活动心得

    第一次参加Funpack活动,通过这次项目让我明白了物联网的乐趣,项目中有很多东西刚开始不太懂,也是一边学习一边做,最后做成功还是很有成就感的,增加了对嵌入式的兴趣;同时这也是我第一次做东西写这种技术文档,从头到位下来梳理一遍,感觉收获颇多,这是一个好习惯,会继续保持。很开心参加这次的Funpack第二季第三期活动,预祝活动越办越好,让更多有相同兴趣的人在一起做项目,期待下一次的活动!

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