@ -0,0 +1,93 @@ | |||||
#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(); | |||||
} | |||||
} |
@ -0,0 +1,109 @@ | |||||
#include <Adafruit_GFX.h> // Core graphics library | |||||
#include <MCUFRIEND_kbv.h> // Hardware-specific library | |||||
MCUFRIEND_kbv tft; | |||||
#include <Fonts/FreeSans9pt7b.h> | |||||
#include <Fonts/FreeSans12pt7b.h> | |||||
#include <Fonts/FreeSerif12pt7b.h> | |||||
#include <FreeDefaultFonts.h> | |||||
#define BLACK 0x0000 | |||||
#define RED 0xF800 | |||||
#define GREEN 0x07E0 | |||||
#define WHITE 0xFFFF | |||||
#define GREY 0x8410 | |||||
#include <math.h> | |||||
int DustSensePin = 13; | |||||
//globals for ppd42 dust sensor | |||||
//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; | |||||
//end ppd42 | |||||
int brightnessread = 0; | |||||
int cat = 0; | |||||
int resultsread1 = 0; | |||||
void setup(void) | |||||
{ | |||||
Serial.begin(9600); | |||||
uint16_t ID = tft.readID(); | |||||
if (ID == 0xD3) ID = 0x9481; | |||||
tft.begin(ID); | |||||
tft.setRotation(1); | |||||
tft.WriteCmdData(0x51, 0x00); | |||||
//resultsread1 = tft.readReg(0x52); | |||||
//writeData(0x51); | |||||
pinMode(DustSensePin,INPUT); | |||||
starttime = millis();//get the current time; | |||||
} | |||||
void loop(void) | |||||
{ | |||||
tft.fillScreen(BLACK); | |||||
tft.WriteCmdData(0x51, 0x0000); | |||||
tft.setTextColor(0XFFFF); | |||||
tft.setTextSize(2); | |||||
tft.setCursor(0, 36); | |||||
tft.println("running sensor now"); | |||||
airreading[x] = pulseIn(DustSensePin, LOW, 500000); | |||||
tft.println("Results are in:"); | |||||
//tft.println(airreading) | |||||
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 | |||||
tft.println(lowpulseoccupancy); | |||||
//tft.print(","); | |||||
tft.println(ratio); | |||||
//Serial.print(","); | |||||
tft.println(concentration); | |||||
lowpulseoccupancy = 0; | |||||
starttime = millis(); | |||||
} | |||||
} | |||||
void showmsgXY(int x, int y, int sz, const GFXfont *f, const char *msg) | |||||
{ | |||||
int16_t x1, y1; | |||||
uint16_t wid, ht; | |||||
tft.drawFastHLine(0, y, tft.width(), WHITE); | |||||
tft.setFont(f); | |||||
tft.setCursor(x, y); | |||||
tft.setTextColor(GREEN); | |||||
tft.setTextSize(sz); | |||||
tft.print(msg); | |||||
delay(1000); | |||||
} | |||||
uint32_t readReg32(uint16_t reg) | |||||
{ | |||||
uint16_t h = tft.readReg(reg, 0); | |||||
uint16_t l = tft.readReg(reg, 1); | |||||
return ((uint32_t) h << 16) | (l); | |||||
} |