Innehållsförteckning:

System för övervakning av luftkvalitet för partikelföroreningar: 4 steg
System för övervakning av luftkvalitet för partikelföroreningar: 4 steg

Video: System för övervakning av luftkvalitet för partikelföroreningar: 4 steg

Video: System för övervakning av luftkvalitet för partikelföroreningar: 4 steg
Video: Woori Juntos - Harris County Commissioner Court 2024, Juli
Anonim
System för övervakning av luftkvalitet för partikelföroreningar
System för övervakning av luftkvalitet för partikelföroreningar
System för övervakning av luftkvalitet för partikelföroreningar
System för övervakning av luftkvalitet för partikelföroreningar

INTRO:

1 I detta projekt visar jag hur man bygger en partikeldetektor med datavisning, säkerhetskopiering av data på SD -kort och IOT. Visuellt visar en neopixels ringdisplay luftkvaliteten.

2 Luftkvaliteten är en allt viktigare fråga idag. det finns system för att mäta dammhastigheten men de är mycket dyra. Det finns billiga, högkvalitativa partikeldetektorer på marknaden, vilket vissa studier visar.

till exempel:

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

3 Jag bestämde mig därför för att bygga en enhet som kan mäta antalet partiklar efter storleksklasser (0,5 µm till 10 µm), visuellt med en enkel visning av resultatet (neo pixelring), en mer detaljerad visning på en TFT -skärm och en tidsstämplad säkerhetskopia på ett SD-kort.

4 Dessutom har jag lagt till en Bluetooth -kommunikationsmodul för att kunna kommunicera med en Android -applikation och därmed publicera resultaten på en IOT -server.

5 Den totala kostnaden för helheten överstiger inte 60 €

Tillbehör

-Arduino uno R3

-Arduino proto sköld

-TFT -skärm ST7735

-Neopixelring 24 led

-Plantower PMS5003

-HC-06 Bluetooth-modul

Steg 1: Ansluta komponenterna

Ansluta komponenterna
Ansluta komponenterna

de olika komponenterna är anslutna enligt diagrammet ovan

Steg 2: Bibliotek och Arduino -program

1 biblioteket

för TFT -skärmen

github.com/adafruit/Adafruit-GFX-Library

för neopixelringen

github.com/adafruit/Adafruit_NeoPixel

för sd -kortet

github.com/arduino-libraries/SD

2 arduino -skissen

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

// Vilken pin på Arduino är ansluten till NeoPixels?

#define PIN 6 // På Trinket eller Gemma, föreslå att du ändrar detta till 1

// Hur många NeoPixels är anslutna till Arduino?

#define NUMPIXELS 24 // Populär NeoPixel -ringstorlek Adafruit_NeoPixel -pixlar (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixlar. Färg (0, 250, 0); uint32_t orange = pixlar. Färg (250, 250, 0); uint32_t rouge = pixlar. Färg (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // du kan också ansluta detta till Arduino -återställningen

#include // Core grafikbibliotek

#include // Hardware-specifikt bibliotek #include #include const int cs_sd = 4; int temps; // temps d'acquisition dubbel tempsInit; // initialisering av timer au démarrage du loop ()

#if definierat (_ SAM3X8E_)

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

// Alternativ 1: använd alla stift men lite långsammare

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

// Alternativ 2: måste använda maskinvarans SPI -stift

// (för UNO det är sclk = 13 och sid = 11) och stift 10 måste vara // en utgång. Detta är mycket snabbare - krävs också om du vill // använda microSD -kortet (se bildritningsexemplet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Initialize la liaison I2C Wire.begin (); // Initiera modulen RTC RTC.begin (); Serial.print ("init SD"); fördröjning (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); lämna tillbaka; } Serial.print ("Carte SD OK");

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

data.println (""); data.println ("Démarrage -förvärv"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initiera ett ST7735S -chip, svart flik Serial.println ("init"); // vår felsökningsutmatning tft.fillScreen (ST7735_BLACK); // sensorns överföringshastighet är 9600 pmsSerial.begin (9600);

pixlar. börjar (); // INITIALISERA NeoPixel -bandobjekt (KRÄVS)

pixlar.setBrightness (2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t partiklar_03um, partiklar_05um, partiklar_10um, partiklar_25um, partiklar_50um, partiklar_100um; uint16_t oanvänd; uint16_t kontrollsumma; };

struct pms5003data data; void loop () {pixels.clear (); // Ställ in alla pixelfärger till 'off' DateTime nu = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nu);

temps = ((millis () - tempsInit))/1000; // Démarrage du chrono

if (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre delar/ 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 ("microg/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 ("microg/m3");

tft.setCursor (10, 5);

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

// Serial.print (temps);

// Serial.print (""); Serial.print ("#"); Seriellt tryck ("03 um"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 µm"); Serial.print (data.particles_05um); Serial.print (""); Seriellt tryck ("1 um"); Serial.print (data.particles_10um); Serial.print (""); Seriellt tryck ("25 um"); Serial.print (data.particles_25um); Serial.print (""); Seriellt tryck ("50 µm"); Serial.print (data.particles_50um); Serial.print (""); Seriellt tryck ("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);

if ((nombre_leds = 1)) {

pixlar. fyllning (vert, 0, nombre_leds); } annars if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixlar. fyllning (orange, 8, ((nombre_leds) -8)); } annat om (nombre_leds> 16) {

pixlar. fyllning (vert, 0, 8); pixlar. fyllning (orange, 8, 8); pixlar. fyllning (rouge, 16, ((nombre_leds) -16)); } annars if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixlar. visa (); // Skicka de uppdaterade pixelfärgerna till hårdvaran.

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

// Ecriture des données dans le fichier texte

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

}

booleskt readPMSdata (Stream *s) {

om (! s-> tillgänglig ()) {return false; } // Läs en byte i taget tills vi kommer till den speciella '0x42' startbyten if (s-> peek ()! = 0x42) {s-> read (); return falsk; }

// Läs nu alla 32 byte

if (s-> tillgänglig () readBytes (buffert, 32);

// gör redovisningen klar

för (uint8_t i = 0; i <30; i ++) {sum+= buffert ; }

/* felsökning

för (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffert , HEX); Serial.print (","); } Serial.println (); */ // Data kommer i endian'd, detta löser det så att det fungerar på alla plattformar uint16_t buffer_u16 [15]; för (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffert [2 + i*2 + 1]; buffer_u16 + = (buffert [2 + i*2] << 8); }

// sätta in det i en fin struktur:)

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

if (summa! = data.checksumma) {

Serial.println ("Checksumfel"); return falsk; } // Framgång! återvända sant; }

// Converti le numéro de jour en jour /! / La semaine commence un dimanche

Sträng donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; fall 1: returnera "LUN"; fall 2: returnera "MAR"; fall 3: returnera "MER"; fall 4: returnera "JEU"; fall 5: returnera "VEN"; fall 6: returnera "SAM"; default: return ""; }}

// 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 ()) + "/" + String (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Fildata = 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 ("datum"); 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);

fördröjning (500);

}

// permet d'afficher les nombres sur deux chiffres

Sträng Vers2Chiffres (byte nombre) {String resultat = ""; if (nr <10) resultat = "0"; returresultat += String (nombre, DEC); }

Steg 3: MIT App Inventor 2 Program

MIT App Inventor 2 Program
MIT App Inventor 2 Program

detta är MIT -appens uppfinnarkodblock

Steg 4: RESULTATET

här är videon av resultatet

Rekommenderad: