Advertisement
Tywais

Enviornment Monitoring Station

Oct 7th, 2024 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #include <Wire.h>
  2. #include "SSD1306Ascii.h"
  3. #include "SSD1306AsciiWire.h"
  4. #include <Adafruit_Sensor.h>
  5.  
  6. #define SCREEN_WIDTH 128
  7. #define SCREEN_HEIGHT 64
  8. SSD1306AsciiWire oled;
  9.  
  10. #include <DHT.h>
  11. #define DHTPIN 23  // pin for Dustation Devkit v1.4
  12. float t;
  13. float h;
  14. char buffer[10];
  15.  
  16. #include "PMS.h"
  17. PMS pms(Serial2);
  18. PMS::DATA data;
  19. float pm2;
  20.  
  21. //#define DHTTYPE    DHT11     // DHT 11
  22. #define DHTTYPE    DHT22     // DHT 22 (AM2302)
  23. //#define DHTTYPE    DHT21     // DHT 21 (AM2301)
  24. #define I2C_ADDRESS 0x3C
  25.  
  26. DHT dht(DHTPIN, DHTTYPE);
  27.  
  28. void setup() {
  29.    Serial2.begin(9600);
  30.    Serial.begin(38400);
  31.    dht.begin();
  32.    Wire.begin();
  33.    Wire.setClock(400000L);
  34.    oled.begin(&Adafruit128x64, I2C_ADDRESS);
  35.    oled.setFont(Verdana12);   //Arial14
  36.    oled.clear();
  37.    oled.setCursor(0,0); //(col,row)
  38.    //oled.set2X();
  39.  
  40.   delay(2000);
  41. }
  42.  
  43. void loop() {
  44.   //delay(5000);
  45.  
  46.   int AQI;
  47.   String state;
  48.  
  49.   if (pms.read(data))
  50.   {
  51.     pm2 = data.PM_AE_UG_2_5;
  52.  
  53.     /*Serial.print("PM 1.0 (ug/m3): ");
  54.     Serial.println(data.PM_AE_UG_1_0);
  55.  
  56.     Serial.print("PM 2.5 (ug/m3): ");
  57.     Serial.println(data.PM_AE_UG_2_5);
  58.  
  59.     Serial.print("PM 10.0 (ug/m3): ");
  60.     Serial.println(data.PM_AE_UG_10_0);
  61.  
  62.     Serial.println();
  63.    
  64.     Serial.print(t);
  65.     Serial.println("C");
  66.     Serial.print(h);
  67.     Serial.println("%");
  68.     Serial.println();
  69.     */
  70.    
  71.     am2302();
  72.    
  73.     oledupdate();
  74.     getAQI(pm2, &AQI, &state);
  75.    
  76.   }
  77. }
  78.  
  79.   void am2302() {
  80.  
  81.   //read temperature and humidity
  82.   t = dht.readTemperature();
  83.   h = dht.readHumidity();
  84.   if (isnan(h) || isnan(t)) {
  85.     Serial.println("AM2302 Failed");
  86.   }
  87. }
  88.  
  89.   void oledupdate() {
  90.   delay(1000);
  91.   // clear display
  92.   //oled.clear();
  93.  
  94.   // display temperature
  95.    oled.setCursor(1,0); //(col,row)
  96.   // oled.clearToEOL();
  97.    //oled.set2X();
  98.    oled.print(t);
  99.    oled.println("C");
  100.  
  101.    oled.setCursor(1,10); //(col,row)
  102.    //oled.set2X();
  103.    oled.print(h);
  104.    oled.println("%");
  105.  
  106.    oled.setCursor(1,20); //(col,row)
  107.    //oled.set2X();
  108.    oled.print(" PM2.5 = ");
  109.    int pm2temp = pm2;
  110.    oled.println(pm2temp);
  111.   }
  112.  
  113. void getAQI(float pm25, int* aqi, String* state){
  114.   int aqitemp;
  115.   String statetemp;
  116.  
  117.   // aqi = Ilow + (C-Clow)*(Ihigh-Ilow)/(Chigh-Clow) with I=aqi and C=concentration
  118.   if(pm25 < 12){
  119.       *aqi = 0 + (pm25-0)*(50.0-0)/(12-0);
  120.       *state = "Good";
  121.       aqitemp = *aqi;
  122.       statetemp = *state;
  123.   }else if(pm25 < 35){
  124.       *aqi = 51 + (pm25-13)*(100.0-51)/(35-13);
  125.       *state = "MOD";
  126.       aqitemp = *aqi;
  127.       statetemp = *state;
  128.   }else if(pm25 < 55){
  129.       *aqi = 101 + (pm25-36)*(150.0-101)/(55-36);
  130.       *state = "UHS";  
  131.        aqitemp = *aqi;
  132.        statetemp = *state;
  133.  }else if(pm25 < 150){
  134.       *aqi = 151 + (pm25-56)*(200.0-151)/(150-56);
  135.       *state = "UH";
  136.       aqitemp = *aqi;
  137.       statetemp = *state;
  138.   }else if(pm25 < 250){
  139.       *aqi = 201 + (pm25-151)*(300.0-201)/(250-151);
  140.       *state = "Very UH";
  141.       aqitemp = *aqi;
  142.       statetemp = *state;
  143.   }else{
  144.       *aqi = 300 + (pm25-250)*(500.0-300)/(500-250);
  145.       *state = "HAZ";
  146.       aqitemp = *aqi;
  147.       statetemp = *state;
  148.   }
  149.    oled.setCursor(1,30); //(col,row)
  150.    oled.clearToEOL();
  151.   //oled.set2X();
  152.    oled.print(" AQI = ");
  153.    oled.print(aqitemp);
  154.    oled.print("  ");
  155.    oled.println(statetemp);
  156.    Serial.println(aqitemp);
  157.    
  158.    
  159.  
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement