1. 我的硬件
FireBeetle 2 ESP32-C5如下图所示:

ESP32-C5
1.1. 相关资源介绍
处理器:RISC-V单核处理器
时钟频率:240 MHz
内存:384 KB
电子模块: 320 KB
闪存:4 MB
LP SRAM:16 KB
数字 I/O x18
带 6 通道的 LED PWM 控制器
SPI x1
UART x3 (LP UART x1)
I2C x2 (LP I2C x1)
I2S x1
红外收发器:5个发射通道,5个接收通道
1 个 12 位 SAR ADC,带 7 个通道
DMA 控制器,具有 3 个接收通道和 3 个发射通道
1.2. 接口

1.3. 原理图

1.4. BMP180传感器模块
需要个人采购哦,可以从淘宝购买。

1.5. 显示模块0.96 128X64
可以在立创购买。
HS96L03W2C03中文资料_最新报价_数据手册下载_HS(汉昇)-OLED显示屏-立创商城


1.6. 硬件连接:
基于IIC进行连接。由于杜邦线连接不可靠,这里基于面包板进行连接。

1.7. IO使用
GND,3.3V,SDA,SCL。
2. 软件开发
采用arduino平台
2.1. 库安装
2.2. 代码实现
2.3. 编译和上传:
2.4. 串口数据接收
2.5. 验证效果:
视频链接如下:
【FireBeetle 2 ESP32-C5】基于arduino的室内气压温度计_哔哩哔哩_bilibili
#include <Arduino.h>
#include <Wire.h>
#include <BMP180I2C.h>
#define I2C_ADDRESS 0x77
//create an BMP180 object using the I2C interface
BMP180I2C bmp180(I2C_ADDRESS);
#include "SSD1306Wire.h" // legacy include: `#include "SSD1306.h"`
#define SDA 9
#define SCL 10
// Initialize the OLED display using Wire library
SSD1306Wire display(0x3c, SDA, SCL); // ADDRESS, SDA, SCL - SDA and SCL usually populate automatically based on your board's pins_arduino.h e.g. https://github.com/esp8266/Arduino/blob/master/variants/nodemcu/pins_arduino.h
void setup() {
display.init();
// display.flipScreenVertically();
display.setContrast(255);
display.setFont(ArialMT_Plain_16); // 16像素高字体
Serial.begin(9600);
//wait for serial connection to open (only necessary on some boards)
while (!Serial)
;
Wire.setPins(9, 10);
Wire.begin();
//begin() initializes the interface, checks the sensor ID and reads the calibration parameters.
if (!bmp180.begin()) {
Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
while (1)
;
}
//reset sensor to default parameters.
bmp180.resetToDefaults();
//enable ultra high resolution mode for pressure measurements
bmp180.setSamplingMode(BMP180MI::MODE_UHR);
}
float t, p;
void loop() {
// put your main code here, to run repeatedly:
delay(1000);
//start a temperature measurement
if (!bmp180.measureTemperature()) {
Serial.println("could not start temperature measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do {
delay(100);
} while (!bmp180.hasValue());
t = bmp180.getTemperature();
//start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure
//measurement immediately after a temperature measurement.
if (!bmp180.measurePressure()) {
Serial.println("could not start perssure measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do {
delay(100);
} while (!bmp180.hasValue());
p = bmp180.getPressure();
String t1 = String(t, 1); // 保留两位小数
String p1 = String(p, 1); // 保留两位小数
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Temperature:");
display.drawString(0, 16, t1);
display.drawString(0, 32, "Pressure:");
display.drawString(0, 48, p1);
display.display();
Serial.printf("温度:%8.1f℃\r\n", t);
Serial.printf("压强:%8.1fPa\r\n", p);
}
评论