基于 Raspberry Pi Pico 2 C/C++ SDK 的 SGP30 空气质量监测器
采用设备主控Raspberry Pi Pico 2 (RP2350)传感器SGP30I2C 地址 0x58检测 eCO₂ 和 TVOC显示屏SSD1306 128×64 I2C OLED地址 0x3C接线方式Pico 2 引脚连接设备说明GPIO4SGP30 SDA软件 I2CGPIO4SGP30 SCL软件 I2CGPIO4SSD1306 SDA硬件 I2C0GPIO4SSD1306 SCL硬件 I2C03V3(OUT)VCC (两设备)供电GNDGND (两设备)共地两设备均使用 3.3V 供电共地程序一、SGP30 驱动库结构sgp30.h sgp30.c这两个文件是我从 STM32 的 HAL 库 和 Arduino UNO 的 Adafruit_SGP30 库 移植到 Pico SDK 上的。核心改动是把硬件 I2C 换成了软件模拟并保留了所有官方命令和 CRC 校验。头文件 sgp30.h 重点// 可自定义引脚默认 GPIO4/5 #define SGP30_SDA_PIN 4 #define SGP30_SCL_PIN 5 // 所有 SGP30 命令码 #define SGP30_CMD_INIT_AIR_QUALITY 0x2003 #define SGP30_CMD_MEASURE_AIR_QUALITY 0x2008 #define SGP30_CMD_SET_HUMIDITY 0x2061 // ... // 数据结构 typedef struct { uint16_t co2; // eCO₂ (ppm) uint16_t tvoc; // TVOC (ppb) uint8_t crc_ok; // 两段 CRC 是否全部通过 } sgp30_data_t; // 公开 API void SGP30_Init(void); uint8_t SGP30_Write(uint8_t cmd_high, uint8_t cmd_low); uint8_t SGP30_Read(sgp30_data_t *data); uint8_t SGP30_SetHumidity(uint16_t abs_humidity); uint8_t SGP30_GetBaseline(uint16_t *eco2, uint16_t *tvoc); uint8_t SGP30_SetBaseline(uint16_t eco2, uint16_t tvoc); uint8_t SGP30_SoftReset(void); uint8_t SGP30_MeasureTest(uint16_t *result); uint8_t SGP30_GetFeatureSet(uint16_t *version); uint8_t SGP30_MeasureRaw(uint16_t *ethanol, uint16_t *h2); uint8_t SGP30_CRC8(const uint8_t *data, uint8_t len);实现文件 sgp30.c 核心 – 软件 I2C// 起始条件 static void i2c_start(void) { SDA_HIGH(); SCL_HIGH(); DELAY_US(); SDA_LOW(); DELAY_US(); SCL_LOW(); DELAY_US(); } // 写一个字节 等待 ACK static void i2c_write_byte(uint8_t data) { for (int i 0; i 8; i) { (data 0x80) ? SDA_HIGH() : SDA_LOW(); data 1; DELAY_US(); SCL_HIGH(); DELAY_US(); SCL_LOW(); DELAY_US(); } } // 读一个字节可选择回复 ACK 或 NACK static uint8_t i2c_read_byte(uint8_t send_ack) { ... }CRC‑8 校验完全按照 SGP30 数据手册实现多项式 0x31初始值 0xFFuint8_t SGP30_CRC8(const uint8_t *data, uint8_t len) { uint8_t crc 0xFF; for (uint8_t i 0; i len; i) { crc ^ data[i]; for (uint8_t j 0; j 8; j) crc (crc 0x80) ? (crc 1) ^ 0x31 : (crc 1); } return crc; }二、主程序结构与功能pico-sgp30.c程序结构main() ├── stdio_init_all() // USB 串口调试输出 ├── ssd1306_init() // 硬件 I2C 初始化 OLED │ ├── i2c_init(i2c0, 400kHz) │ ├── 发送 OLED 初始化命令序列 │ └── 清屏 显示标题 SGP30 Sensor ├── SGP30_Init() // 软件 I2C 初始化 SGP30 │ └── 发送 init_air_quality 命令 └── while(1): ├── 发送 measure_air_quality 命令 ├── 读取 6 字节 CRC 校验 ├── 【预热阶段】(前 15 秒CO₂400, TVOC0) │ ├── OLED 显示倒计时 │ └── 串口打印剩余秒数 └── 【正常运行】 ├── OLED 显示 eCO₂ (ppm) TVOC (ppb) ├── 若 CRC 错误则额外显示 CRC FAIL! ├── 串口打印数据 └── sleep 2 秒OLED 显示布局128×648 个 pagePage内容0SGP30 Sensor (固定标题)2eCO2: 400 ppm (5位右对齐)4TVOC: 0 ppb (挥发性有机物浓度)6CRC FAIL! (仅出错时显示)关键代码片段 – 预热检测SGP30 传感器上电后前 15 秒会强制输出 CO₂400 ppm、TVOC0 ppb。主程序利用这一特性if (!warmed_up (now - start_ms) 15000 data.co2 400 data.tvoc 0) { uint32_t elapsed (now - start_ms) / 1000; snprintf(buf, sizeof(buf), Warm-up %lus... , 15 - elapsed); ssd1306_draw_string(2, 0, buf); printf(Warming up... %lu s remaining\n, 15 - elapsed); sleep_ms(1000); continue; }编译与烧录1. 前置工具Raspberry Pi Pico C/C SDK​https://github.com/raspberrypi/pico-sdkARM GCC 交叉编译器 (arm-none-eabi-gcc)CMake (≥ 3.13) Ninja2. 构建命令git clone https://github.com/jasonobama/pico-sgp30.git cd pico-sgp30 export PICO_SDK_PATH/path/to/pico-sdk # 设置 SDK 路径 cmake -B build -G Ninja . cmake --build build3. 烧录到 Pico 2按住 BOOTSEL 键插入 USB将 pico-sgp30.uf2 拖入弹出的 RPI-RP2 盘符程序自动运行OLED 点亮源码Raspberry Pi Pico C/C SDK​https://github.com/Jasonobama/pico-sgp30.git

相关新闻

Redpill Recovery (RR) 终极实战指南:从零构建企业级NAS系统的完整解决方案

Redpill Recovery (RR) 终极实战指南:从零构建企业级NAS系统的完整解决方案

Redpill Recovery (RR) 终极实战指南:从零构建企业级NAS系统的完整解决方案 【免费下载链接】rr Redpill Recovery (arpl-i18n) 项目地址: https://gitcode.com/gh_mirrors/rr2/rr 还在为搭建稳定可靠的黑群晖系统而烦恼?面对复杂的硬件兼容性问题…

2026/6/18 4:55:58阅读更多 →
微PE启动U盘无法打开的全面排查与修复指南

微PE启动U盘无法打开的全面排查与修复指南

1. 项目概述:当你的“救命稻草”突然失效相信很多朋友,无论是电脑维修店的老师傅,还是喜欢自己折腾系统的爱好者,手边都会备着一个微PE启动U盘。它小巧、纯净、功能强大,是系统崩溃、密码遗忘、硬盘分区时的“终极武器…

2026/6/18 4:50:58阅读更多 →
Windows 搭建 Hermes 智能代理,实测可行完整步骤

Windows 搭建 Hermes 智能代理,实测可行完整步骤

⚠️ 一、部署前重要须知 Hermes 运行过程中会涉及本地文件读写、第三方程序调用、环境自动配置等操作,部分 Windows 系统会弹出安全提示,杀毒软件也可能进行拦截。这类情况多出现在未数字签名的本地工具中,不代表程序存在风险。 正式部署前…

2026/6/18 4:50:58阅读更多 →
2026 年靠谱的程序员接活渠道有哪些值得选择

2026 年靠谱的程序员接活渠道有哪些值得选择

当下互联网行业灵活用工模式愈发普及,不少程序员会利用业余时间承接开发类项目,增加收入的同时积累实战经验。2026 年各类程序员接活渠道不断更新迭代,平台服务、资金保障、项目资源都出现了明显分化,如何从众多渠道里选出靠谱的选…

2026/6/18 6:11:03阅读更多 →
PersistentWindows:彻底告别Windows多显示器窗口错乱的终极解决方案

PersistentWindows:彻底告别Windows多显示器窗口错乱的终极解决方案

PersistentWindows:彻底告别Windows多显示器窗口错乱的终极解决方案 【免费下载链接】PersistentWindows fork of http://www.ninjacrab.com/persistent-windows/ with windows 10 update 项目地址: https://gitcode.com/gh_mirrors/pe/PersistentWindows 还…

2026/6/18 6:11:03阅读更多 →
VCF 生成器 Lite v6.0.0 发布:支持批量导入通讯录,多项功能升级与修复

VCF 生成器 Lite v6.0.0 发布:支持批量导入通讯录,多项功能升级与修复

VCF 生成器 Lite v6.0.0:批量导入与功能拓展VCF 生成器 Lite v6.0.0 正式发布,此次更新带来了批量导入手机通讯录这一重要功能,极大地方便了用户整理和管理联系人信息。同时,新增了多项功能,如翻译所有 CLI 内容&#…

2026/6/18 6:11:03阅读更多 →
空间滤波实战心法:从原理、选型到工业级避坑指南

空间滤波实战心法:从原理、选型到工业级避坑指南

1. 什么是空间滤波?它不是“加个模糊”那么简单“Spatial Filters: Introduction and Application”这个标题乍看像教科书章节名,但如果你真在图像处理、遥感解译、医学影像分析或工业视觉检测一线干过几年,就会明白——空间滤波根本不是Phot…

2026/6/18 6:11:03阅读更多 →
3步实现SolidWorks机械设计到ROS机器人模型的智能转换

3步实现SolidWorks机械设计到ROS机器人模型的智能转换

3步实现SolidWorks机械设计到ROS机器人模型的智能转换 【免费下载链接】solidworks_urdf_exporter SolidWorks to URDF Exporter 项目地址: https://gitcode.com/gh_mirrors/so/solidworks_urdf_exporter 你是否曾为将复杂的SolidWorks机械设计转换为ROS机器人模型而烦恼…

2026/6/18 6:11:03阅读更多 →
51单片机串口通信实操包:Keil工程+串口助手配置图+可烧录hex文件

51单片机串口通信实操包:Keil工程+串口助手配置图+可烧录hex文件

本文还有配套的精品资源,点击获取 简介:直接上手就能用的51单片机串口通信实验材料,包含完整Keil C51工程(.uvproj、.uvopt等)、main.c源码、编译好的template.hex文件,以及实际调试用的串口助手设置截图…

2026/6/18 6:06:03阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →