一种基于 GP2Y1014AU0F 传感器的 Arduino 空气质量检测系统


豆饼
原创
发布时间: 2026-02-07 11:45:55 | 阅读数 0收藏数 0评论数 0
封面
空气污染已成为我国许多城市面临的突出环境问题,空气质量状况持续受到广泛关注。世界卫生组织相关报告显示,空气中有害细颗粒物造成的健康危害已十分严重,其导致的过早死亡人数已超过交通事故死亡人数。同时,相关环境监测研究表明,室内空气污染程度往往可达室外空气的 2~5 倍,对人体健康构成潜在威胁。因此,研制一款结构简单、成本低廉、便于使用的空气质量监测装置,具有重要的现实意义与应用价值。本项目通过实时检测空气中粉尘颗粒物浓度,实现对周边空气质量的直观监测与反馈。

准备工作:

材料:

  1. Arduino Nano
  2. 夏普 GP2Y1014AU0F 传感器
  3. 0.96英寸SPI OLED显示模块
  4. 跳线
  5. 220 µF 电容器
  6. 150 Ω 电阻器


1

GP2Y1014AU0F 传感器讲解

夏普 GP2Y1014AU0F 是一款六引脚、模拟输出型微型光学粉尘(颗粒物)传感器,主要用于检测空气中的悬浮粉尘颗粒,其检测原理基于光散射法

传感器内部结构中,红外发射二极管(IR LED)与光电探测器沿进气通道呈对角布局。当含尘空气经进气孔进入传感器内部检测腔室时,粉尘颗粒会对红外 LED 发出的光线产生散射作用,部分散射光入射至光电探测器并被其接收。

散射光的强度与空气中粉尘颗粒的浓度直接相关:颗粒数量越多、浓度越高,散射光强度越大。传感器通过内部电路将光信号转换为电信号,最终由 VOUT 引脚输出与粉尘浓度成正比的模拟电压信号,实现对空气中粉尘浓度的实时检测与输出。

如图1所示


如图2所述,GP2Y1014AU0F传感器采用 6针连接器。下图和表格显示了GP2Y1014AU0F的引脚分配:


序号

别针名称

引脚描述

1

V-LED

LED Vcc引脚。通过150Ω电阻连接至5V电源。

2

LED接地

LED接地引脚。连接到GND

3

引领

用于切换 LED 的亮灭状态。可连接至 Arduino 的任意数字引脚。

4

S-GND

传感器接地引脚。连接到 Arduino 的 GND。

5

V输出

传感器模拟输出引脚。连接至任意模拟引脚

6

V CC

正极电源引脚。连接到 Arduino 的 5V 电源。

GP2Y1014AU0F 传感器规格:

  1. 低功耗:最大 20mA
  2. 典型工作电压:4.5V 至 5.5V
  3. 最小可检测粉尘尺寸:0.5微米
  4. 粉尘密度检测范围:最高可达 580 微克/立方米
  5. 感应时间:小于 1 秒
  6. 尺寸:1.81 x 1.18 x 0.69 英寸(46.0 x 30.0 x 17.6 毫米)


2

OLED显示模块

本项目采用0.96 英寸单色 OLED 显示屏,驱动芯片为SSD1306,模块共 7 个引脚,支持多种串行通信方式,可灵活适配不同主控接口。该模块支持三种通信协议:3 线 SPI 模式、4 线 SPI 模式与 I²C 模式,可根据硬件接线与程序配置进行选择。

引脚定义与功能说明 如下



引脚名称

常用别名

功能描述

GND

GND、地

电源地引脚,为模块提供参考地电位。

VDD

VCC、5V

电源供电引脚,兼容宽电压输入(典型 3.3V–5V)。

SCK

D0、SCL、CLK

串行时钟引脚,I²C 与 SPI 通信共用,用于同步数据传输时序。

SDA

D1、MOSI

串行数据引脚,I²C 与 SPI 通信共用,用于传输命令与显示数据。

RES

RST、RESET

模块硬件复位引脚(低电平有效),在 SPI 通信与上电初始化时尤为关键。

DC

A0

数据 / 命令选择引脚,仅在 SPI 模式 下使用,用于区分传输内容为命令或数据。

CS

CS、Chip Select

片选引脚,仅在 SPI 模式 下使用,多用于多模块总线复用,实现芯片寻址与使能。

OLED 核心电气与显示参数

  1. 驱动芯片:SSD1306
  2. 分辨率:128 × 64
  3. 显示颜色:单色(蓝色)
  4. 可视角度:>160°
  5. 工作电压:3.3V~6V
  6. 工作温度:-30℃ ~ +70℃


3

电路图

如图是夏普GP2Y1014AU0F传感器与Arduino接口的电路图


本系统硬件电路设计简洁,核心为 Arduino Nano 主控板GP2Y1014AU0F 粉尘传感器0.96 英寸 SSD1306 OLED 显示屏 的电气连接。

  1. 供电设计:GP2Y1014AU0F 粉尘传感器与 OLED 显示模块均由 Arduino Nano 的 +5V 电源引脚供电,GND 引脚共地,保证电位参考一致;
  2. 信号交互:传感器模拟输出与控制引脚接入 Arduino 模拟 / 数字接口,OLED 模块通过 SPI 总线与 Arduino 通信,实现数据显示。

1. OLED 显示模块与 Arduino Nano 连接表




序号

OLED 模块引脚

Arduino Nano 引脚

备注

1

GND

GND(地)

电源地,共地连接

2

VCC

5V

模块供电(兼容 3.3V/5V)

3

D0 (SCK)

10

SPI 串行时钟引脚

4

D1 (MOSI)

9

SPI 串行数据输入引脚

5

RES (RST)

13

模块硬件复位引脚

6

DC (A0)

11

SPI 数据 / 命令选择引脚

7

CS

12

SPI 片选引脚(低电平有效)

2. GP2Y1014AU0F 粉尘传感器与 Arduino Nano 连接表

表格





序号

传感器引脚

Arduino Nano 引脚

备注

1

Vcc

5V

传感器主电源供电引脚

2

V0 (VOUT)

A5

模拟电压输出引脚(粉尘浓度对应电压)

3

S-GND

GND(地)

传感器信号地,与电源地共地

4

LED

7

传感器红外 LED 控制引脚(数字电平控制)

5

LED-GND

GND(地)

红外 LED 回路地,与信号地共地

6

V-LED

5V(串 150Ω 电阻)

红外 LED 供电引脚,串联 150Ω 限流电阻防过流


4

搭建

将所有元器件焊接在万用板(洞洞板)上后,整体硬件电路连接关系即可成型;若无焊接条件,也可使用面包板进行临时搭建与调试。本项目中,GP2Y1014AU0F 粉尘传感器与此前用于连接 SDS011 传感器的万用板共用,直接在同一块板上完成焊接与布线。焊接过程中需注意:各焊点、焊盘之间应保持足够间距,避免因焊锡粘连造成短路,确保电路可靠工作。

5

空气质量代码讲解

所需库

本项目使用 Adafruit_GFXAdafruit_SSD1306 库。可通过 Arduino IDE 安装:

  1. 打开 Arduino IDE,依次点击 “项目” → “包含库” → “管理库”
  2. 搜索 Adafruit GFX 并安装由 Adafruit 提供的库。
  3. 同理,搜索并安装 Adafruit SSD1306 库。

灰尘传感器无需额外库,通过 Arduino 模拟引脚直接读取电压即可。


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

OLED 显示屏设置

定义显示屏分辨率(本项目使用 128×64 SPI OLED,可根据实际屏幕调整):


#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

定义 SPI 接口引脚:


#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13

创建 OLED 显示实例:


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

灰尘传感器与 LED


int sensePin = A5; // 传感器模拟输出
int ledPin = 7; // 红外 LED 控制

setup() 初始化


Serial.begin(9600); // 串口调试
display.begin(SSD1306_SWITCHCAPVCC); // 初始化 OLED

loop() 主循环

  1. 打开红外 LED,延迟 0.28 毫秒。
  2. 读取传感器模拟电压,延迟 40 微秒。
  3. 关闭 LED 并等待剩余周期时间 9680 微秒(保证每 10 毫秒闪烁一次)。

digitalWrite(ledPin, LOW);
delayMicroseconds(280);
outVo = analogRead(sensePin);
delayMicroseconds(40);
digitalWrite(ledPin, HIGH);
delayMicroseconds(9680);

粉尘密度计算


sigVolt = outVo * (5.0 / 1024); // 将模拟值转换为电压
dustLevel = 0.17 * sigVolt - 0.1; // 粉尘密度公式

OLED 显示粉尘密度


display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("灰尘");
display.println("密度");

display.setTextSize(3);
display.println(dustLevel);

display.display(); // 更新 OLED 显示
display.clearDisplay(); // 清空显示,为下一次刷新准备


6

完整内容

硬件和代码都准备妥当后,就可以开始传感器的测试工作了。你需要先把 Arduino 通过数据线连接到笔记本电脑,在 Arduino IDE 里选好对应的开发板型号和串口端口,接着点击上传按钮。上传完成后,OLED 显示屏就会像如图这样,实时显示出当前环境的灰尘浓度数值。



完整代码如下 效果如图所示

#include <SPI.h> // SPI 通信库
#include <Adafruit_GFX.h> // 图形绘制库
#include <Adafruit_SSD1306.h> // OLED 驱动库

// OLED 显示屏分辨率
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// OLED 使用软件 SPI 时的引脚定义
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13

// 创建 OLED 显示实例
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// 灰尘传感器模拟输出引脚
int measurePin = A5;
// 红外 LED 控制引脚
int ledPower = 7;

// 变量用于保存传感器值、电压和灰尘浓度
float voMeasured = 0; // 传感器原始模拟值 (0-1023)
float calcVoltage = 0; // 传感器电压值
float dustDensity = 0; // 计算得到的灰尘浓度

void setup(){
Serial.begin(9600); // 初始化串口,用于调试
pinMode(ledPower, OUTPUT); // 设置 LED 引脚为输出

display.begin(SSD1306_SWITCHCAPVCC); // 初始化 OLED 显示屏
display.clearDisplay(); // 清空显示缓冲区
display.display(); // 更新显示屏(显示空白)
}

void loop(){
// ---- 读取灰尘传感器 ----
digitalWrite(ledPower, LOW); // 打开红外 LED
delayMicroseconds(280); // 等待 0.28 毫秒,保证光线稳定
voMeasured = analogRead(measurePin); // 读取传感器模拟值
delayMicroseconds(40); // 等待 40 微秒,确保数据稳定
digitalWrite(ledPower, HIGH); // 关闭红外 LED
delayMicroseconds(9680); // 等待剩余周期时间,保证每 10ms 一次采样

// ---- 计算灰尘浓度 ----
calcVoltage = voMeasured * (5.0 / 1024); // 模拟值转换为电压
dustDensity = 0.17 * calcVoltage - 0.1; // 粉尘浓度公式 (mg/m³)
if (dustDensity < 0) {
dustDensity = 0.0; // 防止负值
}

// ---- 串口调试输出 ----
Serial.println("Raw Signal Value (0-1023):");
Serial.println(voMeasured);
Serial.println("Voltage (V):");
Serial.println(calcVoltage);
Serial.println("Dust Density (ug/m3):");
Serial.println(dustDensity);

// ---- OLED 显示灰尘浓度 ----
display.setTextSize(1); // 设置小号字体
display.setTextColor(WHITE); // 白色文字
display.setCursor(85, 22); // 设置文本位置
display.println("Dust");
display.setCursor(85, 38);
display.println("Density");

display.setTextSize(3); // 设置大号字体
display.setCursor(0, 13); // 设置灰尘浓度数字显示位置
display.println(dustDensity);

display.setCursor(6, 43); // 设置单位位置
display.setTextSize(2); // 中号字体
display.println("ug/m3");

display.display(); // 更新显示内容
display.clearDisplay(); // 清空缓冲区,为下一次刷新准备

delay(1000); // 每秒刷新一次
}

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报