|
|
- #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();
- }
- }
|