首页/新闻资讯/正文详情

基于 Raspberry Pi Pico 2 C/C++ SDK 的 SGP30 空气质量监测器

发布时间:2026/9/25 0:19:52 来源:云帆数科 栏目:资讯中心
基于 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/9/24 8:09:51

高通新芯片骁龙 Reality Elite 亮相,Xreal Aura 等产品有望迎来性能大提升!
高通新芯片骁龙 Reality Elite 亮相,Xreal Aura 等产品有望迎来性能大提升!

Xreal Aura 与高通新芯片震撼登场今年 5 月,体验 Xreal 与谷歌的 Project Aura 眼镜时,其强大得惊人的类 VR 体验令人震撼。这款眼镜如今被称为 Xreal Aura,将于今年秋季上市,能让用户在连接手机大小处理器模块的眼镜中&#xff0… · 2026/9/23 13:33:28

2026夏季防晒衣定制新趋势,你准备好了吗?
2026夏季防晒衣定制新趋势,你准备好了吗?

随着全球气温持续走高,防晒已从“可选项”变为“刚需”。2025年的一项行业调研显示,超过73%的企业采购负责人将“防晒功能”列为夏季工装的核心需求。但你知道吗?仅仅“防晒”已经不够用了,2026年的职场防晒衣正在经历一场从“遮阳… · 2026/9/23 16:15:15

Atlas 300V 24G上部署YOLO全流程:从ONNX到OM的推理加速实战
Atlas 300V 24G上部署YOLO全流程:从ONNX到OM的推理加速实战

最近这半年我基本每天都在跟 Atlas 平台打交道,前前后后折腾了 Atlas 300V 24G 推理卡、CANN 工具链、模型转换、推理服务上线,可以说把这条链路从无到有彻底摸了一遍。经常有人在群里问“Atlas 300V 24G 是运算加速卡吗”,也经常有人问“Atl… · 2026/9/25 16:27:49

UDS学习2
UDS学习2

在UDS学习1中学习的4.基于CAN总线的UDS诊断通信的网络传输层协议、5.UDS报文的四种帧型的区分和格式、6.基于 CAN 总线的 UDS 报文的多帧通信的网络层的 6 个时间参数都是关于ISO 15765-2规定的网络传输层的协议UDS协议是ISO 14229系列协议规定的协议内容,即14229即… · 2026/9/25 16:27:43

Claude Code Projects并行任务流实战:任务拆分、后台管理与冲突排查
Claude Code Projects并行任务流实战:任务拆分、后台管理与冲突排查

1. 从"单线程对话"到"并行任务流":Projects到底改了什么用Claude Code写代码的人大概都有过这种体验:你让它重构一个模块,它开始跑测试、改文件、分析依赖,整个过程你得盯着终端,生怕它中途卡住或… · 2026/9/25 16:27:43

机器学习目标定义:AI安全落地的关键与实战框架
机器学习目标定义:AI安全落地的关键与实战框架

1. 从一次模型上线事故说起:目标定义不清到底有多致命去年帮一个做工业质检的团队看他们线上模型的问题。模型在离线测试集上准确率97%,F1也在0.95以上,指标漂亮得可以拿去写论文。但上线跑了不到两周,产线那边就炸了——漏检率突… · 2026/9/25 16:27:43

基于SpringBoot的社区团购管理系统设计与实现:技术栈、背景意义与核心代码
基于SpringBoot的社区团购管理系统设计与实现:技术栈、背景意义与核心代码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着移动互联网和社区电商的快速发展,社区团购已成为连接社区居民与本地供应商的重要零售模式。传统社区团购多依赖微信群接龙、手工记账… · 2026/9/25 16:27:12

OpenCode 安装详细说明(Win系统版本):用 TaoToken 统一 Key 打通 opencode-ai 配置
OpenCode 安装详细说明(Win系统版本):用 TaoToken 统一 Key 打通 opencode-ai 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 16:27:06

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码