第9课:SPI/I2C总线应用 - 驱动OLED屏幕与读取温湿度传感器
本课程将介绍ESP32如何使用SPI和I2C总线与外部设备通信,重点讲解如何驱动SSD1306 OLED屏幕和读取BME280温湿度传感器的数据。
如ESP32-WROOM-32或ESP32-DevKitC
0.96英寸,128x64分辨率,支持I2C或SPI接口
集成温度、湿度、气压测量,支持I2C或SPI接口
杜邦线若干,用于连接各设备
ESP32 ↔ SSD1306 OLED连接示意图
3.3V ↔ VCC
GND ↔ GND
GPIO21 ↔ SDA
GPIO22 ↔ SCL
我们将使用Adafruit的SSD1306库和GFX库:
// 在Arduino IDE中安装以下库:
// 1. Adafruit SSD1306
// 2. Adafruit GFX Library
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306分配失败");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Hello, ESP32!");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
display.setCursor(0,0);
display.println("ESP32 OLED测试");
display.println("----------------");
display.print("时间: ");
display.println(millis() / 1000);
display.display();
delay(1000);
}
注意:如果屏幕不显示内容,请检查:
ESP32 ↔ BME280连接示意图
3.3V ↔ VCC
GND ↔ GND
GPIO21 ↔ SDA
GPIO22 ↔ SCL
我们将使用Adafruit的BME280库:
// 在Arduino IDE中安装以下库:
// 1. Adafruit BME280 Library
// 2. Adafruit Unified Sensor
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
if (!bme.begin(0x76)) {
Serial.println("无法找到BME280传感器,请检查接线!");
while (1);
}
}
void loop() {
Serial.print("温度 = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("气压 = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("湿度 = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.print("海拔 = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.println();
delay(2000);
}
小技巧:可以将BME280的数据显示在OLED屏幕上,创建一个完整的温湿度监测系统!
将前面两部分结合起来,创建一个在OLED屏幕上显示温湿度数据的完整项目。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
// 初始化OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306分配失败");
for(;;);
}
// 初始化BME280
if (!bme.begin(0x76)) {
Serial.println("无法找到BME280传感器,请检查接线!");
while (1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("初始化完成...");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
display.setCursor(0,0);
display.println("环境监测系统");
display.println("----------------");
display.print("温度: ");
display.print(bme.readTemperature());
display.println(" C");
display.print("湿度: ");
display.print(bme.readHumidity());
display.println(" %");
display.print("气压: ");
display.print(bme.readPressure() / 100.0F);
display.println(" hPa");
display.display();
delay(5000);
}
注意:BME280的I2C地址可能是0x76或0x77,具体取决于模块上的跳线设置。如果无法初始化,请尝试更改地址。
客服小姐姐(优先添加)
扫描二维码联系客服