ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP-IDF保姆级入门07|DHT11温湿度传感器 + OLED 显示实战:打造你的第一个完整物联网监测项目

ESP-IDF保姆级入门07|DHT11温湿度传感器 + OLED 显示实战:打造你的第一个完整物联网监测项目 专栏前言上一篇我们搞定了I2C 通信 SSD1306 OLED 屏幕驱动成功实现了文字、数字的静态与动态显示。从本篇开始我们正式进入多外设整合实战将DHT11 温湿度传感器与 OLED 屏幕结合做一个完整的「环境数据采集 本地显示」小项目。这也是专栏第一个从传感器采集 → 数据解析 → 屏幕刷新 → 串口打印的全链路工程零基础跟着做一遍就能彻底理解「外设驱动整合」的核心思路。一、DHT11 温湿度传感器核心基础1. 器件简介DHT11 是一款低成本、常用的数字温湿度传感器内置校准系数直接输出数字信号非常适合新手入门物联网采集类项目。测量范围温度 0~50℃湿度 20~90%RH精度温度 ±2℃湿度 ±5%RH通信方式单总线协议仅需1根GPIO供电3.3V~5V2. 单总线通信原理DHT11 采用单总线One-Wire协议仅一根数据线即可完成双向通信完整一次读取输出40位数据湿度整数位 湿度小数位 温度整数位 温度小数位 校验和校验规则前4个字节相加 校验和用于判断数据是否传输错误。二、硬件接线说明OLED DHT11 双外设1. 物料清单ESP32 开发板0.96寸 OLED 屏幕SSD1306I2C接口DHT11 温湿度传感器模块杜邦线若干2. 完整接线表器件引脚ESP32 引脚说明OLEDVCC3.3V供电OLEDGNDGND共地OLEDSCLGPIO9I2C时钟复用第06篇引脚OLEDSDAGPIO8I2C数据复用第06篇引脚DHT11VCC3.3V供电DHT11GNDGND共地DHT11DATAGPIO10单总线数据引脚工程提示I2C 总线可以继续挂载更多传感器DHT11 单独占用一个 GPIO两者互不冲突这就是总线型外设的优势。三、DHT11 驱动核心实现ESP-IDF 版1. 驱动核心思路单总线驱动的核心是严格控制时序主机拉低总线 ≥18ms发送起始信号释放总线等待 DHT11 响应拉低80us再拉高80us逐位读取 40 位数据每一位以 50us 低电平开头高电平时长代表 026~28us或 170us校验数据解析温湿度数值2. 完整 DHT11 驱动代码#includestdio.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includedriver/gpio.h#includeesp_log.h#defineDHT11_PINGPIO_NUM_10#defineTAGDHT11// 微秒级延时staticvoiddht11_delay_us(uint32_tus){ets_delay_us(us);}// 引脚模式切换staticvoiddht11_set_mode(gpio_mode_tmode){gpio_set_direction(DHT11_PIN,mode);}// 读取一位数据staticuint8_tdht11_read_bit(void){while(gpio_get_level(DHT11_PIN)0);// 等待50us低电平结束dht11_delay_us(30);// 延时30us后判断电平if(gpio_get_level(DHT11_PIN)1){while(gpio_get_level(DHT11_PIN)1);// 等待高电平结束return1;}return0;}// 读取一个字节staticuint8_tdht11_read_byte(void){uint8_tdata0;for(inti0;i8;i){data1;data|dht11_read_bit();}returndata;}// 完整读取温湿度esp_err_tdht11_read_data(float*temp,float*humi){uint8_thumi_int,humi_dec,temp_int,temp_dec,check_sum;// 1. 主机发送起始信号dht11_set_mode(GPIO_MODE_OUTPUT);gpio_set_level(DHT11_PIN,0);dht11_delay_us(20000);// 拉低至少18msgpio_set_level(DHT11_PIN,1);dht11_delay_us(30);// 释放总线等待响应// 2. 切换输入模式等待响应dht11_set_mode(GPIO_MODE_INPUT);// 检测响应信号80us低 80us高if(gpio_get_level(DHT11_PIN)0){while(gpio_get_level(DHT11_PIN)0);// 等80us低while(gpio_get_level(DHT11_PIN)1);// 等80us高// 3. 读取40位数据humi_intdht11_read_byte();humi_decdht11_read_byte();temp_intdht11_read_byte();temp_decdht11_read_byte();check_sumdht11_read_byte();// 4. 校验if(check_sumhumi_inthumi_dectemp_inttemp_dec){*humihumi_inthumi_dec*0.1f;*temptemp_inttemp_dec*0.1f;returnESP_OK;}}returnESP_FAIL;}四、整合 OLED温湿度实时显示完整工程直接复用第06篇的 OLED 驱动代码oled.c/oled.h/font.h无需重复编写体现模块化工程思想。主函数完整源码#includestdio.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includedriver/i2c.h#includeoled.h#includedht11.h#includeesp_log.h#defineTAGAPP_MAIN// I2C初始化复用第06篇配置staticvoidi2c_master_init(void){i2c_config_tconf{.modeI2C_MODE_MASTER,.sda_io_numGPIO_NUM_8,.scl_io_numGPIO_NUM_9,.sda_pullup_enGPIO_PULLUP_ENABLE,.scl_pullup_enGPIO_PULLUP_ENABLE,.master.clk_speed100000,};i2c_param_config(I2C_NUM_0,conf);i2c_driver_install(I2C_NUM_0,conf.mode,0,0,0);}voidapp_main(void){floattemperature0.0f;floathumidity0.0f;// 外设初始化i2c_master_init();oled_init();// 开机显示标题oled_show_string(0,0,ESP32 环境监测);oled_show_string(0,2,Temp: --.- C);oled_show_string(0,4,Humi: --.- %);oled_show_string(0,6,DHT11 OLED);vTaskDelay(pdMS_TO_TICKS(1000));while(1){// 读取温湿度esp_err_tretdht11_read_data(temperature,humidity);if(retESP_OK){ESP_LOGI(TAG,温度: %.1f℃ 湿度: %.1f%%,temperature,humidity);// 刷新OLED显示oled_show_num(48,2,(uint8_t)temperature,2);oled_show_char(64,2,.);oled_show_num(72,2,(uint8_t)(temperature*10)%10,1);oled_show_num(48,4,(uint8_t)humidity,2);oled_show_char(64,4,.);oled_show_num(72,4,(uint8_t)(humidity*10)%10,1);}else{ESP_LOGE(TAG,DHT11 读取失败);}// DHT11 读取间隔建议 ≥1秒vTaskDelay(pdMS_TO_TICKS(2000));}}工程目录结构建议project/ ├── main/ │ ├── app_main.c // 主逻辑 │ ├── oled.c // OLED驱动复用 │ ├── oled.h │ ├── dht11.c // DHT11驱动 │ ├── dht11.h │ ├── font.h // 字库 │ └── CMakeLists.txt ├── CMakeLists.txt └── sdkconfig五、新手关键知识点与优化方向1. 为什么读取间隔不能太短DHT11 内部 ADC 转换需要时间频繁读取会导致数据不准、器件发热官方建议采样间隔 ≥1秒本工程使用 2 秒刷新一次兼顾实时性与稳定性。2. 数据校验的重要性单总线抗干扰能力一般布线长、环境电磁干扰都会导致数据跳变。必须加校验和判断校验失败直接丢弃本次数据避免显示离谱数值。3. 进阶优化方案硬件上拉数据引脚增加 4.7K 上拉电阻提升长距离传输稳定性多次采样取平均连续读3次取平均值减小误差误差校准根据实际情况增加偏移量修正异常值过滤超出合理范围直接丢弃避免突变数值六、DHT11 高频踩坑汇总完全读不出数据一直失败检查接线是否正确、共地是否良好起始信号拉低时长是否足够必须 ≥18ms引脚模式切换是否正确输出转输入时机是否准确数据乱跳、数值离谱时序延时不准微秒级延时误差过大未做校验和判断错误数据直接使用读取频率太高器件未完成转换偶尔成功偶尔失败单总线抗干扰差远离强电、电源线增加上拉电阻缩短接线长度增加重试机制失败后自动重读温度正常湿度始终为0DHT11 小数位默认常为0属于正常现象低成本器件特性若整数位也为0检查数据位读取顺序是否正确下一篇预告08篇ESP-IDF保姆级入门08PWM 脉冲宽度调制 呼吸灯 蜂鸣器驱动实战掌握模拟输出、电机调速、音量控制的核心基础
返回列表