Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include "SSD1306Ascii.h"
- #include "SSD1306AsciiWire.h"
- #include <Adafruit_Sensor.h>
- #define SCREEN_WIDTH 128
- #define SCREEN_HEIGHT 64
- SSD1306AsciiWire oled;
- #include <DHT.h>
- #define DHTPIN 23 // pin for Dustation Devkit v1.4
- float t;
- float h;
- char buffer[10];
- #include "PMS.h"
- PMS pms(Serial2);
- PMS::DATA data;
- float pm2;
- //#define DHTTYPE DHT11 // DHT 11
- #define DHTTYPE DHT22 // DHT 22 (AM2302)
- //#define DHTTYPE DHT21 // DHT 21 (AM2301)
- #define I2C_ADDRESS 0x3C
- DHT dht(DHTPIN, DHTTYPE);
- void setup() {
- Serial2.begin(9600);
- Serial.begin(38400);
- dht.begin();
- Wire.begin();
- Wire.setClock(400000L);
- oled.begin(&Adafruit128x64, I2C_ADDRESS);
- oled.setFont(Verdana12); //Arial14
- oled.clear();
- oled.setCursor(0,0); //(col,row)
- //oled.set2X();
- delay(2000);
- }
- void loop() {
- //delay(5000);
- int AQI;
- String state;
- if (pms.read(data))
- {
- pm2 = data.PM_AE_UG_2_5;
- /*Serial.print("PM 1.0 (ug/m3): ");
- Serial.println(data.PM_AE_UG_1_0);
- Serial.print("PM 2.5 (ug/m3): ");
- Serial.println(data.PM_AE_UG_2_5);
- Serial.print("PM 10.0 (ug/m3): ");
- Serial.println(data.PM_AE_UG_10_0);
- Serial.println();
- Serial.print(t);
- Serial.println("C");
- Serial.print(h);
- Serial.println("%");
- Serial.println();
- */
- am2302();
- oledupdate();
- getAQI(pm2, &AQI, &state);
- }
- }
- void am2302() {
- //read temperature and humidity
- t = dht.readTemperature();
- h = dht.readHumidity();
- if (isnan(h) || isnan(t)) {
- Serial.println("AM2302 Failed");
- }
- }
- void oledupdate() {
- delay(1000);
- // clear display
- //oled.clear();
- // display temperature
- oled.setCursor(1,0); //(col,row)
- // oled.clearToEOL();
- //oled.set2X();
- oled.print(t);
- oled.println("C");
- oled.setCursor(1,10); //(col,row)
- //oled.set2X();
- oled.print(h);
- oled.println("%");
- oled.setCursor(1,20); //(col,row)
- //oled.set2X();
- oled.print(" PM2.5 = ");
- int pm2temp = pm2;
- oled.println(pm2temp);
- }
- void getAQI(float pm25, int* aqi, String* state){
- int aqitemp;
- String statetemp;
- // aqi = Ilow + (C-Clow)*(Ihigh-Ilow)/(Chigh-Clow) with I=aqi and C=concentration
- if(pm25 < 12){
- *aqi = 0 + (pm25-0)*(50.0-0)/(12-0);
- *state = "Good";
- aqitemp = *aqi;
- statetemp = *state;
- }else if(pm25 < 35){
- *aqi = 51 + (pm25-13)*(100.0-51)/(35-13);
- *state = "MOD";
- aqitemp = *aqi;
- statetemp = *state;
- }else if(pm25 < 55){
- *aqi = 101 + (pm25-36)*(150.0-101)/(55-36);
- *state = "UHS";
- aqitemp = *aqi;
- statetemp = *state;
- }else if(pm25 < 150){
- *aqi = 151 + (pm25-56)*(200.0-151)/(150-56);
- *state = "UH";
- aqitemp = *aqi;
- statetemp = *state;
- }else if(pm25 < 250){
- *aqi = 201 + (pm25-151)*(300.0-201)/(250-151);
- *state = "Very UH";
- aqitemp = *aqi;
- statetemp = *state;
- }else{
- *aqi = 300 + (pm25-250)*(500.0-300)/(500-250);
- *state = "HAZ";
- aqitemp = *aqi;
- statetemp = *state;
- }
- oled.setCursor(1,30); //(col,row)
- oled.clearToEOL();
- //oled.set2X();
- oled.print(" AQI = ");
- oled.print(aqitemp);
- oled.print(" ");
- oled.println(statetemp);
- Serial.println(aqitemp);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement