The data presented here was obtained through various tests performed on different Shinjei PPD42 units. Each test will be described in more detail below.
# Load libraries
require('openair')
## Loading required package: openair
## Loading required package: lazyeval
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
##
## The following objects are masked from 'package:stats':
##
## filter, lag
##
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
## Loading required package: maps
require('corrplot')
## Loading required package: corrplot
This test was performed outdoors during May 2013 at a residence in Auckland’s North Shore. The data indicate that the sensor did respond to moderate concentrations during the test but did not report above noise levels during expected low concentration periods. There was no reference device during this test so the estimates of low and moderate were made refering to the general conditions throughout the city and may not necessarily reflect local sources impacting the device.
# Loading the data
shinyei_201305 <- read.csv("/data/GUSrepos/R_work/data/shinyei_201305.txt", sep="")
shinyei_201305$date=as.POSIXct(paste(shinyei_201305$Date,shinyei_201305$Time),tz='NZST')
shinyei_201305$Date<-NULL
shinyei_201305$Time<-NULL
summary(shinyei_201305)
## Conc Humdity Temperature
## Min. : 0.0000 Min. :24.10 Min. :18.50
## 1st Qu.: 0.0000 1st Qu.:27.50 1st Qu.:20.40
## Median : 0.0000 Median :30.10 Median :20.70
## Mean : 0.4835 Mean :32.41 Mean :20.68
## 3rd Qu.: 0.0000 3rd Qu.:33.30 3rd Qu.:21.10
## Max. :62.4800 Max. :99.90 Max. :22.10
## date
## Min. :2013-05-17 17:08:24
## 1st Qu.:2013-05-18 08:56:00
## Median :2013-05-19 00:44:00
## Mean :2013-05-19 00:44:00
## 3rd Qu.:2013-05-19 16:32:00
## Max. :2013-05-20 08:20:00
# Plot summaries
timePlot(shinyei_201305,pollutant = c('Conc'),normalise = 'mean', main = 'Raw data\nnormalised to the mean')
## Warning in checkPrep(mydata, vars, type, remove.calm = FALSE): Detected
## data with Daylight Saving Time, converting to UTC/GMT
timePlot(shinyei_201305,pollutant = c('Conc'),normalise = 'mean', avg.time = '10 min',main = '10 min average\nnormalised to the mean')
## Warning in checkPrep(mydata, vars, type, remove.calm = FALSE): Detected
## data with Daylight Saving Time, converting to UTC/GMT
timeVariation(shinyei_201305,pollutant = c('Conc'),normalise = 'TRUE',main = 'Temporal variation\nnormalised to the mean')
## Warning in checkPrep(mydata, vars, type, remove.calm = FALSE): Detected
## data with Daylight Saving Time, converting to UTC/GMT
This test was performed indoors during November 2015 at my desk in a well sealed and air conditioned central Auckland office The data indicate that the sensor did not respond to the relatively low concentrations during the test. There was no reference device during this test so the estimates of low is refered to the expected conditions in this office space.
# Loading the data
shinyei_201511 <- read.csv("/data/GUSrepos/R_work/data/shinyei_201511.txt", sep=",")
shinyei_201511$date=as.POSIXct(shinyei_201511$date)
summary(shinyei_201511)
## date low_pulse ratio concentration
## Min. :2015-11-26 01:22:22 Min. :0 Min. :0 Min. :0.62
## 1st Qu.:2015-11-26 22:47:12 1st Qu.:0 1st Qu.:0 1st Qu.:0.62
## Median :2015-11-27 22:06:33 Median :0 Median :0 Median :0.62
## Mean :2015-11-27 22:07:45 Mean :0 Mean :0 Mean :0.62
## 3rd Qu.:2015-11-28 21:25:54 3rd Qu.:0 3rd Qu.:0 3rd Qu.:0.62
## Max. :2015-11-29 20:45:15 Max. :0 Max. :0 Max. :0.62
# Plot summaries
timePlot(shinyei_201511,pollutant = c('low_pulse','ratio','concentration'),normalise = 'mean', main = 'Raw data\nnormalised to the mean')
## Warning in checkPrep(mydata, vars, type, remove.calm = FALSE): Detected
## data with Daylight Saving Time, converting to UTC/GMT
timePlot(shinyei_201511,pollutant = c('low_pulse','ratio','concentration'),normalise = 'mean', avg.time = '10 min',main = '10 min average\nnormalised to the mean')
## Warning in checkPrep(mydata, vars, type, remove.calm = FALSE): Detected
## data with Daylight Saving Time, converting to UTC/GMT
As there signals from the Shinjei device were constant, the time variation plot is irrelevant.
# timeVariation(shinyei_201511,pollutant = c('low_pulse','ratio','concentration'),normalise = 'TRUE',main = 'Temporal variation\nnormalised to the mean')
This test was performed indoors during December 2015 at my desk in a well sealed and air conditioned central Auckland office. The main difference between the previous tests is the use of a modified firmware using interrupts to catch the pulses given by the sensor:
volatile unsigned long Tstart,Tend,t_1,t_2,Tlow,Ttot,t_0;
float ratio,conc;
//Interrupt functions
void T_falling(){
t_1=millis();
}
void T_rising(){
t_2=millis()-t_1;
Tlow=Tlow+t_2;
}
//SETUP
void setup(){
Serial.begin(57600);
Serial.println("Time\tTlow\tTtot");
Tlow=0;
t_0=millis();
Ttot=0;
attachInterrupt(0,T_falling,FALLING);
attachInterrupt(1,T_rising,RISING);
}
//MAIN LOOP
void loop(){
delay(1000);
Serial.print(t_0);
Serial.print("\t");
Serial.print(Tlow);
Serial.print("\t");
Ttot = millis() - t_0;
Serial.println(Ttot);
Ttot=0;
Tlow=0;
t_0=millis();
}
The data indicate that the sensor did not respond to the relatively low concentrations during the test, except during what probably was the cleaning staff walking around the sensor and may relate to “dust” lifted by vacuuming or walking on the carpet. There was no reference device during this test so the estimates of low is refered to the expected conditions in this office space.
# Loading the data
shinyei_201512 <- read.csv("/home/gustavo/data/Dust_tests/desktop_20151214/shinyei1.txt", sep="")
shinyei_201512$date=as.POSIXct(shinyei_201512$date,tz='GMT')
summary(shinyei_201512)
## date Time Tlow
## Min. :2015-12-14 01:17:22 Min. : 48092 Min. : 0.000
## 1st Qu.:2015-12-14 06:44:13 1st Qu.:19649778 1st Qu.: 0.000
## Median :2015-12-14 12:11:08 Median :39241076 Median : 0.000
## Mean :2015-12-14 12:11:08 Mean :39241100 Mean : 1.415
## 3rd Qu.:2015-12-14 17:38:03 3rd Qu.:58832375 3rd Qu.: 0.000
## Max. :2015-12-14 23:05:00 Max. :78423680 Max. :22663.000
## Ttot
## Min. : 999
## 1st Qu.:1000
## Median :1000
## Mean :1001
## 3rd Qu.:1001
## Max. :1002
# Plot summaries
timePlot(shinyei_201512,pollutant = c('Tlow'), main = 'Raw data', xlab = 'GMT time')
timePlot(shinyei_201512,pollutant = c('Tlow'), avg.time = '10 min',main = '10 min average', xlab = 'GMT time')
timeVariation(shinyei_201512,pollutant = c('Tlow'),main = 'Temporal variation')
This test was performed indoors during December 2015 at my desk in a well sealed and air conditioned central Auckland office. The main difference between the previous tests is the use of a Grimm Aerosol Spectrometer as a reference instrument recording data as 10 minutes average.
The data indicate that the sensor did respond to the relatively low concentrations during the test. The Shinyei’s response correlates more strongly (\(r^2\) 0.76) with the Grimm spectrometer counts of particles larger than 800nm which is close to the sensor’s specification of measuring particles larger than 1\(\mu m\) (1000nm).
For the device tested here, the best linear fit against the n800 channel corresponds to: \[N_{800} = (100\pm30) + (200\pm40)*10^3 * ratio\]
# Loading the data (shinyei)
shinyei_201512_2 <- read.csv("/home/gustavo/data/Dust_tests/desktop_20151215/shinyei_20151215.txt", sep="")
shinyei_201512_2$date=as.POSIXct(shinyei_201512_2$date,tz='GMT')
# From Shinyei's datasheet, the particle number concentration is related to the "low pulse occupancy time" as a percentage.
shinyei_201512_2$ratio = shinyei_201512_2$Tlow/(shinyei_201512_2$Ttot)
# (grimm spectrometer)
grimm_201512 <- read.csv("/home/gustavo/data/Dust_tests/desktop_20151215/grimm_20151215.parsed", sep="")
grimm_201512$date <- as.POSIXct(grimm_201512$date,tz = 'GMT')
shinyei_grimm <- merge(shinyei_201512_2,grimm_201512,by='date',all=TRUE)
# Correlation calculations to find Shinyei's size information
for_correl <- timeAverage(shinyei_grimm,avg.time = '30 min')
find_channels <- cor(for_correl[,c(5,7:21)],use = 'pairwise')
# Plot summaries
timePlot(shinyei_grimm,pollutant = c('n300','n500','n800','n10000','ratio'),avg.time = '30 min')
corrplot(find_channels,method = 'circle',diag=FALSE)