源码下载
01 和 02 是不同代码,不要互相覆盖。客户如果看的是这页,就下载 01 源码包。
BMI160 单测源码包
单独测试 BMI160 的 X/Y/Z 数据,包含 main.ino、config.h、lv_conf.h、PlatformIO 配置和接线说明。
这页主要讲什么
硬件对象
ESP32-2432S028R,常叫 ESP32 2.8 黄屏 / CYD,带 2.8 寸 TFT 屏和触摸功能。
源码重点
屏幕 UI、触摸、WiFi 配网、天气空气数据、番茄计时、BMI160 姿态读数。
客户用法
先下载源码包,按说明打开 .ino 或 PlatformIO 工程,再根据自己的串口和 WiFi 修改。
不要混用
02 的 DeepWarpHUD 代码结构更精简,是新视频使用的独立版本。
BMI160 Single Test UI
BMI160 单独测试 UI
接线表
| BMI160 模块 | ESP32 黄屏 | 说明 |
|---|---|---|
| VCC | 3V3 | 建议 3.3V 供电 |
| GND | GND | 必须共地 |
| SCL | IO22 | I2C 时钟线 |
| SDA | IO27 | I2C 数据线 |
排查顺序
- 先看屏幕能不能正常亮。
- 再确认 BMI160 地址能扫到
0x68或0x69。 - 最后轻轻晃动模块,看 X/Y/Z 数值是否变化。
- 测试 BMI160 时先关闭自动横竖屏,避免晃动后页面跳转。
BMI160 有用源码
下面这些是当前源码里最值得客户看的部分:接线常量、I2C 寄存器读写、BMI160 初始化、读取 X/Y/Z,以及主循环里怎么刷新页面。完整程序仍然以源码 ZIP 为准。
#include <lvgl.h> #include <TFT_eSPI.h> #include <Wire.h> #include <math.h> #include <WiFi.h> #include <WebServer.h> #include <DNSServer.h> #include <Preferences.h> #include <time.h> #include <sys/time.h>
#define BMI_SDA_PIN 27 #define BMI_SCL_PIN 22 static uint8_t bmiAddr = 0; // 0 = 没找到
static bool bmiWriteReg(uint8_t reg, uint8_t val) {
Wire.beginTransmission(bmiAddr);
Wire.write(reg);
Wire.write(val);
return Wire.endTransmission() == 0;
}
static bool bmiReadRegs(uint8_t reg, uint8_t *buf, uint8_t len) {
Wire.beginTransmission(bmiAddr);
Wire.write(reg);
if (Wire.endTransmission(false) != 0) return false;
Wire.requestFrom((int)bmiAddr, (int)len);
for (uint8_t i = 0; i < len; i++) {
if (!Wire.available()) return false;
buf[i] = Wire.read();
}
return true;
}
static bool bmiInit() {
Wire.begin(BMI_SDA_PIN, BMI_SCL_PIN);
Wire.setTimeOut(50);
Wire.setClock(400000);
uint8_t candidates[2] = {0x68, 0x69};
for (uint8_t i = 0; i < 2; i++) {
bmiAddr = candidates[i];
uint8_t chipId = 0;
if (bmiReadRegs(0x00, &chipId, 1) && chipId == 0xD1) {
bmiWriteReg(0x7E, 0x11); // 加速度计 normal 模式
delay(50);
bmiWriteReg(0x40, 0x28); // ACC_CONF:100Hz
bmiWriteReg(0x41, 0x03); // ACC_RANGE:+-2g
return true;
}
}
bmiAddr = 0;
return false;
}
static bool bmiReadAccel(float &ax, float &ay, float &az) {
if (!bmiAddr) return false;
uint8_t raw[6];
if (!bmiReadRegs(0x12, raw, 6)) return false;
int16_t rx = (int16_t)((raw[1] << 8) | raw[0]);
int16_t ry = (int16_t)((raw[3] << 8) | raw[2]);
int16_t rz = (int16_t)((raw[5] << 8) | raw[4]);
const float scale = 2.0f / 32768.0f; // +-2g 量程
ax = rx * scale;
ay = ry * scale;
az = rz * scale;
return true;
}
bool ok = bmiInit();
Serial.println(ok ? "BMI160 OK" : "BMI160 NOT FOUND");
if (dbgLabel) {
lv_label_set_text(dbgLabel, ok ? "BMI160 OK" : "BMI160 NOT FOUND");
}
static uint32_t lastBmiMs = 0;
if (now - lastBmiMs > 120) {
lastBmiMs = now;
float ax = 0, ay = 0, az = 0;
if (bmiReadAccel(ax, ay, az)) {
handlePomodoroGesture(ax, ay, now);
if (activeScene == 2 && !pomodoroScreenShown) {
updateBmiTestPage(ax, ay, az);
}
}
}
BMI160 单测视频
这条视频对应本页新增的 BMI160 单独测试 UI。它和 02 DeepWarpHUD 是不同代码,不要混用。