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(¶ms);
bmp280_init(&dev, ¶ms);
}
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 |
| BMP280 | I2C/SPI | bmp280.h |
| MPU6050 | I2C | mpu6050.h |
| AHT10 | I2C | aht10.h |
| SGP30 | I2C | sgp30.h |
| BH1750 | I2C | bh1750.h |
| MAX4466 | ADC | 直接读取 |
参考资料
传感器数据手册
- DHT11 数据手册 - DHT11 温湿度传感器规格
- DHT22 数据手册 - DHT22 高精度温湿度
- BMP280 数据手册 - BMP280 气压传感器
- MPU6050 数据手册 - MPU6050 六轴陀螺仪
- HC-SR04 数据手册 - 超声波测距模块
Arduino 库资源
- DHT Sensor Library - Adafruit DHT 库
- Adafruit BMP280 Library - BMP280 Arduino 库
- Adafruit MPU6050 Library - MPU6050 Arduino 库
- OneWire 库 - OneWire 总线库
- DallasTemperature 库 - DS18B20 温度库
ESP-IDF 驱动
- ESP-IDF bmp280 组件 - BMP280 官方驱动
- ESP-IDF mpu6050 组件 - MPU6050 官方驱动
图片参考

相关链接
反向链接
- 06_通信协议 - I2C、SPI、UART
- 07_网络通信 - WiFi、BLE、以太网
- 09_云平台接入 - MQTT、HTTP、阿里云、腾讯云
- 11_项目案例 - 完整项目实现
- README - 学习笔记索引首页