Innholdsfortegnelse:
- Rekvisita
- Trinn 1: Koble til komponentene
- Trinn 2: Bibliotek og Arduino -program
- Trinn 3: MIT App Inventor 2 Program
- Trinn 4: RESULTATET
Video: System for overvåking av luftkvalitet for forurensning av partikler: 4 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:22
INTRO:
1 I dette prosjektet viser jeg hvordan jeg bygger en partikkeldetektor med datavisning, sikkerhetskopiering av data på SD -kort og IOT. Visuelt indikerer en ringeskjerm i neopiksler luftkvaliteten.
2 Luftkvaliteten er en stadig viktigere bekymring i dag. Det er systemer for å måle støvhastigheten, men de er veldig dyre. Det er billige partikeldetektorer av høy kvalitet på markedet, som vist av noen studier.
for eksempel:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Jeg bestemte meg derfor for å bygge en enhet som kan måle antall partikler etter størrelsesklasser (0,5 um til 10 um), visuelt med en enkel visning av resultatet (neo pixel ring), en mer detaljert visning på en TFT -skjerm og en tidsstemplet sikkerhetskopiering på et SD-kort.
4 I tillegg har jeg lagt til en Bluetooth -kommunikasjonsmodul for å kunne kommunisere med en Android -applikasjon og dermed publisere resultatene på en IOT -server.
5 Den totale kostnaden for det hele overstiger ikke 60 €
Rekvisita
-Arduino uno R3
-Arduino proto skjold
-TFT -skjerm ST7735
-Neopixel ring 24 led
-Plantower PMS5003
-HC-06 Bluetooth-modul
Trinn 1: Koble til komponentene
de forskjellige komponentene er koblet i henhold til diagrammet ovenfor
Trinn 2: Bibliotek og Arduino -program
1 biblioteket
for TFT -skjermen
github.com/adafruit/Adafruit-GFX-Library
for neo pikselringen
github.com/adafruit/Adafruit_NeoPixel
for 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; #inkludere
// Hvilken pin på Arduino er koblet til NeoPixels?
#define PIN 6 // På Trinket eller Gemma, foreslår du å endre dette til 1
// Hvor mange NeoPixels er festet til Arduino?
#define NUMPIXELS 24 // Populær NeoPixel ringstørrelse Adafruit_NeoPixel piksler (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = piksler. Farge (0, 250, 0); uint32_t oransje = piksler. Farge (250, 250, 0); uint32_t rouge = piksler. Farge (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // du kan også koble dette til Arduino reset
#include // Core grafikkbibliotek
#include // Maskinvarespesifikt bibliotek #include #include const int cs_sd = 4; int vikarer; // temps d'acquisition dobbel tempsInit; // initialisering du timer au démarrage du loop ()
#if definert (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Alternativ 1: bruk noen pins, men litt tregere
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Alternativ 2: må bruke maskinvarens SPI -pinner
// (for UNO det er sclk = 13 og sid = 11) og pin 10 må være // en utgang. Dette er mye raskere - også påkrevd hvis du vil // bruke microSD -kortet (se bildetegningseksemplet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; ugyldig oppsett () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Initialiser modulen RTC RTC.begin (); Serial.print ("init SD"); forsinkelse (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); komme tilbake; } Serial.print ("Carte SD OK");
Fildata = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Démarrage -oppkjøp"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initialiser en ST7735S -brikke, svart fane Serial.println ("init"); // vår feilsøkingsutgang tft.fillScreen (ST7735_BLACK); // sensor baud rate er 9600 pmsSerial.begin (9600);
pixels.begin (); // INITIALISER NeoPixel stripeobjekt (påkrevd)
pixels.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 partikler_03um, partikler_05um, partikler_10um, partikler_25um, partikler_50um, partikler_100um; uint16_t ubrukt; uint16_t kontrollsum; };
struct pms5003data data; void loop () {pixels.clear (); // Sett alle pikselfarger til 'off' DateTime nå = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nå);
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 deler/ 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 deler/ 0,1 l");
// Serial.print (vikarer);
// Serial.print (""); Serial.print ("#"); Serial.print ("03 um"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 um"); Serial.print (data.particles_05um); Serial.print (""); Serial.print ("1 um"); Serial.print (data.particles_10um); Serial.print (""); Serial.print ("25 um"); Serial.print (data.particles_25um); Serial.print (""); Serielt trykk ("50 um"); Serial.print (data.particles_50um); Serial.print (""); Serial.print ("100 um"); Serial.print (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);
hvis ((nombre_leds = 1)) {
piksler.fyll (vert, 0, nombre_leds); } annet hvis ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); piksler.fyll (oransje, 8, ((nombre_leds) -8)); } annet hvis (nombre_leds> 16) {
piksler. fyll (vert, 0, 8); piksler. fyll (oransje, 8, 8); piksler.fyll (rød, 16, ((nombre_leds) -16)); } annet hvis (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } piksler.vis (); // Send de oppdaterte pikselfargene til maskinvaren.
// 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 (); }
}
boolsk readPMSdata (Stream *s) {
hvis (! s-> tilgjengelig ()) {return false; } // Les en byte om gangen til vi kommer til den spesielle '0x42' start-byte hvis (s-> peek ()! = 0x42) {s-> read (); return falsk; }
// Les nå alle 32 byte
hvis (s-> tilgjengelig () readBytes (buffer, 32);
// gjør sjekksummen klar
for (uint8_t i = 0; i <30; i ++) {sum+= buffer ; }
/* feilsøking
for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Dataene kommer i endian'd, dette løser det slik at det fungerer på alle plattformer uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i*2 + 1]; buffer_u16 + = (buffer [2 + i*2] << 8); }
// sette det inn i en fin struktur:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (sum! = data.checksum) {
Serial.println ("Feil i kontrollsummen"); return falsk; } // suksess! returner sant; }
// Converti le numéro de jour en jour /! / La semaine commence un dimanche
String donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; sak 1: returner "LUN"; sak 2: returner "MAR"; sak 3: returner "MER"; sak 4: returner "JEU"; sak 5: returner "VEN"; sak 6: returner "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 ("date"); 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);
forsinkelse (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; returresultat += String (nombre, DEC); }
Trinn 3: MIT App Inventor 2 Program
dette er MIT -appens oppfinnerkodeblokk
Trinn 4: RESULTATET
her er videoen av resultatet
Anbefalt:
Bærbar måling av fine partikler (forlengelse): 3 trinn
Bærbar måling av fine partikler (forlengelse): Mål: Tilsetning av en CO2 -sensor Forbedret lesbarhet av programmet Åpning av programmet for andre typer sensorer. Dette prosjektet følger et annet som allerede er publisert. Den svarer på spørsmål som leserne stiller. En ekstra sensor har vært
Bærbar måling av fine partikler: 4 trinn (med bilder)
Bærbar måling av fine partikler: Målet med dette prosjektet er å måle luftkvaliteten ved å måle mengden av fine partikler. Takket være bærbarheten vil det være mulig å utføre målinger hjemme eller på farten. Luftkvalitet og fine partikler: Partikler (
Enkel overvåking av luftkvalitet med TFT LCD-skjerm- Ameba Arduino: 3 trinn
Enkel luftkvalitetsovervåking med TFT LCD-skjerm-Ameba Arduino: Innledning Nå som de fleste blir hjemme for å unngå nær kontakt med potensiell COVID-19-virusbærer, blir luftkvalitet en viktig faktor for folks velvære, spesielt i tropiske land der å bruke air-con er et must i løpet av dagen
AirCitizen - Overvåking av luftkvalitet: 11 trinn (med bilder)
AirCitizen - Overvåking av luftkvalitet: Hei alle sammen! I dag vil vi lære deg hvordan du reproduserer prosjektet vårt: AirCitizen av AirCitizenPolytech Team!-Kommer fra 'OpenAir / What's your air?' Prosjekter, AirCitizen -prosjektet har som mål å gjøre innbyggerne i stand til å evaluere kvaliteten aktivt
Bygg en detektor for forurensning av partikler fra LoRa: 8 trinn
Bygg en detektor for forurensning av partikler fra LoRa: Vi skal bygge en detektor for partikler som bruker PM2.5 luftkvalitetssensor, ESP32, UNO og LoRa -modul. Partikkelforurensning, også kjent som Particulate Matter er en blanding av vidt forskjellige størrelser av faste stoffer og væsker som finnes i luften. Noen av disse s