arduino esp32s3光照传感器
时间: 2025-06-05 14:32:05 浏览: 26
### 关于Arduino和ESP32-S3与光照传感器的教程及代码示例
#### 硬件连接
在使用Arduino或ESP32-S3开发板与光照传感器(如BH1750)时,硬件连接是关键步骤。以下为常见的接线方式[^1]:
- VCC:连接到开发板的3.3V或5V电源引脚。
- GND:连接到开发板的地(GND)引脚。
- SDA:连接到开发板的I2C数据引脚(ESP32-S3通常为GPIO21)。
- SCL:连接到开发板的I2C时钟引脚(ESP32-S3通常为GPIO22)。
#### 示例代码
以下是基于ESP32-S3和BH1750光照传感器的示例代码,用于读取环境光强度并在OLED屏幕上显示结果:
```cpp
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// BH1750 I2C address is 0x23 (default) or 0x5C (extended)
#define BH1750_I2C_ADDR 0x23
void setup() {
Wire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
}
float readLightIntensity() {
Wire.beginTransmission(BH1750_I2C_ADDR);
Wire.write(0x10); // Start measurement at 1 lux resolution
Wire.endTransmission();
delay(180); // Wait for the conversion to complete
Wire.requestFrom(BH1750_I2C_ADDR, 2);
if (Wire.available() == 2) {
uint16_t val = Wire.read() << 8 | Wire.read();
return (val / 1.2); // Convert to lux
}
return 0;
}
void loop() {
float lux = readLightIntensity();
display.clearDisplay();
display.setCursor(0, 0);
display.print("Lux: ");
display.println(lux);
display.display();
delay(1000);
}
```
#### 注意事项
- 在使用BH1750传感器时,确保I2C总线上的上拉电阻已正确配置,通常为4.7kΩ[^1]。
- 如果使用其他类型的光照传感器(如光敏电阻),可能需要通过模数转换器(ADC)读取模拟信号[^2]。
- ESP32-S3开发板内置了多个ADC通道,可直接用于读取模拟信号[^3]。
#### 实验现象
运行上述代码后,OLED屏幕将实时显示当前环境的光照强度值(单位:lux)。随着光线变化,显示的数值也会相应调整[^1]。
阅读全文
相关推荐

















