基于Beetle ESP32-C3的物联网温湿度监测系统开发指南

📅 2026/7/16 12:43:05 👁️ 阅读次数 📝 编程学习
基于Beetle ESP32-C3的物联网温湿度监测系统开发指南

1. 项目背景与硬件选型

Beetle ESP32-C3是DFRobot推出的一款超小型物联网开发板,基于ESP32-C3 RISC-V单核处理器,尺寸仅25×20.5mm,却集成了Wi-Fi和蓝牙5(LE)双模通信功能。这款开发板特别适合需要紧凑尺寸的物联网项目,如可穿戴设备、智能家居传感器等。

选择这款开发板主要基于三点考虑:

  1. 超小体积:相比传统ESP32开发板,Beetle ESP32-C3的硬币大小尺寸让项目成品更加精致
  2. 低功耗特性:深度睡眠模式下电流仅15μA,适合电池供电场景
  3. 丰富接口:尽管体积小,但提供了13个GPIO,支持PWM、I2C、SPI等常用接口

2. 开发环境搭建

2.1 Arduino IDE配置

  1. 打开Arduino IDE,进入"文件->首选项"
  2. 在"附加开发板管理器网址"中添加ESP32支持:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  3. 进入"工具->开发板->开发板管理器",搜索并安装"esp32"平台
  4. 安装完成后,选择开发板为"DFRobot Beetle ESP32-C3"

注意:首次烧录时如果出现端口识别问题,需要将BOOT引脚(IO9)接地后重新上电

2.2 所需库安装

本项目需要以下库支持:

  • U8g2库:OLED显示驱动
  • DFRobot_SHT3x库:温湿度传感器驱动

可通过"项目->加载库->管理库"搜索安装,或从GitHub下载后手动安装到Arduino的libraries文件夹。

3. 硬件连接与电路设计

3.1 元器件清单

元器件型号数量
开发板DFRobot Beetle ESP32-C31
OLED屏0.96寸128×64 I2C接口1
温湿度传感器SHT301
连接线母对母杜邦线若干

3.2 接线示意图

Beetle ESP32-C3 OLED屏 SHT30传感器 ----------------------------------------- 3.3V -> VCC VCC GND -> GND GND GPIO8 (SDA) -> SDA SDA GPIO9 (SCL) -> SCL SCL

实际接线时注意:不同厂商的OLED屏引脚顺序可能不同,务必确认VCC和GND不要接反

4. 核心代码实现

4.1 初始化设置

#include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> #include <DFRobot_SHT3x.h> // OLED初始化 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // SHT30传感器初始化 DFRobot_SHT3x sht3x(&Wire, 0x45, 4); void setup() { Serial.begin(115200); // OLED初始化 u8g2.begin(); u8g2.setFontPosTop(); // 传感器初始化 while(sht3x.begin() != 0) { Serial.println("传感器初始化失败,请检查连接"); delay(1000); } sht3x.softReset(); }

4.2 主循环与数据显示

void loop() { // 读取传感器数据 float temp = sht3x.getTemperatureC(); float humi = sht3x.getHumidityRH(); // OLED显示 u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.drawStr(0, 15, "Temp:"); u8g2.setCursor(70, 15); u8g2.print(temp, 1); u8g2.drawStr(110, 15, "C"); u8g2.drawStr(0, 40, "Humi:"); u8g2.setCursor(70, 40); u8g2.print(humi, 1); u8g2.drawStr(110, 40, "%"); u8g2.sendBuffer(); delay(2000); // 2秒更新一次 }

5. 功能扩展与优化

5.1 添加WiFi天气数据获取

通过ESP32-C3的WiFi功能,我们可以从网络API获取实时天气数据:

#include <WiFi.h> #include <HTTPClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void getWeatherData() { if(WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin("http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_API_KEY"); int httpCode = http.GET(); if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); // 解析JSON数据并显示 } http.end(); } }

5.2 OLED显示优化技巧

  1. 使用双缓冲避免闪烁:

    u8g2.setDisplayRotation(U8G2_R0); u8g2.setFlipMode(0);
  2. 自定义中文字体显示:

    • 使用U8g2字体工具生成自定义字体
    • 将生成的.h文件加入项目
    • 调用方式:
      u8g2.setFont(u8g2_font_wqy16_t_gb2312); u8g2.drawUTF8(0, 20, "温度");

6. 常见问题排查

6.1 OLED屏幕不显示

  1. 检查电源:用万用表测量VCC和GND之间是否为3.3V
  2. 检查I2C地址:通过I2C扫描程序确认OLED地址(通常是0x3C或0x78)
    void scanI2C() { Wire.begin(); for(uint8_t addr = 1; addr < 127; addr++) { Wire.beginTransmission(addr); if(Wire.endTransmission() == 0) { Serial.print("Found device at 0x"); Serial.println(addr, HEX); } } }

6.2 传感器数据异常

  1. 检查接线:确认SDA、SCL没有接反
  2. 检查传感器地址:SHT30的I2C地址由ADDR引脚决定:
    • ADDR接VDD:0x45
    • ADDR接GND:0x44
  3. 添加错误处理:
    if(isnan(temp) || isnan(humi)) { Serial.println("传感器数据读取失败"); u8g2.drawStr(0, 15, "Sensor Error!"); u8g2.sendBuffer(); return; }

7. 功耗优化方案

7.1 深度睡眠模式

对于电池供电项目,可以启用深度睡眠:

#define uS_TO_S_FACTOR 1000000 // 微秒到秒转换系数 #define TIME_TO_SLEEP 300 // 休眠时间(秒) void setup() { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start(); }

7.2 动态刷新率调整

根据温度变化速率调整采样频率:

float lastTemp = 0; unsigned long lastCheck = 0; unsigned long interval = 2000; // 默认2秒 void loop() { float currentTemp = sht3x.getTemperatureC(); // 温度变化大时提高刷新率 if(abs(currentTemp - lastTemp) > 1.0) { interval = 500; // 0.5秒 } else { interval = 2000; // 2秒 } lastTemp = currentTemp; delay(interval); }

8. 项目外壳设计与制作

8.1 3D打印方案

使用FreeCAD或Fusion 360设计紧凑外壳,注意:

  1. 为OLED屏开孔尺寸略小于屏幕可视区域
  2. 预留传感器通风孔
  3. 考虑按键和充电接口位置

8.2 材料选择建议

  1. PLA:易打印,成本低,适合原型制作
  2. PETG:更高强度,适合长期使用
  3. 亚克力:激光切割方案,适合扁平化设计

9. 进阶功能扩展

9.1 蓝牙手机APP控制

通过BLE实现手机控制显示内容:

#include <BLEDevice.h> #include <BLEServer.h> BLEServer *pServer; BLEService *pService; BLECharacteristic *pCharacteristic; void setupBLE() { BLEDevice::init("WeatherDisplay"); pServer = BLEDevice::createServer(); pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE ); pService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); BLEDevice::startAdvertising(); }

9.2 数据上传云端

将数据同步到IoT平台:

void uploadToCloud(float temp, float humi) { WiFiClient client; if(client.connect("api.thingspeak.com", 80)) { String url = "/update?api_key=YOUR_KEY&field1="; url += String(temp); url += "&field2="; url += String(humi); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: api.thingspeak.com\r\n" + "Connection: close\r\n\r\n"); } }

10. 项目总结与改进方向

在实际开发过程中,发现以下几点值得注意:

  1. ESP32-C3的I2C引脚默认不是GPIO8/9,需要手动指定
  2. U8g2库内存占用较大,在复杂界面时需要考虑内存优化
  3. SHT30传感器响应速度快,但需要定期校准

后续改进方向:

  1. 增加触摸控制功能,通过电容触摸切换显示内容
  2. 开发太阳能充电版本,实现完全无线部署
  3. 添加历史数据记录功能,通过SPI接口连接SD卡模块