// Programvare for måling av luftkvalitet // Bygget på programvare utviklet til Air:bit UiT // Endret og tilpasset av Nils Kr. Rossing Mai 2019 // Skolelaboratoriet, Institutt for fysikk, NTNU // Inkluder biblioteker #include // #include #include #include #include ///////////////// Display ////////////// Adafruit_SSD1306 display(4); // Deklarasjon av enheten "display" av klassen Adafruit_SSD1306 ////////////////// GPS ///////////////// #define GPS_RX 5 #define GPS_TX 4 SoftwareSerial gpsCom(GPS_RX, GPS_TX); TinyGPSPlus gps; //////// Støvpartikler SDS011 ////////// #define PM_TX 2 #define PM_RX 3 SDS011 sds; ////////////////// LED ///////////////// #define LED_RED 7 #define LED_GREEN 8 /////// Fuktighet og temperatur //////// int pinTemp = A1; int pinFukt = A0; float digTemp; // Digitalt avlest temperatur float digFukt; // Digitalt avlest fuktighet float temp; // Beregnet temperatur i Celsius float fukt; // Beregnet relativ fuktighet i % /////// Testing og kalibrering ///////// int intervall = 5; // Angir ca. intervall i sek. mellom hver måling float tempCal=-4.0; // lineær kalibrering av temperatur float fuktCal=0.0; // lineær kalibrering av fukt bool gpsOn = true; // True = GPS-måling på False = GPS-måling avslått //////////////// setup() /////////////// void setup() { // Aktiver LEDpinner pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); // Initialiering av seriekommunikasjon Serial.begin(9600); // Til PC monitor sds.begin(PM_TX, PM_RX); // Til støvsensor gpsCom.begin(9600); // Til GPS mottaker display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Initialiser display med adresse 0x3C Serial.println("Luftforurensning_SC_nkr_5"); Serial.println("Tid (s), Lengdegrad, Breddegrad, Hoyde, pm2.5, pm10, Temp(C), Fukt(%)"); // Klargjør display for utskrift display.clearDisplay(); // Slett informasjon på display display.setTextSize(1); // Sett størrelse på tekst display.setTextColor(WHITE); // Hvit tekst på sort bagrunn // Skriver ut temperatur og fuktighet display.setCursor(26,6); // Plasser markør display.println("Init. V5"); // Skriv Initialisering display.setCursor(8,16); // Plasser markør øverst til venstre display.println("Kan ta minutter"); display.display(); } void loop() { ////// Avlesning av temperatur og fuktighet ////////// // Midling over 100 målinger for å fjerne tilfeldig støy digTemp = 0; for(int i = 0; i<100; i++) { digTemp = digTemp + analogRead(A1); } digTemp = digTemp/100; temp = digTemp*500.0/1024 + tempCal; //Omregning fra spenning til C // Midling over 100 målinger for å fjerne tilfeldig støy digFukt = 0; for(int i = 0; i<500; i++) { digFukt = digFukt + analogRead(A0); } digFukt = digFukt/500; fukt = (digFukt/1024 - 0.16)/0.0062; // Omregning fra spenning til fuktighet RH% fukt = fukt/(1.0546 -0.00216*temp)+fuktCal; // Korrigerer fuktighetsmåling med temp ///////////////// Les fra GPS-enhet ///////////////// if(gpsOn) // gpsOn=True Leser GPS-data - For testing innendørs { // kan GPS slås av dvs. gpsOn=False gpsCom.listen(); bool gpsEncodeComplete = false; do { if (!gpsCom.available()) // Ingen GPS-data tilgjengelig. Les på nytt { continue; } gpsEncodeComplete = gps.encode(gpsCom.read()); if (!gpsEncodeComplete) // Ufullstendig GPS-data tilgjengelig. Les på nytt { continue; } } while (!gpsEncodeComplete); // Gjenta lesning til gyldige data oppnås bool gpsValid = gps.location.isValid(); bool gpsUpdated = gps.location.isUpdated(); bool isUseful = gpsValid && gpsUpdated; if (!isUseful) // Ugyldige data tenn rød lysdiode { digitalWrite(LED_RED, HIGH); delay(500); digitalWrite(LED_RED, LOW); return; } else // Gyldige data tenn grønn lysdiode { digitalWrite(LED_GREEN, HIGH); delay(500); digitalWrite(LED_GREEN, LOW); } } ///////// Les fra støvmåleren //////////// float pm25, pm10; int error; do { error = sds.read(&pm25, &pm10); } while (error != 0); // Fortsett å les av støvmåleren helt til gyldige data ////// Skriv ut data til PC monitor og SD-kort ////// Serial.print(long(millis()/1000)); // Skriv ut sekunder Serial.print(","); Serial.print(gps.location.lng(), 6); // Lengdegrader i desimalgrader, 6 desimaler Serial.print(","); Serial.print(gps.location.lat(), 6); // Breddegrader i desimalgrader, 6 desimaler Serial.print(","); Serial.print(gps.altitude.meters(), 1); // Høyde i meter, 1 desimaler Serial.print(","); Serial.print(pm25); // Skriv ut støvkonsentrasjon 2,5 um Serial.print(","); Serial.print(pm10); // Skriv ut støvkonsentrasjon 10 um Serial.print(","); Serial.print(temp,1); // Skriv ut temperatur Serial.print(","); Serial.print(fukt,1); // Skriv ut fuktighet Serial.println(); // Klargjør display på toppen av instrumentet for utskrift display.clearDisplay(); // Slett informasjon på display display.setTextSize(1); // Sett størrelse på tekst display.setTextColor(WHITE); // Hvit tekst på sort bagrunn // Skriver ut temperatur og fuktighet display.setCursor(0,0); // Plasser markør øverst til venstre display.print("T: "); // Skriv "Lufttrykk display.print(temp,1); // Skriv verdien til luftrykk med to desimaler display.print(" C"); // Skriv benevning mbar (mb) display.print(", RF: "); // Skriv "Temp.:", Temperatur display.print(fukt,1); // Skriv den målte temperaturen i ... display.println(" %"); // ... grader C // Skrive ut støvkonsentrasjon display.setCursor(0,12); // Flytt markør til neste linje display.print("pm2.5: "); // ... ug/m3 display.print(pm25,1); // Skriv den målte pm 2,5 u display.print(" pm10: "); // ... ug/m3 display.println(pm10,1); // Skriv den målte pm 10 u // Skrive ut Lengde- og Breddegrad display.setCursor(0,24); // Flytt markør til neste linje display.print("L:"); display.print(gps.location.lng(),5); // Skriv lengdegrad display.print(" B:"); display.println(gps.location.lat(),5); // Skriv den målte pm 10 u display.display(); // Overfør informasjonen til displayet og vis delay(intervall*1000); // Intervall mellom hver måling }