08 - 传感器集成

常见传感器驱动与使用

DHT11 温湿度传感器

硬件连接

ESP32         DHT11
GPIO4  ──────► Data
3.3V  ───────► VCC
GND   ───────► GND

驱动代码

#include "dht.h"
 
#define DHT_PIN GPIO_NUM_4
 
void dht_read(void)
{
    float temperature, humidity;
    esp_err_t err = dht_read_float(DHT_PIN, &humidity, &temperature);
 
    if (err == ESP_OK) {
        printf("Humidity: %.1f%%, Temperature: %.1f°C\n", humidity, temperature);
    } else {
        printf("DHT read error: %d\n", err);
    }
}

Arduino 库方式

#include <DHT.h>
 
DHT dht(GPIO_NUM_4, DHT11);
 
void setup() {
    dht.begin();
}
 
void loop() {
    float h = dht.readHumidity();
    float t = dht.readTemperature();
 
    if (!isnan(h) && !isnan(t)) {
        Serial.print("Humidity: ");
        Serial.print(h);
        Serial.print("%  Temperature: ");
        Serial.print(t);
        Serial.println("°C");
    }
    delay(2000);
}

BMP280 气压传感器

I2C 连接

ESP32         BMP280
GPIO21 ──────► SDA
GPIO22 ──────► SCL
3.3V  ───────► VCC
GND   ───────► GND

驱动代码

#include "bmp280.h"
#include "i2c_manager.h"
 
bmp280_params_t params;
bmp280_t dev;
 
void bmp280_init(void)
{
    dev.i2c_addr = 0x76;
    bmp280_init_default_params(&params);
    bmp280_init(&dev, &params);
}
 
void bmp280_read(void)
{
    float temperature, pressure;
    bmp280_read_float(&dev, &temperature, &pressure, NULL);
 
    printf("Temperature: %.2f°C, Pressure: %.2f Pa\n", temperature, pressure);
}

MPU6050 六轴传感器

初始化与读取

#include "mpu6050.h"
 
void mpu6050_init(void)
{
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (0x68 << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, 0x6B, true);  // PWR_MGMT_1
    i2c_master_write_byte(cmd, 0x00, true);  // 唤醒
    i2c_master_stop(cmd);
    i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000));
    i2c_cmd_link_delete(cmd);
}
 
void mpu6050_read(int16_t *ax, int16_t *ay, int16_t *az,
                  int16_t *gx, int16_t *gy, int16_t *gz)
{
    uint8_t data[14];
 
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (0x68 << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write_byte(cmd, 0x3B, true);  // ACCEL_XOUT_H
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (0x68 << 1) | I2C_MASTER_READ, true);
    i2c_master_read(cmd, data, 14, I2C_MASTER_LAST_NACK);
    i2c_master_stop(cmd);
    i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000));
    i2c_cmd_link_delete(cmd);
 
    *ax = (data[0] << 8) | data[1];
    *ay = (data[2] << 8) | data[3];
    *az = (data[4] << 8) | data[5];
    *gx = (data[8] << 8) | data[9];
    *gy = (data[10] << 8) | data[11];
    *gz = (data[12] << 8) | data[13];
}

超声波测距 (HC-SR04)

硬件连接

ESP32         HC-SR04
GPIO18 ──────► Trig
GPIO19 ──────► Echo
3.3V  ───────► VCC
GND   ───────► GND

驱动代码

#include "driver/gpio.h"
#include "driver/gptimer.h"
 
#define TRIG_PIN GPIO_NUM_18
#define ECHO_PIN GPIO_NUM_19
 
float hc_sr04_read(void)
{
    // 发送 Trig 脉冲
    gpio_set_level(TRIG_PIN, 1);
    ets_delay_us(10);
    gpio_set_level(TRIG_PIN, 0);
 
    // 等待 Echo 高电平开始
    uint32_t start = 0;
    while (gpio_get_level(ECHO_PIN) == 0) {
        start = esp_log_timestamp();
    }
 
    // 等待 Echo 高电平结束
    uint32_t end = 0;
    while (gpio_get_level(ECHO_PIN) == 1) {
        end = esp_log_timestamp();
    }
 
    // 计算距离 (单位: cm)
    float distance = (end - start) * 0.0343 / 2;
    return distance;
}

DS18B20 温度传感器

OneWire 连接

ESP32         DS18B20
GPIO4  ──────► Data (需接4.7kΩ上拉)
3.3V  ───────► VCC
GND   ───────► GND

库函数

#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS GPIO_NUM_4
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
void setup() {
    sensors.begin();
}
 
void loop() {
    sensors.requestTemperatures();
    float tempC = sensors.getTempCByIndex(0);
 
    if (tempC != DEVICE_DISCONNECTED_C) {
        Serial.print("Temperature: ");
        Serial.print(tempC);
        Serial.println("°C");
    }
    delay(1000);
}

光敏传感器

ADC 读取

#include "driver/adc.h"
 
void photosensor_init(void)
{
    adc1_config_width(ADC_WIDTH_BIT_12);
    adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
}
 
int photosensor_read(void)
{
    return adc1_get_raw(ADC1_CHANNEL_6);
}
 
// 转换为光照强度 (lux)
float photosensor_to_lux(int raw_value)
{
    // 简单转换公式,需根据传感器特性调整
    float voltage = raw_value * 3.3 / 4095;
    float resistance = (10000 * voltage) / (3.3 - voltage);
    return 500 / (resistance / 1000);  // 近似公式
}

传感器驱动资源

传感器协议库/驱动
DHT11/DHT22单总线dht.h
BMP280I2C/SPIbmp280.h
MPU6050I2Cmpu6050.h
AHT10I2Caht10.h
SGP30I2Csgp30.h
BH1750I2Cbh1750.h
MAX4466ADC直接读取

参考资料

传感器数据手册

Arduino 库资源

ESP-IDF 驱动

图片参考

DHT11 传感器引脚


相关链接

反向链接

进阶学习


下一步