ESP8266 D1 mini 制作TTL 连接 Modbus协议的氧气含量监测器

本文详细描述了如何使用ArduinoIDE和ESP8266D1mini开发一个基本的气体监测项目,包括使用ModbusTTL连接松柏氧气传感器,OLED显示数据,以及遇到的供电问题和ESP8266D1mini的限制。作者还提供了关于如何改进硬件选择和网络连接的建议。

你可以学到或了解到:

  1. 最基础的气体监测项目 开发过程;
  2. Arduino IDE上使用ESP8266 D1 mini 的TTL连接使用Modbus方法;
  3. ESP8266 D1 mini不为人知的大坑。

背景介绍

由于某宝氧气检测器小一千,因此自己拼一个氧气检测器会更实惠些,并且可以根据使用条件来调整。
需求如下:
OLED小屏幕显示氧气传感器发送的数据并显示,使用电化学氧气传感器获取基础模拟或数字信号。

Methord

实验设备

  1. 松柏氧气传感器(S40XV氧气传感器) 使用Modbus TTL直连,不需要RS232或RS485电平转换电路,通讯距离2m
  2. ESP8266 D1 mini
  3. 0.94寸OLED12864(驱动芯片 SSD1315) (我也不明白 为什么成本比SSD1306便宜一半 性能差不多,价格却没变化)

连接方式

O2 Sensor detector
然后在立创EDA上画板子,白嫖PCB进行项目测试。

程序

代码部分
#include <Arduino.h>
#include <U8g2lib.h>
#include <ModbusMaster.h>

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
ModbusMaster node;

void setup() {
  u8g2.begin();
  Serial.begin(9600);
  node.begin(255, Serial);
}

void loop() {

  u8g2.firstPage();
  do{
    get_O2Conc();
    runtime_show();    
  }while(u8g2.nextPage());
  delay(1000);
}

void get_O2Conc(){
  uint8_t temp_result;
  uint16_t temp_num0;
  float temp_value = 99.9;
  temp_result = node.readHoldingRegisters(0x6001, 1);
  delay(1000);
  if (temp_result == node.ku8MBSuccess)
  {
    temp_num0 = node.getResponseBuffer(0); 
    temp_value =  temp_num0/10;  
    int16_t x1 = 0;
    int16_t y1 = 10; // 调整第一行的Y坐标位置
    u8g2.setFont(u8g2_font_7x14B_mr); // 小字体 u8g2_font_t0_11b_mf
    u8g2.drawStr(x1, y1, "O2 Conc.(v%)");
    u8g2.setFont(u8g2_font_ncenB24_tr); // 大字体
    int16_t x2 = (128 - u8g2.getStrWidth("XX.X")) / 2;
    int16_t x3 = (128 + u8g2.getStrWidth("XX.X")) / 2;
    int16_t y2 = 45; // 调整第二行的Y坐标位置
    char oxygenString[5];
    snprintf(oxygenString, sizeof(oxygenString), "%.1f", temp_value);
    Serial.println(oxygenString);
    u8g2.drawStr(x2, y2, oxygenString);
    u8g2.setFont(u8g2_font_fub14_tr); // 小字体
    u8g2.drawStr(x3, y2, "%");
  }else{
  u8g2.setFont(u8g2_font_7x14B_mr); 
  u8g2.drawStr(0,10,"null");    
  }
}  


void runtime_show(){
  unsigned long time = millis() / 1000;
  unsigned int sec = time % 60;
  unsigned int minute = (time / 60) % 60;
  unsigned int hour = (time / 3600) % 24;
  unsigned long day = time / 86400;
  char timeString[20];
  snprintf(timeString, sizeof(timeString), "Run %2ud %02u:%02u:%02u", day, hour, minute, sec);
  u8g2.setFont(u8g2_font_7x14B_mr); // 小字体
  u8g2.drawStr(0, 63, timeString);
}

备注:由于ESP8266 D1 mini串口只有一个,被氧气传感器占用,无法在arduino IDE的串口程序中显示,因此直接使用OLED调试。

Modbus部分介绍

本部分使用arduino 中的Modbus Master库处理TTL发送过来的数据。访问寄存器部分说明如下:
O2 Sensor 说明书
对应的Modbus只读的代码如下:

temp_result = node.readHoldingRegisters(0x6001, 1);
temp_num0 = node.getResponseBuffer(0); 
temp_value =  temp_num0/10; // 小数点有一位,因此需要除以10
snprintf(oxygenString, sizeof(oxygenString), "%.1f", temp_value); // OLED显示数据

结果与总结

运行结果正确,符合项目的基本需要,因此本mini项目完成
不足之处及总结:

  1. 第一版 直接使用ESP8266 D1 mini 上的USB插口供电,5V 引脚作为氧气传感器5V供电电源,然而数据读取总是错误。后检查发现,ESP8266 D1 mini 5V输出电压实际为4.6V,导致5V电化学传感器反应不完全,因此输出电压不准确。因此需要使用独立的USB供电接口。
  2. **ESP8266 D1 mini 无法使用软串口,因此多个UART设备会导致自动自动下载失灵,**需要单独拔插开发板后录入程序。因此推荐使用ESP8266常规开发板(非mini),然后连接合适IO口作为软串口输入串口,TXRX作为监视和程序写入串口,软串口作为数据读取串口,不会互相干扰(因此ESP8266 ESP32开发板更合适)。由于本部分并不会频繁写入程序,并且需要体积小巧,因此仍然使用ESP8266 D1 mini作为开发板。(当然ESP01s也是个不错的选择,但是本着能不焊接就不焊接,能不用其他元器件就不用元器件的原则,ESP D1 mini方案胜出,采用插母方案随时准备回收开发板)。
  3. ESP 8266 D1 mini 无法连接到WIFI WPA2 Enterprise. (因此校园网无法登陆,ESP32支持该功能),因此本设备无法连接到学校企业WLAN网络,只能本地跑。(具体连接方案代码可参考我之前的文章:ESP32连接企业WIFI/校园无线网方法)

文章参考:
arduino ESP8266 Modbus 通信
注释: 如果只用03读取,可以参考本案例进行,使用更佳。
松柏氧气传感器 0-30%(体积比)

### ESP8266 D1 Mini介绍 ESP8266 D1 Mini是一款基于ESP8266模组设计的小型物联网开发板[^1]。该开发板不仅继承了ESP8266的强大Wi-Fi连接能力,还通过精心设计的外围电路增强了易用性和稳定性。 #### 主要特点 - **集成度高**:内置USB转TTL串口芯片,无需额外购买编程器即可完成固件烧录。 - **体积小巧**:便于嵌入各种小型项目中作为无线通信核心部件。 - **兼容性强**:与Arduino IDE完美适配,并且支持多种第三方库函数调用;同时其引脚布局与其他同类产品相似,能够直接利用现有的资源进行二次开发[^2]。 ### 技术规格 | 参数 | 描述 | |------------|-------------------------------------------------------------| | 处理器 | Tensilica L106 Diamond Standard Processor | | 工作频率 | 80 MHz 或者 160 MHz (可选) | | Flash大小 | 根据具体型号不同而有所差异,默认版本通常配备4MB闪存 | | RAM容量 | 内置64KB指令缓存+96KB数据SRAM | | Wi-Fi标准 | IEEE 802.11 b/g/n | | GPIO数量 | 提供多个GPIO接口用于外设控制 | ### 使用教程 为了更好地理解和使用这款开发板,在安装必要的驱动程序之后还需要配置相应的IDE环境以便编写并上传代码到目标设备上运行。 #### Arduino IDE设置方法 打开Arduino IDE软件后依次点击`文件->首选项`,在弹出窗口中的附加开发板管理网址处填入官方提供的链接地址[^3]: ```plaintext http://arduino.esp8266.com/stable/package_esp8266com_index.json ``` 接着进入`工具 -> 开发板 -> 开发板管理器...`界面查找并安装名为“esp8266”的包。完成后就可以从菜单栏选择对应的开发板类型(如LiteLOLIN(D1_mini)Lite),再配合正确的端口号就能顺利编译和上传sketch至ESP8266 D1 Mini上了。 ```cpp void setup() { Serial.begin(115200); } void loop() { if(Serial.available()){ String input = Serial.readString(); Serial.println(input); } } ``` 上述示例展示了如何初始化串行通讯以及读取来自PC端的数据并通过同样的通道回显给发送方。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值