Example Code for Arduino UNO - Read Air Quality Data via Software Serial
Last revision 2026/01/15
This example is to detect formaldehyde, PM2.5, temperature and humidity in the environment using Arduino UNO. Software serial port is used here to communicate with the sensor because Arduino UNO has only one serial port and it's connected to USB.
Hardware Preparation
- Arduino UNO x 1
- Air Quality Monitor x 1
- M-M/F-M/F-F Jumper wires
Software Preparation
- Arduino IDE Click to Download Arduino IDE from Arduino®
Wiring Diagram
| PM2.5 Sensor Adapter | UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| TX | 10 |
| RX | 11 |
Other Preparation Work
Software serial port is used here to communicate with the sensor because Arduino UNO has only one serial port and it's connected to USB.
Sample Code
/*!
* @file SEN0233.ino
* @brief Air Quality Monitor (PM 2.5, HCHO, Temperature & Humidity)
* @n Get the module here: https://www.dfrobot.com/product-1612.html
* @n This example is to detect formaldehyde, PM2.5, temperature and humidity in the environment.
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author [lijun]([email protected])
* @version V1.0
* @date 2017-03-01
*/
#include <SoftwareSerial.h>
char col;
unsigned int PMSa1 = 0, PMSa2_5 = 0, PMSa10 = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb1 = 0, PMSb2_5 = 0, PMSb10 = 0, FMHDSb = 0, TPSb = 0, HDSb = 0;
unsigned int PMS1 = 0,PMS2_5 = 0,PMS10 = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0;
unsigned char bufferRTT[32] = {}; //serial receive data
char tempStr[15];
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
}
void loop()
{
while (!mySerial.available());
while (mySerial.available() > 0) //Check whether there is any serial data
{
for (int i = 0; i < 32; i++)
{
col = mySerial.read();
bufferRTT[i] = (char)col;
delay(2);
}
mySerial.flush();
CR1 = (bufferRTT[30] << 8) + bufferRTT[31];
CR2 = 0;
for (int i = 0; i < 30; i++)
CR2 += bufferRTT[i];
if (CR1 == CR2) //Check
{
PMSa1 = bufferRTT[10]; //Read PM1 high 8-bit data
PMSb1 = bufferRTT[11]; //Read PM1 low 8-bit data
PMS1 = (PMSa1 << 8) + PMSb1; //PM1 data
PMSa2_5 = bufferRTT[12]; //Read PM2.5 high 8-bit data
PMSb2_5 = bufferRTT[13]; //Read PM2.5 low 8-bit data
PMS2_5 = (PMSa2_5 << 8) + PMSb2_5; //PM2.5 data
PMSa10 = bufferRTT[14]; //Read PM10 high 8-bit data
PMSb10 = bufferRTT[15]; //Read PM10 low 8-bit data
PMS10 = (PMSa10 << 8) + PMSb10; //PM10 data
TPSa = bufferRTT[24]; //Read temperature high 8-bit data
TPSb = bufferRTT[25]; //Read temperature low 8-bit data
TPS = (TPSa << 8) + TPSb; //Temperature data
HDSa = bufferRTT[26]; //Read humidity high 8-bit data
HDSb = bufferRTT[27]; //Read humidity low 8-bit data
HDS = (HDSa << 8) + HDSb; //Humidity data
}
else
{
PMS1 = 0;
PMS2_5 = 0;
PMS10 = 0;
TPS = 0;
HDS = 0;
}
}
Serial.println("-----------------------uart--------------------------");
Serial.print("Temp : ");
sprintf(tempStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10);
Serial.print(tempStr);
Serial.println(" C"); //Display temperature
Serial.print("RH : ");
sprintf(tempStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10);
Serial.print(tempStr); //Display humidity
Serial.println(" %"); //%
Serial.print("PM1.0: ");
Serial.print(PMS1);
Serial.println(" ug/m3"); //Display PM1.0 unit ug/m³
Serial.print("PM2.5: ");
Serial.print(PMS2_5);
Serial.println(" ug/m3"); //Display PM2.5 unit ug/m³
Serial.print("PM 10: ");
Serial.print(PMS10);
Serial.println(" ug/m3"); //Display PM 10 unit ug/m³
}
Result

Was this article helpful?
