Sisällysluettelo:

Hiukkaspäästöjen ilmanlaadun seurantajärjestelmä: 4 vaihetta
Hiukkaspäästöjen ilmanlaadun seurantajärjestelmä: 4 vaihetta

Video: Hiukkaspäästöjen ilmanlaadun seurantajärjestelmä: 4 vaihetta

Video: Hiukkaspäästöjen ilmanlaadun seurantajärjestelmä: 4 vaihetta
Video: Pohjois-Karjalan ilmanlaadun bioindikaattoriseurannan tulosseminaari 18.6.2021 2024, Heinäkuu
Anonim
Hiukkasten pilaantumisen ilmanlaadun seurantajärjestelmä
Hiukkasten pilaantumisen ilmanlaadun seurantajärjestelmä
Hiukkasten pilaantumisen ilmanlaadun seurantajärjestelmä
Hiukkasten pilaantumisen ilmanlaadun seurantajärjestelmä

INTRO:

1 Tässä projektissa näytän kuinka rakentaa hiukkasilmaisin, jossa on datanäyttö, tietojen varmuuskopiointi SD -kortille ja IOT. Visuaalisesti neopikselirengasnäyttö osoittaa ilmanlaadun.

2 Ilmanlaatu on nykyään yhä tärkeämpi huolenaihe. on olemassa järjestelmiä pölyn määrän mittaamiseksi, mutta ne ovat erittäin kalliita. Markkinoilla on halpoja, korkealaatuisia hiukkasilmaisimia, kuten jotkut tutkimukset osoittavat.

esimerkiksi:

www.atmos-meas-tech.net/11/4823/2018/amt-1…

3 Siksi päätin rakentaa laitteen, joka pystyy mittaamaan hiukkasten määrän kokoluokittain (0,5 µm - 10 µm), visuaalisesti yksinkertaisella tuloksen näytöllä (uuspikselirengas), yksityiskohtaisemmalla näytöllä TFT -näytöllä ja aikaleimattu varmuuskopio SD-kortille.

4 Lisäksi olen lisännyt bluetooth -viestintämoduulin voidakseni kommunikoida Android -sovelluksen kanssa ja julkaista näin tulokset IOT -palvelimella.

5 Kokonaiskustannukset eivät ylitä 60 €

Tarvikkeet

-Arduino uno R3

-Arduino proto -kilpi

-TFT -näyttö ST7735

-Neopikselirengas 24 led

-Plantower PMS5003

-HC-06 bluetooth-moduuli

Vaihe 1: Komponenttien liittäminen

Osien liittäminen
Osien liittäminen

eri komponentit on kytketty yllä olevan kaavion mukaisesti

Vaihe 2: Kirjasto ja Arduino -ohjelma

1 kirjasto

TFT -näyttöä varten

github.com/adafruit/Adafruit-GFX-Library

uuspikselirenkaalle

github.com/adafruit/Adafruit_NeoPixel

sd -kortille

github.com/arduino-libraries/SD

2 arduino -luonnos

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #sisältää

// Mikä Arduinon nasta on yhdistetty NeoPixel -laitteisiin?

#define PIN 6 // Ehdottele Trinketissä tai Gemmassa tämän muuttamista arvoon 1

// Kuinka monta NeoPixeliä on liitetty Arduinoon?

#define NUMPIXELS 24 // Suosittu NeoPixel -rengaskoko Adafruit_NeoPixel -pikseliä (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pikseliä. Väri (0, 250, 0); uint32_t oranssi = pikseliä. Väri (250, 250, 0); uint32_t rouge = pikseliä. Väri (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // voit myös yhdistää tämän Arduinon nollaus

#include // Ydingrafiikkakirjasto

#include // Laitteistokohtainen kirjasto #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // alustaminen du timer au démarrage du loop ()

#if määritelty (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif

// Vaihtoehto 1: käytä mitä tahansa nastoja, mutta hieman hitaammin

// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);

// Vaihtoehto 2: on käytettävä laitteiston SPI -nastoja

// (UNO: lle sclk = 13 ja sid = 11) ja nastan 10 on oltava // lähtö. Tämä on paljon nopeampaa - vaaditaan myös, jos haluat // käyttää microSD -korttia (katso esimerkki kuvan piirustuksesta) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Alusta yhteyshenkilö I2C Wire.begin (); // Alusta moduuli RTC RTC.begin (); Serial.print ("init SD"); viive (1000); if (! SD.begin (cs_sd)) // Ehto verensiirto si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); palata; } Serial.print ("Carte SD OK");

Tiedoston tiedot = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println ("Demarrage -hankinta"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // alustetaan ST7735S -siru, musta välilehti Serial.println ("init"); // virheenkorjaustulostemme tft.fillScreen (ST7735_BLACK); // anturin siirtonopeus on 9600 pmsSerial.begin (9600);

pixels.begin (); // ALOITA NeoPixel -nauhaobjekti (VAATIVA)

pixels.setBrightness (2);

}

structure pms5003data {

uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t hiukkaset_03um, hiukkaset_05um, hiukkaset_10um, hiukkaset_25um, hiukkaset_50um, hiukkaset_100um; uint16_t käyttämätön; uint16_t tarkistussumma; };

rakentaa pms5003dataa; void loop () {pixels.clear (); // Aseta kaikki pikselivärit pois päältä DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nyt);

temps = ((millis () - tempsInit))/1000; // Demarrage du chrono

if (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre osat/ 0,1 l");

tft.setCursor (10, 17); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.setCursor (10, 17); tft.print ("0,3 um"); tft.print (data.particles_03um); tft.print ("");

tft.setCursor (10, 29);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("0,5 um"); tft.print (data.particles_05um); tft.print ("");

tft.setCursor (10, 41);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("1,0 um"); tft.print (data.particles_10um); tft.print ("");

tft.setCursor (10, 53);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("2,5 um"); tft.print (data.particles_25um); tft.print ("");

tft.setCursor (10, 65);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("5,0 um"); tft.print (data.particles_50um); tft.print ("");

tft.setCursor (10, 77);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("10 um"); tft.print (data.particles_100um); tft.print ("");

tft.setCursor (2, 89);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 1.0"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm10_standard); tft.print (""); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print (" mikrog/m3 ");

tft.setCursor (2, 100); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 2.5"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm25_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("mikrog/m3");

tft.setCursor (2, 110);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 10"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm100_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("mikrog/m3");

tft.setCursor (10, 5);

tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre osat/ 0,1 l");

// Serial.print (temps);

// Serial.print (""); Serial.print ("#"); Sarjanjälki ("03µm"); Sarjajälki (data.particles_03um); Serial.print (""); Sarjanjälki ("05µm"); Serial.print (data.particles_05um); Serial.print (""); Sarjajälki ("1 µm"); Serial.print (data.particles_10um); Serial.print (""); Sarjanjälki ("25 µm"); Serial.print (data.particles_25um); Serial.print (""); Sarjajälki ("50 µm"); Sarjajälki (data.particles_50um); Serial.print (""); Sarjajälki ("100 µm"); Serial.print (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);

jos ((nombre_leds = 1)) {

pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oranssi, 8, ((nombre_leds) -8)); } muu jos (nombre_leds> 16) {

pixels.fill (vert, 0, 8); pixels.fill (oranssi, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Lähetä päivitetyt pikselivärit laitteistoon.

// Définition données String PM03 = Jono (data.particles_03um); Jono PM05 = Jono (data.particles_05um); Jono PM10 = Jono (data.particles_10um); Jono PM25 = Jono (data.particles_25um); Jono PM50 = Jono (data.particles_50um); Jono PM100 = Jono (data.particles_100um); Jono PMS10 = Jono (data.pm10_standard); Jono PMS25 = Jono (data.pm25_standard); Jono PMS100 = Jono (data.pm100_standard); String Temps = Jono (temps);

// Ecriture des données dans le fichier texte

Tiedoston tiedot = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }

}

boolean readPMSdata (Stream *s) {

if (! s-> available ()) {return false; } // Lue tavua kerrallaan, kunnes pääsemme erityiseen '0x42' aloitustavuun, jos (s-> peek ()! = 0x42) {s-> read (); palauta epätosi; }

// Lue nyt kaikki 32 tavua

jos (s-> käytettävissä () readBytes (puskuri, 32);

// valmistele tarkistussumma

for (uint8_t i = 0; i <30; i ++) {summa+= puskuri ; }

/* virheenkorjaus

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (puskuri , HEX); Serial.print (","); } Sarja.println (); */ // Tiedot tulevat endian'd, tämä ratkaisee sen, joten se toimii kaikilla alustoilla uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = puskuri [2 + i*2 + 1]; puskuri_u16 + = (puskuri [2 + i*2] << 8); }

// laita se mukavaan rakenteeseen:)

memcpy ((void *) & data, (void *) buffer_u16, 30);

jos (summa! = data.checksum) {

Serial.println ("Tarkistussumman virhe"); palauta epätosi; } // menestystä! palaa tosi; }

// Muunna numerot de jour en jour /! / La semaine commence un dimanche

Jono donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; tapaus 1: palauta "LUN"; tapaus 2: palauta "MAR"; tapaus 3: palauta "MER"; tapaus 4: palauta "JEU"; tapaus 5: palauta "VEN"; tapaus 6: palauta "SAM"; oletus: palauta ""; }}

// affiche la date et l'heure sur l'écran

void affiche_date_heure (DateTime datetime) {// Date String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Jono (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Sarjanjälki (jour); Serial.print (""); Sarjanjälki (heure); //Sarja.jälki (""); Tiedoston tiedot = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); data.close ();

tft.setCursor (2, 120);

tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("päivämäärä"); tft.setTextColor (ST7735_YELLOW); tft.print (jour); tft.setTextColor (ST7735_GREEN); tft.setCursor (2, 130); tft.print ("heure"); tft. setTextColor (ST7735_YELLOW); tft.print (heure);

viive (500);

}

// permet d'afficher les nombres sur deux chiffres

Jono Vers2Chiffres (tavun nombre) {String resultat ""; if (nombre <10) resultat = "0"; return resultat += Merkkijono (nombre, DEC); }

Vaihe 3: MIT App Inventor 2 -ohjelma

MIT App Inventor 2 -ohjelma
MIT App Inventor 2 -ohjelma

tämä on MIT -sovelluksen keksijäkoodilohko

Vaihe 4: TULOS

tässä video tuloksesta

Suositeltava: