#include // Core graphics library #include // Hardware-specific library MCUFRIEND_kbv tft; #include #include #include #include #define BLACK 0x0000 #define RED 0xF800 #define GREEN 0x07E0 #define WHITE 0xFFFF #define GREY 0x8410 #include int DustSensePin = 31; //globals for ppd42 dust sensor //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 = 10000;//sample 60s == 60000 ; unsigned long lowpulseoccupancy = 0; unsigned long duration = 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; int screenreadyforprint = 0; double count = 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) { if(screenreadyforprint == 0){ tft.fillScreen(BLACK); tft.WriteCmdData(0x51, 0x0000); tft.setTextColor(0XFFFF); tft.setTextSize(2); tft.setCursor(0, 36); tft.println("Starting Sensor"); screenreadyforprint = 1; } duration = pulseIn(DustSensePin, LOW, 500000); lowpulseoccupancy = lowpulseoccupancy + duration; //tft.println(airreading) if ((millis()-starttime) > sampletime_ms)//if the sample time == 30s { tft.fillScreen(BLACK); tft.WriteCmdData(0x51, 0x0000); tft.setTextColor(0XFFFF); tft.setTextSize(2); tft.setCursor(0, 36); 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.print("Count: "); tft.println(count); tft.println(lowpulseoccupancy); //tft.print(","); tft.println(ratio); //tft.print(","); tft.print("Concentration is: "); tft.println(concentration); lowpulseoccupancy = 0; starttime = millis(); //tft.println("Results printed."); count++; } } 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); }