13.PM2.5感測+

紫線 VCC

橘線 GND

藍線 D1

綠線 D0

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

static unsigned int pm_cf_10; //定义全局变量

static unsigned int pm_cf_25;

static unsigned int pm_cf_100;

static unsigned int pm_at_10;

static unsigned int pm_at_25;

static unsigned int pm_at_100;

static unsigned int particulate03;

static unsigned int particulate05;

static unsigned int particulate10;

static unsigned int particulate25;

static unsigned int particulate50;

static unsigned int particulate100;

void getG5(unsigned char ucData)//获取G5的值

{

static unsigned int ucRxBuffer[250];

static unsigned int ucRxCnt = 0;

ucRxBuffer[ucRxCnt++] = ucData;

if (ucRxBuffer[0] != 0x42 && ucRxBuffer[1] != 0x4D)//数据头判断

{

ucRxCnt = 0;

return;

}

if (ucRxCnt > 38)//数据位判断//G5S为32,G5ST为38

{

pm_cf_10=(int)ucRxBuffer[4] * 256 + (int)ucRxBuffer[5]; //大气环境下PM2.5浓度计算

pm_cf_25=(int)ucRxBuffer[6] * 256 + (int)ucRxBuffer[7];

pm_cf_100=(int)ucRxBuffer[8] * 256 + (int)ucRxBuffer[9];

pm_at_10=(int)ucRxBuffer[10] * 256 + (int)ucRxBuffer[11];

pm_at_25=(int)ucRxBuffer[12] * 256 + (int)ucRxBuffer[13];

pm_at_100=(int)ucRxBuffer[14] * 256 + (int)ucRxBuffer[15];

particulate03=(int)ucRxBuffer[16] * 256 + (int)ucRxBuffer[17];

particulate05=(int)ucRxBuffer[18] * 256 + (int)ucRxBuffer[19];

particulate10=(int)ucRxBuffer[20] * 256 + (int)ucRxBuffer[21];

particulate25=(int)ucRxBuffer[22] * 256 + (int)ucRxBuffer[23];

particulate50=(int)ucRxBuffer[24] * 256 + (int)ucRxBuffer[25];

particulate100=(int)ucRxBuffer[26] * 256 + (int)ucRxBuffer[27];

if (pm_cf_25 > 999)//如果PM2.5数值>1000,返回重新计算

{

ucRxCnt = 0;

return;

}

ucRxCnt = 0;

return;

}

}

void setup() {

lcd.init();

lcd.backlight();

lcd.clear();

Serial.begin(9600);

Serial.print("PM_CF1.0");Serial.print(",");

Serial.print("PM_CF2.5");Serial.print(",");

Serial.print("PM_CF10");Serial.print(",");

Serial.print("PM_AQI1.0");Serial.print(",");

Serial.print("PM_AQI2.5");Serial.print(",");

Serial.print("PM_AQI10");Serial.print(",");

Serial.print("PM_count03");Serial.print(",");

Serial.print("PM_count05");Serial.print(",");

Serial.print("PM_count10");Serial.print(",");

Serial.print("PM_count25");Serial.print(",");

Serial.println("PM_count100");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(ug/m3)");Serial.print(",");

Serial.print("(pcs/0.01cf)");Serial.print(",");

Serial.print("(pcs/0.01cf)");Serial.print(",");

Serial.print("(pcs/0.01cf)");Serial.print(",");

Serial.print("(pcs/0.01cf)");Serial.print(",");

Serial.println("(pcs/0.01cf)");

}

void loop() {

while (Serial.available())

{

getG5(Serial.read());

}

lcd.clear();

lcd.setCursor(0,0);

lcd.print("PM1.0");

lcd.setCursor(6,0);

lcd.print("PM2.5");

lcd.setCursor(12,0);

lcd.print("PM10");

lcd.setCursor(0,1);

lcd.print(pm_at_10);

lcd.setCursor(6,1);

lcd.print(pm_at_25);

lcd.setCursor(12,1);

lcd.print(pm_at_100);

Serial.print(pm_cf_10);Serial.print(",");

Serial.print(pm_cf_25);Serial.print(",");

Serial.print(pm_cf_100);Serial.print(",");

Serial.print(pm_at_10);Serial.print(",");

Serial.print(pm_at_25);Serial.print(",");

Serial.print(pm_at_100);Serial.print(",");

Serial.print(particulate03);Serial.print(",");

Serial.print(particulate05);Serial.print(",");

;Serial.print(particulate10);Serial.print(",");

Serial.print(particulate25);Serial.print(",");

Serial.println(particulate100);

delay(2000);

}