mirror of
https://github.com/eclipse/upm.git
synced 2025-03-15 04:57:30 +03:00
AQI: Adding ugm3 calculation to ppd42ns and aqi calculation to upm_utilities
Contributions by: Rex Tsai <rex.cc.tsai@gmail.com> Signed-off-by: Abhishek Malik <abhishek.malik@intel.com>
This commit is contained in:
parent
b9988469ba
commit
7a60cd5abe
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Jon Trulson <jtrulson@ics.com>
|
* Author: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Contributions: Rex Tsai <rex.cc.tsai@gmail.com>
|
||||||
|
* Abhishek Malik <abhishek.malik@intel.com>
|
||||||
* Copyright (c) 2016 Intel Corporation.
|
* Copyright (c) 2016 Intel Corporation.
|
||||||
*
|
*
|
||||||
* Rewritten Based on original C++ driver written by:
|
* Rewritten Based on original C++ driver written by:
|
||||||
@ -39,6 +41,7 @@
|
|||||||
// from LOW to HIGH
|
// from LOW to HIGH
|
||||||
static uint32_t ppd42ns_pulse_in(const ppd42ns_context dev,
|
static uint32_t ppd42ns_pulse_in(const ppd42ns_context dev,
|
||||||
bool high_low_value);
|
bool high_low_value);
|
||||||
|
double pcs2ugm3 (double concentration_pcs);
|
||||||
|
|
||||||
ppd42ns_context ppd42ns_init(int pin)
|
ppd42ns_context ppd42ns_init(int pin)
|
||||||
{
|
{
|
||||||
@ -112,6 +115,8 @@ ppd42ns_dust_data ppd42ns_get_data(const ppd42ns_context dev)
|
|||||||
data.lowPulseOccupancy = low_pulse_occupancy;
|
data.lowPulseOccupancy = low_pulse_occupancy;
|
||||||
data.ratio = ratio;
|
data.ratio = ratio;
|
||||||
data.concentration = concentration;
|
data.concentration = concentration;
|
||||||
|
data.ugm3 = pcs2ugm3(data.concentration);
|
||||||
|
data.aqi = upm_ugm3_to_aqi(data.ugm3);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -165,3 +170,26 @@ static uint32_t ppd42ns_pulse_in(const ppd42ns_context dev,
|
|||||||
|
|
||||||
return total_pulse_time;
|
return total_pulse_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Assumes density, shape, and size of dust to estimate mass concentration from particle count.
|
||||||
|
//
|
||||||
|
// This method was described in a 2009 paper
|
||||||
|
// Preliminary Screening System for Ambient Air Quality in Southeast Philadelphia by Uva, M., Falcone, R., McClellan, A., and Ostapowicz, E.
|
||||||
|
// https://www.yumpu.com/en/document/view/31692906/preliminary-screening-system-for-ambient-air-quality-in-southeast-
|
||||||
|
//
|
||||||
|
// This method does not use the correction factors, based on the presence of humidity and rain in the paper.
|
||||||
|
//
|
||||||
|
// convert from particles/0.01 ft3 to µg/m3
|
||||||
|
double pcs2ugm3 (double concentration_pcs)
|
||||||
|
{
|
||||||
|
double pi = 3.14159;
|
||||||
|
// All particles are spherical, with a density of 1.65E12 µg/m3
|
||||||
|
double density = 1.65 * pow (10, 12);
|
||||||
|
// The radius of a particle in the PM2.5 channel is .44 µm
|
||||||
|
double r25 = 0.44 * pow (10, -6);
|
||||||
|
double vol25 = (4/3) * pi * pow (r25, 3);
|
||||||
|
double mass25 = density * vol25; // ug
|
||||||
|
double K = 3531.5; // per m^3
|
||||||
|
|
||||||
|
return concentration_pcs * K * mass25;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Jon Trulson <jtrulson@ics.com>
|
* Author: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Contributions: Rex Tsai <rex.cc.tsai@gmail.com>
|
||||||
|
* Abhishek Malik <abhishek.malik@intel.com>
|
||||||
* Copyright (c) 2016 Intel Corporation.
|
* Copyright (c) 2016 Intel Corporation.
|
||||||
*
|
*
|
||||||
* Based on original C++ driver written by:
|
* Based on original C++ driver written by:
|
||||||
@ -37,6 +39,8 @@ extern "C" {
|
|||||||
unsigned int lowPulseOccupancy;
|
unsigned int lowPulseOccupancy;
|
||||||
double ratio;
|
double ratio;
|
||||||
double concentration;
|
double concentration;
|
||||||
|
double ugm3;
|
||||||
|
int aqi;
|
||||||
} ppd42ns_dust_data;
|
} ppd42ns_dust_data;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Jon Trulson <jtrulson@ics.com>
|
* Jon Trulson <jtrulson@ics.com>
|
||||||
* Copyright (c) 2016 Intel Corporation.
|
* Contributions: Rex Tsai <rex.cc.tsai@gmail.com>
|
||||||
|
* Abhishek Malik <abhishek.malik@intel.com>
|
||||||
|
* Copyright (c) 2017 Intel Corporation.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
* a copy of this software and associated documentation files (the
|
* a copy of this software and associated documentation files (the
|
||||||
@ -32,6 +34,22 @@
|
|||||||
#include <upm_platform.h>
|
#include <upm_platform.h>
|
||||||
#include <upm_utilities.h>
|
#include <upm_utilities.h>
|
||||||
|
|
||||||
|
// https://airnow.gov/index.cfm?action=aqibasics.aqi
|
||||||
|
static struct aqi {
|
||||||
|
float clow;
|
||||||
|
float chigh;
|
||||||
|
int llow;
|
||||||
|
int lhigh;
|
||||||
|
} aqi[] = {
|
||||||
|
{0.0, 12.4, 0, 50},
|
||||||
|
{12.1, 35.4, 51, 100},
|
||||||
|
{35.5, 55.4, 101, 150},
|
||||||
|
{55.5, 150.4, 151, 200},
|
||||||
|
{150.5, 250.4, 201, 300},
|
||||||
|
{250.5, 350.4, 301, 350},
|
||||||
|
{350.5, 500.4, 401, 500},
|
||||||
|
};
|
||||||
|
|
||||||
void upm_delay(unsigned int time)
|
void upm_delay(unsigned int time)
|
||||||
{
|
{
|
||||||
if (time <= 0)
|
if (time <= 0)
|
||||||
@ -246,3 +264,19 @@ uint32_t upm_elapsed_us(upm_clock_t *clock)
|
|||||||
return elapsed;
|
return elapsed;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int upm_ugm3_to_aqi (double ugm3)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 7; i++) {
|
||||||
|
if (ugm3 >= aqi[i].clow &&
|
||||||
|
ugm3 <= aqi[i].chigh) {
|
||||||
|
// Ip = [(Ihi-Ilow)/(BPhi-BPlow)] (Cp-BPlow)+Ilow,
|
||||||
|
return ((aqi[i].lhigh - aqi[i].llow) / (aqi[i].chigh - aqi[i].clow)) *
|
||||||
|
(ugm3 - aqi[i].clow) + aqi[i].llow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Jon Trulson <jtrulson@ics.com>
|
* Jon Trulson <jtrulson@ics.com>
|
||||||
* Copyright (c) 2016 Intel Corporation.
|
* Contributions: Rex Tsai <rex.cc.tsai@gmail.com>
|
||||||
|
* Abhishek Malik <abhishek.malik@intel.com>
|
||||||
|
* Copyright (c) 2017 Intel Corporation.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
* a copy of this software and associated documentation files (the
|
* a copy of this software and associated documentation files (the
|
||||||
@ -113,6 +115,15 @@ uint32_t upm_elapsed_ms(upm_clock_t *clock);
|
|||||||
*/
|
*/
|
||||||
uint32_t upm_elapsed_us(upm_clock_t *clock);
|
uint32_t upm_elapsed_us(upm_clock_t *clock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the AQI (based on EPA standards) using the ugm3 value
|
||||||
|
* calculated by the sensor module.
|
||||||
|
*
|
||||||
|
* @param ugm3 micrograms per cubic meter
|
||||||
|
* @return calculated AQI
|
||||||
|
*/
|
||||||
|
int upm_ugm3_to_aqi (double ugm3);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user