ESP32基础入门

第9课:SPI/I2C总线应用 - 驱动OLED屏幕与读取温湿度传感器

课程简介

本课程将介绍ESP32如何使用SPI和I2C总线与外部设备通信,重点讲解如何驱动SSD1306 OLED屏幕和读取BME280温湿度传感器的数据。

所需硬件

ESP32开发板

如ESP32-WROOM-32或ESP32-DevKitC

SSD1306 OLED屏幕

0.96英寸,128x64分辨率,支持I2C或SPI接口

BME280传感器

集成温度、湿度、气压测量,支持I2C或SPI接口

连接线

杜邦线若干,用于连接各设备

1. 驱动OLED屏幕(SSD1306)

硬件连接(I2C接口)

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);
}
        

注意:如果屏幕不显示内容,请检查:

2. 读取温湿度传感器(BME280)

硬件连接(I2C接口)

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显示温湿度数据

将前面两部分结合起来,创建一个在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,具体取决于模块上的跳线设置。如果无法初始化,请尝试更改地址。

客服小姐姐(优先添加)

客服小姐姐(优先添加)

扫描二维码联系客服

客服微信