SCP v30 04: Particle Matter Sensor
This is the basic code to manage and read the particle sensor.
Required Materials
1 x Waspmote 1 x Battery 1 x Smart Cities PRO board 1 x Particle matter sensor
Notes
- Remember to connect the battery to Waspmote for proper operation. - The connection of the sensor is described in the Smart Cities PRO technical guide.
Code
/*
------------ [SCP_v30_04] - Particle Matter Sensor --------------
Explanation: This is a complete code to manage and read the particle
sensor.
Copyright (C) 2018 Libelium Comunicaciones Distribuidas S.L.
http://www.libelium.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Version: 3.2
Design: David Gascón
Implementation: Isabel Burillo
*/
#include <WaspPM.h>
#include <WaspFrame.h>
/*
P&S! Possibilities for this sensor:
- SOCKET_D
*/
char info_string[61];
char serial_number[61];
int status;
int measure;
void setup()
{
USB.println(F("Particle Matter Sensor example"));
// switch on sensor
status = PM.ON();
// check answer
if (status == 1)
{
// get info from sensor
status = PM.getInfoString(info_string);
if (status == 1)
{
USB.println(F("Information string extracted:"));
USB.println(info_string);
}
else
{
USB.println(F("Error reading the particle sensor"));
}
// read serial number from sensor. That funtion isn't avalable for OPC-N2 sensor
status = PM.readSerialNumber(serial_number);
if (status == 1)
{
USB.print(F("Serial number: "));
USB.println(serial_number);
}
else
{
USB.println(F("Error reading the serial number"));
}
// switch off sensor
PM.OFF();
}
else
{
USB.println(F("Error starting the particle sensor"));
}
}
void loop()
{
///////////////////////////////////////////
// 1. Turn on the sensor
///////////////////////////////////////////
// Power on the PM sensor
status = PM.ON();
// check answer
if (status == 1)
{
USB.println(F("Particle sensor started"));
}
else
{
USB.println(F("Error starting the particle sensor"));
}
///////////////////////////////////////////
// 2. Read sensor
///////////////////////////////////////////
if (status == 1)
{
// Power the fan and the laser and perform a measure of 5 seconds
measure = PM.getPM(5000, 5000);
// check answer
if (measure == 1)
{
USB.println(F("Measure performed"));
USB.print(F("PM 1: "));
USB.printFloat(PM._PM1, 3);
USB.println(F(" ug/m3"));
USB.print(F("PM 2.5: "));
USB.printFloat(PM._PM2_5, 3);
USB.println(F(" ug/m3"));
USB.print(F("PM 10: "));
USB.printFloat(PM._PM10, 3);
USB.println(F(" ug/m3"));
USB.print(F("Temp: "));
USB.print(PM._temp);
USB.println(F(" ºC"));
USB.print(F("Hum: "));
USB.print(PM._hum);
USB.println(F(" %RH"));
USB.print("Bin: ");
for (int i = 0; i < 24; i++)
{
USB.print(PM._bin[i]);
USB.print(";");
}
USB.println();
}
else
{
USB.print(F("Error performing the measure. Error code:"));
USB.println(measure, DEC);
}
}
///////////////////////////////////////////
// 3. Turn off the sensor
///////////////////////////////////////////
// Power off the PM sensor. If there aren't other sensors powered,
// turn off the board automatically
PM.OFF();
///////////////////////////////////////////
// 4. Create ASCII frame
///////////////////////////////////////////
if (measure == 1) {
// Create new frame (ASCII)
frame.createFrame(ASCII);
// Add sensor values
frame.addSensor(SENSOR_CITIES_PRO_PM1, PM._PM1);
frame.addSensor(SENSOR_CITIES_PRO_PM2_5, PM._PM2_5);
frame.addSensor(SENSOR_CITIES_PRO_PM10, PM._PM10);
frame.addSensor(SENSOR_CITIES_PRO_TC, PM._temp);
frame.addSensor(SENSOR_CITIES_PRO_HUM, PM._hum);
// Show the frame
frame.showFrame();
// Create new frame (ASCII)
frame.createFrame(ASCII);
// Add first 16 bins
frame.addSensor(SENSOR_CITIES_PRO_PM_BINL, PM._binL);
// Add last 8 bins
frame.addSensor(SENSOR_CITIES_PRO_PM_BINH, PM._binH);
// Show the frame
frame.showFrame();
}
///////////////////////////////////////////
// 5. Sleep
///////////////////////////////////////////
// Go to deepsleep
// After 3 minutes, Waspmote wakes up thanks to the RTC Alarm
PWR.deepSleep("00:00:03:00", RTC_OFFSET, RTC_ALM1_MODE1, ALL_OFF);
}
Output
J#
Particle Matter Sensor example
Information string extracted:
OPC-N3 Iss1.1 FirmwareVer=1.17............................
Serial number: OPC-N3 177470907
Particle sensor started
Measure performed
PM 1: 1.360 ug/m3
PM 2.5: 3.300 ug/m3
PM 10: 10.230 ug/m3
Temp: 23.5199985504 ºC
Hum: 32.9699974060 %RH
Bin: 264;44;19;3;3;2;2;0;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
===============================
Current ASCII Frame:
Length: 87
Frame Type: 134
frame (HEX):
3C3D3E86052332313439364630353743313035344444234F50435F4E33233023504D313A312E3336303023504D325F353A332E3330303023504D31303A31302E323330302354433A32332E35322348554D3A33332E3023
frame (STR): <=>�#21496F057C1054DD#OPC_N3#0#PM1:1.3600#PM2_5:3.3000#PM10:10.2300#TC:23.52#HUM:33.0#
===============================
===============================
Current ASCII Frame:
Length: 100
Frame Type: 134
frame (HEX):
3C3D3E86022332313439364630353743313035344444234F50435F4E33233123504D5F42494E4C3A3236343B34343B31393B333B333B323B323B303B323B303B303B303B303B303B303B3023504D5F42494E483A303B303B303B303B303B303B303B3023
frame (STR): <=>�#21496F057C1054DD#OPC_N3#1#PM_BINL:264;44;19;3;3;2;2;0;2;0;0;0;0;0;0;0#PM_BINH:0;0;0;0;0;0;0;0#
===============================
Last updated