INHOUDSOPGAWE:
- Voorrade
- Stap 1: Verbind die komponente
- Stap 2: Biblioteek- en Arduino -program
- Stap 3: MIT App Inventor 2 -program
- Stap 4: DIE RESULTAT
Video: Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling: 4 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:25
INLEIDING:
1 In hierdie projek wys ek hoe u 'n deeltjiedetektor bou met datavertoning, rugsteun van data op SD -kaart en IOT. Visueel dui 'n neopixels -ringskerm die luggehalte aan.
2 Luggehalte word vandag 'n al hoe groter kommer. Daar is stelsels om die stofsnelheid te meet, maar dit is baie duur. Daar is goedkoop deeltjieverklikkers van hoë gehalte op die mark, soos sommige studies toon.
byvoorbeeld:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Daarom het ek besluit om 'n toestel te bou wat die aantal deeltjies volgens grootteklasse (0,5 µm tot 10 µm) kan meet, visueel met 'n eenvoudige weergawe van die resultaat (neo pixelring), 'n meer gedetailleerde vertoning op 'n TFT -skerm en 'n rugsteun op 'n SD-kaart met 'n tydstempel.
4 Verder het ek 'n Bluetooth -kommunikasiemodule bygevoeg om met 'n Android -toepassing te kan kommunikeer en sodoende die resultate op 'n IOT -bediener te publiseer.
5 Die totale koste van die geheel is nie meer as 60 € nie
Voorrade
-Arduino vir R3
-Arduino proto skild
-TFT skerm ST7735
-Neopixel ring 24 LED
-Plantower PMS5003
-HC-06 Bluetooth-module
Stap 1: Verbind die komponente
die verskillende komponente word volgens die diagram hierbo verbind
Stap 2: Biblioteek- en Arduino -program
1 die biblioteek
vir die TFT -skerm
github.com/adafruit/Adafruit-GFX-Library
vir die neo pixel ring
github.com/adafruit/Adafruit_NeoPixel
vir die sd kaart
github.com/arduino-libraries/SD
2 die arduino -skets
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #insluit
// Watter pen op die Arduino is aan die NeoPixels gekoppel?
#definieer PIN 6 // Stel op Trinket of Gemma voor om dit na 1 te verander
// Hoeveel NeoPixels is aan die Arduino gekoppel?
#define NUMPIXELS 24 // Gewilde NeoPixel -ringgrootte Adafruit_NeoPixel -pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Color (0, 250, 0); uint32_t oranje = pixels. Color (250, 250, 0); uint32_t rouge = pixels. Color (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #definieer dc 9 #definieer eerste 8 // jy kan dit ook koppel aan die Arduino reset
#include // Core grafiese biblioteek
#include // Hardware-spesifieke biblioteek #include #include const int cs_sd = 4; int temps; // temps d'acquisition dubbele tempsInit; // initialisation du timer au démarrage du loop ()
#as gedefinieer (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opsie 1: gebruik enige penne, maar 'n bietjie stadiger
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opsie 2: moet die hardeware SPI -penne gebruik
// (vir UNO dis sclk = 13 en sid = 11) en pen 10 moet // 'n uitset wees. Dit is baie vinniger - ook nodig as u // die microSD -kaart wil gebruik (sien die voorbeeld van die tekening) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; ongeldige opstelling () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Begin die module RTC RTC.begin (); Serial.print ("init SD"); vertraging (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); terugkeer; } Serial.print ("Carte SD OK");
Lêerdata = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Démarrage -verkryging"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initialiseer 'n ST7735S -chip, swart blad Serial.println ("init"); // ons ontfoutingsuitset tft.fillScreen (ST7735_BLACK); // sensor baud rate is 9600 pmsSerial.begin (9600);
pixels.begin (); // INITIALISEER NeoPixel -strookvoorwerp (benodig)
pixels.setBrightness (2);
}
struct pms5003data {
uint16_t framelen; uint16_t pm10_standaard, pm25_standaard, pm100_standaard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t deeltjies_03um, deeltjies_05um, deeltjies_10um, deeltjies_25um, deeltjies_50um, deeltjies_100um; uint16_t ongebruik; uint16_t kontrolesom; };
struct pms5003data data; leemte -lus () {pixels.clear (); // Stel alle pixel kleure op 'off' DateTime nou = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nou);
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 dele/ 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 (" mikrogram/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 dele/ 0.1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Serial.print ("03µm"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 µm"); Serial.print (data.particles_05um); Serial.print (""); Serial.print ("1 µm"); Serial.print (data.particles_10um); Serial.print (""); Serial.print ("25 µm"); Serial.print (data.particles_25um); Serial.print (""); Serial.print ("50 µm"); Serial.print (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);
as ((nombre_leds = 1)) {
pixels.fill (vert, 0, nombre_leds); } anders as ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oranje, 8, ((nombre_leds) -8)); } anders as (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (oranje, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } anders as (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Stuur die opgedateerde pixelkleure na die hardeware.
// 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_standaard); String PMS25 = String (data.pm25_standaard); String PMS100 = String (data.pm100_standaard); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Lêerdata = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
boolean readPMSdata (Stroom *s) {
as (! s-> beskikbaar ()) {return false; } // Lees 'n greep op 'n slag totdat ons by die spesiale '0x42' begin-byte kom as (s-> kyk ()! = 0x42) {s-> lees (); terugkeer vals; }
// Lees nou al 32 grepe
as (s-> beskikbaar () readBytes (buffer, 32);
// maak die kontrolesom gereed
vir (uint8_t i = 0; i <30; i ++) {som+= buffer ; }
/* ontfouting
vir (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Die data kom in endian'd, dit los dit op sodat dit op alle platforms werk uint16_t buffer_u16 [15]; vir (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i*2 + 1]; buffer_u16 + = (buffer [2 + i*2] << 8); }
// sit dit in 'n mooi struktuur:)
memcpy ((void *) en data, (void *) buffer_u16, 30);
if (som! = data.checksum) {
Serial.println ("mislukking in die kontrolesom"); terugkeer vals; } // sukses! terugkeer waar; }
// 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"; saak 1: terugkeer "LUN"; saak 2: terugkeer "MAR"; saak 3: stuur "MER" terug; saak 4: terugkeer "JEU"; saak 5: terugkeer "VEN"; saak 6: terugkeer "SAM"; verstek: terugkeer ""; }}
// 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 (""); Lêerdata = 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);
vertraging (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) {String resultaat = ""; as (nommer <10) resultaat = "0"; terugkeer resultaat += String (nommer, DEC); }
Stap 3: MIT App Inventor 2 -program
dit is die MIT -app -uitvinderskodeblok
Stap 4: DIE RESULTAT
hier is die video van die uitslag
Aanbeveel:
Eenvoudige monitering van luggehalte met TFT LCD-skerm- Ameba Arduino: 3 stappe
Eenvoudige monitering van luggehalte met TFT LCD-skerm-Ameba Arduino: Inleiding Noudat die meeste mense tuis bly om noue kontak met moontlike COVID-19-virusdraer te vermy, word luggehalte 'n belangrike faktor vir mense se welstand, veral in tropiese lande waar lugversorging is 'n moet tydens die dag
Monitering van luggehalte met behulp van deeltjiesfoton: 11 stappe (met foto's)
Monitering van luggehalte met behulp van deeltjiefoton: In hierdie projek word PPD42NJ deeltjesensor gebruik om die luggehalte (PM 2.5) in die lug met Particle Photon te meet. Dit wys nie net die data op deeltjiekonsole en dweet.io nie, maar dui ook die luggehalte aan met behulp van RGB LED deur dit te verander
AirCitizen - Monitering van luggehalte: 11 stappe (met foto's)
AirCitizen - Monitering van luggehalte: Hallo almal! Vandag leer ons u hoe u ons projek kan reproduseer: AirCitizen deur die AirCitizenPolytech-span!-Komende uit die 'OpenAir / What's your air?' Projekte, die AirCitizen -projek het ten doel om burgers in staat te stel om die kwaliteit aktief te evalueer
Instruksies vir die voltooiing van die opmaak van die baanskyfontwerp vir die opheffing/verlaging van die middelste voetsteun op motorwielstoele: 9 stappe (met foto's)
Instruksies vir die voltooiing van die opmaak van die baanskyfontwerp vir die opheffing/verlaging van die middelste voetsteun op motorwielstoele: die middelste voetsteunhysers moet goed onder die sitplek geberg word en laer om te ontplooi. 'N Meganisme vir die onafhanklike werking van die opberging en ontplooiing van voetsteun is nie ingesluit by rolstoele op die mark nie, en PWC -gebruikers het die behoefte uitgespreek
Hoe u u rekenaar drasties kan bespoedig en die snelheid kan handhaaf vir die hele lewe van die stelsel: 9 stappe
Hoe u u rekenaar drasties kan bespoedig en die snelheid kan handhaaf vir die hele lewe van die stelsel: Dit is 'n handleiding wat ek gemaak het oor hoe u u rekenaar kan opruim, aanpas en optimaliseer sodat dit vinniger kan werk as toe u die eerste keer gekoop het dit en om dit so te hou. Ek sal foto's plaas sodra ek 'n kans kry, maar ongelukkig op die oomblik nie