Sadržaj:
- Pribor
- Korak 1: Spajanje komponenti
- Korak 2: Knjižnica i Arduino program
- Korak 3: Program MIT App Inventor 2
- Korak 4: REZULTAT
Video: Sustav za praćenje kvalitete zraka zagađivanjem čestica: 4 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:34
INTRO:
1 U ovom projektu pokazujem kako izgraditi detektor čestica s prikazom podataka, sigurnosnom kopijom podataka na SD kartici i IOT -om. Vizualno neopikselni prsten prikazuje kvalitetu zraka.
2 Kvaliteta zraka danas je sve važnija briga. postoje sustavi za mjerenje količine prašine, ali su vrlo skupi. Na tržištu postoje jeftini, visokokvalitetni detektori čestica, što pokazuju i neke studije.
na primjer:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Stoga sam odlučio izgraditi uređaj sposoban za mjerenje broja čestica po klasama veličina (0,5 μm do 10 µm), vizualno s jednostavnim prikazom rezultata (neo pikselni prsten), detaljnijim prikazom na TFT ekranu i sigurnosno kopiranje s vremenskom oznakom na SD kartici.
4 Osim toga, dodao sam bluetooth komunikacijski modul za komunikaciju s android aplikacijom i objavljivanje rezultata na IOT poslužitelju.
5 Ukupni trošak cjeline ne prelazi 60 €
Pribor
-Arduino uno R3
-Arduino proto štit
-TFT ekran ST7735
-Prsten od neopiksela 24 led
-Plantower PMS5003
-HC-06 bluetooth modul
Korak 1: Spajanje komponenti
različite komponente su spojene prema gornjem dijagramu
Korak 2: Knjižnica i Arduino program
1 knjižnica
za TFT ekran
github.com/adafruit/Adafruit-GFX-Library
za prsten neo piksela
github.com/adafruit/Adafruit_NeoPixel
za sd karticu
github.com/arduino-libraries/SD
2 arduino skica
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #uključi
// Koji je pin na Arduinu spojen na NeoPixels?
#define PIN 6 // Na Trinket -u ili Gemmi predložite promjenu na 1
// Koliko je NeoPixela priključeno na Arduino?
#define NUMPIXELS 24 // Popularni NeoPixel prsten veličine Adafruit_NeoPixel piksela (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pikseli. Boja (0, 250, 0); uint32_t narančasta = pikseli. Boja (250, 250, 0); uint32_t rouge = pikseli. Boja (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // ovo možete spojiti i na Arduino reset
#include // Osnovna biblioteka grafike
#include // Knjižnica specifična za hardver #include #include const int cs_sd = 4; int temps; // temps d'acquisition dvostruki tempsInit; // inicijalizacija du timer au démarrage du loop ()
#if definirano (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opcija 1: upotrijebite bilo koje pinove, ali malo sporije
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opcija 2: morate koristiti hardverske SPI pinove
// (za UNO to je sclk = 13 i sid = 11) i pin 10 mora biti // izlaz. Ovo je mnogo brže - također je potrebno ako želite // koristiti microSD karticu (pogledajte primjer crteža slike) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Pokretanje veze I2C Wire.begin (); // Pokretanje modula RTC RTC.begin (); Serial.print ("init SD"); kašnjenje (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Zadani SD"); povratak; } Serial.print ("Carte SD OK");
Podaci datoteke = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Démarrage stjecanje"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicijalizirati čip ST7735S, crna kartica Serial.println ("init"); // naš izlaz za ispravljanje pogrešaka tft.fillScreen (ST7735_BLACK); // brzina prijenosa senzora je 9600 pmsSerial.begin (9600);
pikseli.begin (); // INICIALIZE NeoPixel strip objekt (OBAVEZNO)
piksela.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 čestice_03um, čestice_05um, čestice_10um, čestice_25um, čestice_50um, čestice_100um; uint16_t neiskorišteno; uint16_t kontrolni zbroj; };
struct pms5003podaci podataka; void loop () {pikseli.clear (); // Postavi sve boje piksela na 'isključeno' DateTime sada = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (sada);
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 dijelovi/ 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 ("PM 1.0"); 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 dijelovi/ 0,1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Serial.print ("03µm"); Serijski.ispis (data.particles_03um); Serial.print (""); Serial.print ("05µm"); Serijski.ispis (data.particles_05um); Serial.print (""); Serial.print ("1µm"); Serijski.ispis (data.particles_10um); Serial.print (""); Serial.print ("25µm"); Serijski.ispis (data.particles_25um); Serial.print (""); Serial.print ("50µm"); Serijski.ispis (data.particles_50um); Serial.print (""); Serial.print ("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)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pikseli.fill (narančasto, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pikseli.fill (vert, 0, 8); pikseli.fill (narančasta, 8, 8); pikseli.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } piksela.show (); // Pošaljite ažurirane boje piksela na hardver.
// Definicija ne sadrži String PM03 = String (data.particles_03um); Niz PM05 = Niz (data.particles_05um); Niz PM10 = Niz (data.particles_10um); Niz PM25 = Niz (data.particles_25um); Niz PM50 = Niz (data.particles_50um); Niz PM100 = Niz (data.particles_100um); Niz PMS10 = Niz (data.pm10_standard); Niz PMS25 = Niz (data.pm25_standard); Niz PMS100 = Niz (data.pm100_standard); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Podaci datoteke = 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; } // Čitajte po jedan bajt dok ne dođemo do posebnog početnog bajta '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }
// Sada pročitajte svih 32 bajta
if (s-> dostupan () readBytes (međuspremnik, 32);
// pripremiti kontrolni zbroj
za (uint8_t i = 0; i <30; i ++) {zbroj+= međuspremnik ; }
/* ispravljanje pogrešaka
for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serijski ispis (međuspremnik , HEX); Serial.print (","); } Serial.println (); */ // Podaci dolaze u endian'd -u, ovo ih rješava pa radi na svim platformama uint16_t buffer_u16 [15]; za (uint8_t i = 0; i <15; i ++) {buffer_u16 = međuspremnik [2 + i*2 + 1]; bafer_u16 + = (međuspremnik [2 + i*2] << 8); }
// stavi u lijepu strukturu:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (zbroj! = data.checksum) {
Serial.println ("Pogreška kontrolne sume"); return false; } // uspjeh! return true; }
// Converti le numéro de jour en jour /! / La semaine begin un dimanche
String donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; slučaj 1: povratak "LUN"; slučaj 2: povratak "MAR"; slučaj 3: povratak "MER"; slučaj 4: vratiti "JEU"; slučaj 5: povratak "VEN"; slučaj 6: vratiti "SAM"; default: return ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// Datum niza jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Niz (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serijski.ispis (jour); Serial.print (""); Serijski.ispis (heure); //Serial.print (""); Podaci datoteke = 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);
kašnjenje (500);
}
// permet d'afficher les nombres sur deux chiffres
Niz Vers2Chiffres (broj bajtova) {String resultat = ""; if (nombre <10) resultat = "0"; povratni rezultat += niz (nombre, DEC); }
Korak 3: Program MIT App Inventor 2
ovo je blok koda izumitelja aplikacije MIT
Korak 4: REZULTAT
evo video rezultata
Preporučeni:
Mjerač kvalitete zraka u zatvorenom prostoru: 5 koraka (sa slikama)
Unutarnji mjerač kvalitete zraka: Jednostavan projekt za provjeru kvalitete zraka u vašoj kući. Budući da u zadnje vrijeme često boravimo/radimo od kuće, možda bi bilo dobro pratiti kvalitetu zraka i podsjetiti se kada je vrijeme da otvorite prozor i udiše malo svježeg zraka
LED zaslon statusa kvalitete zraka PurpleAir: 4 koraka
PurpleAir LED prikaz statusa kvalitete zraka: S nedavnim šumskim požarima u Kaliforniji, kvaliteta zraka u San Franciscu uvelike je pogođena. Zatekli smo se kako stalno provjeravamo kartu PurpleAir na svojim telefonima ili prijenosnim računalima pokušavajući vidjeti kada je zrak dovoljno siguran da otvori pobjedu
Jednostavno praćenje kvalitete zraka s TFT LCD zaslonom-- Ameba Arduino: 3 koraka
Jednostavno praćenje kvalitete zraka s TFT LCD zaslonom-Ameba Arduino: Uvod Sada kada većina ljudi ostaje kod kuće kako bi izbjegla bliski kontakt s potencijalnim prijenosnikom virusa COVID-19, kvaliteta zraka postaje važan čimbenik za dobrobit ljudi, posebno u tropskim zemljama gdje Korištenje klima uređaja potrebno je tijekom dana
Praćenje kvalitete zraka s DSM501A s Nokijinim LCD -om: 7 koraka
Nadzor kvalitete zraka s DSM501A s Nokijinim LCD -om: Pozdrav prijatelji! U ovom kratkom uputstvu pokazat ću vam kako nadzirati kvalitetu zraka u vašem domu ili bilo gdje. Prilično je jednostavno sastaviti ovu proračunsku cijenu za nadzor kvalitete zraka
Praćenje kvalitete zraka pomoću fotona čestica: 11 koraka (sa slikama)
Praćenje kvalitete zraka pomoću fotona čestica: U ovom projektu senzor čestica PPD42NJ koristi se za mjerenje kakvoće zraka (PM 2,5) prisutnog u zraku pomoću čestica fotona. Ne samo da prikazuje podatke na konzoli Particle and dweet.io, već također ukazuje na kvalitetu zraka pomoću RGB LED mijenjajući ga