Example Code for Arduino-Hardware Serial
Last revision 2025/12/16
Read value of PM1, PM2.5 and PM10 of air quality using Arduino Hardware Serial port; learn serial communication and data parsing with the sensor.
Hardware Preparation
| Name | Model/SKU | Quantity | Purchase Link |
|---|---|---|---|
| PM2.5 Laser Dust Sensor | SEN0177 (1272) | 1 | Link |
| Arduino Board | - | 1 | - |
| IO Expansion Shield (optional) | 1009 | 1 | Link |
Software Preparation
- Development Tool: Arduino IDE
- Version Requirement: ArduinoIDE 1.6.x or above
- Download Link: Arduino IDE
Wiring Diagram
If you have an IO expansion shield, you can simply insert the PM2.5 sensor adapter onto it, and you can use the serial to monitor the data.

If you have no IO expansion shield, you can follow the wiring diagram to do wiring.

Other Preparation Work
- SET: SET = 1, the module works in continuous sampling mode, it will upload the sample data after the end of each sampling. (The sampling response time is 1S); SET = 0, the module enters a low-power standby mode.
- RESET: Leave it empty is OK.
Sample Code
NOTE: This code can only be verified in ArduinoIDE 1.6.x or above.
/*!
* @file SEN0177.ino
* @brief Abstract: Read value of PM1,PM2.5 and PM10 of air quality
* @n Modified by Cain for Arduino Hardware Serial port compatibility
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author Zuyang @ HUST
* @version V3.1
* @date 2016-03-25
*/
#include <Arduino.h>
#define LENG 31 //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];
int PM01Value=0; //define PM1.0 value of the air detector module
int PM2_5Value=0; //define PM2.5 value of the air detector module
int PM10Value=0; //define PM10 value of the air detector module
void setup()
{
Serial.begin(9600); //use serial0
Serial.setTimeout(1500); //set the Timeout to 1500ms, longer than the data transmission periodic time of the sensor
}
void loop()
{
if(Serial.find(0x42)){ //start to read when detect 0x42
delay(100);
Serial.readBytes(buf,LENG);
if(buf[0] == 0x4d){
if(checkValue(buf,LENG)){
PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module
PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module
PM10Value=transmitPM10(buf); //count PM10 value of the air detector module
}
}
}
static unsigned long OledTimer=millis();
if (millis() - OledTimer >=1000)
{
OledTimer=millis();
Serial.print("PM1.0: ");
Serial.print(PM01Value);
Serial.println(" ug/m3");
Serial.print("PM2.5: ");
Serial.print(PM2_5Value);
Serial.println(" ug/m3");
Serial.print("PM1 0: ");
Serial.print(PM10Value);
Serial.println(" ug/m3");
Serial.println();
}
}
char checkValue(unsigned char *thebuf, char leng)
{
char receiveflag=0;
int receiveSum=0;
for(int i=0; i<(leng-2); i++){
receiveSum=receiveSum+thebuf[i];
}
receiveSum=receiveSum + 0x42;
if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data
{
receiveSum = 0;
receiveflag = 1;
}
return receiveflag;
}
int transmitPM01(unsigned char *thebuf)
{
int PM01Val;
PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
return PM01Val;
}
//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
{
int PM2_5Val;
PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
return PM2_5Val;
}
//transmit PM Value to PC
int transmitPM10(unsigned char *thebuf)
{
int PM10Val;
PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module
return PM10Val;
}
Was this article helpful?
