RT-Thread 第 6 课时:I2C/SPI 外设驱动 + AHT10 温湿度 + OLED 屏幕实战

张开发
2026/4/10 19:27:09 15 分钟阅读

分享文章

RT-Thread 第 6 课时:I2C/SPI 外设驱动 + AHT10 温湿度 + OLED 屏幕实战
前言导读上一节课掌握了PIN、UART 标准设备驱动本节课进阶两大通信总线I2C、SPI搭配真实外设实战AHT10 温湿度传感器、OLED 显示屏。学完直接打通嵌入式常用外设开发能把传感器数据采集 屏幕显示做成完整小型项目。前置基础熟练 RT-Thread 设备框架、线程、消息队列、会用 FinSH。一、课时学习目标理解 I2C / SPI 总线原理与 RT-Thread 标准驱动 API学会使用软件 I2C / 硬件 I2C 适配传感器实现 AHT10 温湿度数据读取实现 SPI/I2C OLED 屏幕汉字 / 数字显示掌握外设标准开发流程可快速移植其他传感器二、基础概念I2C SPI 总线区别2.1 I2C 总线两根线SCL 时钟、SDA 数据支持多设备挂载、地址寻址速率偏低适合温湿度、EEPROM、实时时钟RT-Thread统一i2c_bus设备管理2.2 SPI 总线四根线SCK、MOSI、MISO、CS 片选速率快全双工适合OLED、Flash、显示屏、高速外设2.3 RT-Thread 统一优势不用裸机模拟时序直接调用标准 API换芯片不改业务代码。三、实战 1I2C 驱动 — AHT10 温湿度采集3.1 开发准备开启工程 I2C 设备驱动挂载 AHT10 到 I2C1 总线沿用 RT-Thread 标准 I2C 读写 API3.2 I2C 核心标准 API// 查找I2C总线 rt_i2c_bus_device_t rt_i2c_bus_device_find(const char *bus_name); // I2C读写接口 rt_size_t rt_i2c_transfer(rt_i2c_bus_device_t bus, struct rt_i2c_msg msgs, rt_uint32_t num);3.3 AHT10 完整采集 Demo#include rtthread.h #include rtdevice.h #define I2C_BUS_NAME i2c1 #define AHT10_ADDR 0x38 rt_i2c_bus_device_t aht10_bus; // 读取温湿度 void aht10_read_data(float *temp, float *humi) { rt_uint8_t wbuf[3] {0xAC, 0x33, 0x00}; rt_uint8_t rbuf[6] {0}; struct rt_i2c_msg msg_w { .addr AHT10_ADDR, .flags RT_I2C_WR, .buf wbuf, .len 3 }; struct rt_i2c_msg msg_r { .addr AHT10_ADDR, .flags RT_I2C_RD, .buf rbuf, .len 6 }; rt_i2c_transfer(aht10_bus, msg_w, 1); rt_thread_mdelay(80); rt_i2c_transfer(aht10_bus, msg_r, 1); // 数据解析 *humi (rbuf[1] 12 | rbuf[2] 4 | rbuf[3] 4) * 100.0 / 1048576.0f; *temp ((rbuf[3] 0x0F) 16 | rbuf[4] 8 | rbuf[5]) * 200.0 / 1048576.0f - 50.0f; } void sensor_thread(void *arg) { float t,h; while(1) { aht10_read_data(t,h); rt_kprintf(Temp:%.2f ℃ | Humi:%.2f %%RH\r\n,t,h); rt_thread_mdelay(2000); } } int main(void) { aht10_bus rt_i2c_bus_device_find(I2C_BUS_NAME); if(!aht10_bus) { rt_kprintf(未找到I2C总线\r\n); return -1; } rt_thread_t t rt_thread_create(aht10,sensor_thread,RT_NULL,1024,15,10); rt_thread_startup(t); return 0; }四、实战 2SPI/I2C OLED 屏幕显示4.1 OLED 开发要点RT-Thread 开启 OLED 软件包 / 底层 SPI/I2C 驱动常用0.96 寸 I2C OLED简单省引脚支持字符、数字、汉字、图片4.2 简易显示逻辑对接传感器把上一节 AHT10 读到的温湿度直接刷新到 OLED第一行Temp: 25.6 ℃第二行Humi: 58.2 % RH4.3 工程标准架构采集线程AHT10→ 消息队列 → 屏幕刷新线程避免频繁刷屏、阻塞采集。五、FinSH 调试外设必用命令list_i2c # 查看挂载的I2C设备与地址 list_device # 查看I2C/SPI总线是否注册成功常见问题找不到 I2C 总线BSP 未开启、引脚错传感器读全 0设备地址错误、接线 SDA/SCL 反了六、本节课核心总结I2C 适合低速传感器温湿度、EEPROMSPI 适合高速屏幕、Flash一律用 RT-Thread 标准总线 API不手写裸机时序传感器采集单独线程屏幕刷新单独线程用消息队列解耦外设调试优先用list_i2c / list_device排查七、课后作业将 AHT10 数据同时打印串口 刷新 OLED 屏幕修改 I2C 地址适配其他同款传感器加按键线程切换 OLED 显示界面纯温度 / 纯湿度 / 全屏下一课预告第 7 课时文件系统 FatFS ULOG 日志组件实现温湿度数据本地存 Flash/SD 卡、分级日志打印进阶项目落地必备。如果觉得本文对你有帮助欢迎点赞收藏关注后续会持续更新rt-thread 新手实战教程陪你从入门到精通日常深耕嵌入式、物联网、协议开发相关技术有技术答疑、项目合作、毕设指导需求均可私信私聊

更多文章