ESP32单片机基础入门

第13章:低功耗气象站项目

项目3

低功耗气象站设计与实现

本章将指导您构建一个基于ESP32的低功耗气象站,重点介绍深度睡眠模式和太阳能供电优化技术,使设备能够在野外长期运行。

💤

深度睡眠模式

利用ESP32的深度睡眠功能大幅降低功耗,延长电池寿命

☀️

太阳能供电

结合太阳能电池板和锂电池,实现能源自给自足

📊

数据采集

精确测量温度、湿度、气压和光照强度等环境参数

📶

无线传输

通过Wi-Fi定期上传数据到云端或本地服务器

所需硬件

(1) 深度睡眠模式实现

ESP32的深度睡眠模式可以显著降低功耗,电流可降至约10μA。以下是实现深度睡眠的关键代码:

// 设置唤醒源(这里使用定时器唤醒)
#define uS_TO_S_FACTOR 1000000  // 转换因子,微秒到秒
#define TIME_TO_SLEEP  300      // 休眠时间(秒)

void setup() {
    Serial.begin(115200);
    
    // 配置唤醒源
    esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
    
    // 在这里执行传感器读取和数据发送操作
    
    Serial.println("准备进入深度睡眠");
    delay(1000);
    
    // 进入深度睡眠
    esp_deep_sleep_start();
}

// 注意:深度睡眠后,代码会从setup()重新开始执行
// loop()函数不会被执行
void loop() {
    // 不会执行到这里
}
            

深度睡眠注意事项

  • 深度睡眠会关闭CPU、Wi-Fi、蓝牙等大部分功能
  • 只有RTC控制器和ULP协处理器保持工作
  • GPIO状态不会保持,需要使用RTC GPIO
  • 唤醒后程序会重新启动,从setup()开始执行

唤醒源配置

ESP32支持多种唤醒源,可以根据项目需求选择:

// 定时器唤醒(最常用)
esp_sleep_enable_timer_wakeup(30 * 1000000); // 30秒后唤醒

// 外部引脚唤醒(如按钮)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); // 低电平唤醒

// 多个引脚组合唤醒
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);
            

(2) 太阳能供电优化

为了确保气象站在阴雨天也能正常工作,需要合理设计太阳能供电系统:

太阳能供电系统组成

  1. 太阳能电池板:选择5V/2W以上的板子,确保有足够充电电流
  2. 充电管理模块:如TP4056,负责锂电池充放电管理
  3. 锂电池:推荐18650电池,容量2000mAh以上
  4. 升压模块:将3.7V升压至5V供ESP32使用

重要提示

务必使用带有过充过放保护的充电模块,避免锂电池损坏或危险。

功耗优化技巧

成功案例

经过优化后,使用2000mAh电池和适当尺寸的太阳能板,气象站可在野外连续工作数月无需维护。

完整项目流程图

低功耗气象站的工作流程如下:

  1. ESP32从深度睡眠中唤醒
  2. 初始化传感器和Wi-Fi连接
  3. 读取传感器数据(温度、湿度、气压、光照)
  4. 通过Wi-Fi将数据发送到服务器
  5. 检查电池电压(可选)
  6. 配置下一次唤醒时间
  7. 进入深度睡眠模式

数据发送优化代码

void sendDataToServer(float temp, float humidity, float pressure, float light) {
    WiFiClient client;
    
    // 快速连接服务器
    if (client.connect("yourserver.com", 80)) {
        String data = "temp=" + String(temp) + 
                     "&humidity=" + String(humidity) + 
                     "&pressure=" + String(pressure) + 
                     "&light=" + String(light);
        
        client.println("POST /api/data HTTP/1.1");
        client.println("Host: yourserver.com");
        client.println("Content-Type: application/x-www-form-urlencoded");
        client.print("Content-Length: ");
        client.println(data.length());
        client.println();
        client.println(data);
        
        // 等待简短响应(可选)
        delay(100);
        client.stop();
    }
}
            
客服小姐姐(优先添加)
访问我们的店铺
客服微信
联系客服微信