You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

93 lines
2.8 KiB

#include <math.h>
int DustSensePin = 13;
//let's start with 100 readings. (copy and paste)
unsigned int airreading[100] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long starttime = 0;
unsigned long sampletime_ms = 60000;//sample 60s == 60000 ;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
unsigned int x = 0;
unsigned int toplimit = 0;
unsigned long sum = 0; //highest number possible - 32 bit unsigned, so 4 billion
unsigned int average = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Starting Air Sensor, please wait for readings...");
pinMode(DustSensePin,INPUT);
starttime = millis();//get the current time;
}
void loop()
{
airreading[x] = pulseIn(DustSensePin, LOW, 500000);
/*lowpulseoccupancy = lowpulseoccupancy+duration;
if ((millis()-starttime) > sampletime_ms)//if the sample time == 30s
{
ratio = lowpulseoccupancy/(sampletime_ms*10.0); // Integer percentage 0=>100
concentration = 1.1*powf(ratio,3)-3.8*powf(ratio,2)+520*ratio+0.62; // using spec sheet curve
Serial.print(lowpulseoccupancy);
Serial.print(",");
Serial.print(ratio);
Serial.print(",");
Serial.println(concentration);
lowpulseoccupancy = 0;
starttime = millis();
}
*/
//if ((millis()-starttime) > sampletime_ms){
//KISS. Relative readings only.
//Something else keeps the time.
if (airreading[x] != 0){
Serial.println(airreading[x]);
x=x+1;
if(x>100){
x = 0;
}
}
//starttime = millis();
//}
//KISS. Average for a minute, and store that data in a webpage (that part will be in ethernet sensor test 3).
//
if ((millis()-starttime) > sampletime_ms){
toplimit = x; // don't read the zeros
if(toplimit == 0){
toplimit = 1; //to avoid divide by zero, in case sum / toplimit is both zero
}
for (x=0; x<toplimit; x++){
sum = sum + airreading[x];
}
average = sum / toplimit;
Serial.print("Average Get!: ");
Serial.println(average); //average when 0 is 65535, so it's invalid (dividing by zero - sum divided by top limit which are both zero)
//but we don't even want the average. It's just for testing here.
Serial.print("Sum Get!: ");
Serial.println(sum); //this is what we care about
//reset everything after a minute
sum = 0;
average = 0;
x = 0;
toplimit = 0;
for (x=0; x<toplimit; x++){
airreading[x] = 0;
}
starttime = millis();
}
}