Taula de continguts:
- Subministraments
- Pas 1: connectar els components
- Pas 2: Biblioteca i programa Arduino
- Pas 3: Programa MIT App Inventor 2
- Pas 4: EL RESULTAT
Vídeo: Sistema de control de la qualitat de l’aire per a la contaminació de partícules: 4 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:13
INTRODUCCIÓ:
1 En aquest projecte mostro com construir un detector de partícules amb visualització de dades, còpia de seguretat de dades a la targeta SD i IOT. Visualment, una pantalla de neopíxels indica la qualitat de l'aire.
2 La qualitat de l'aire és una preocupació cada vegada més important en l'actualitat. hi ha sistemes per mesurar la taxa de pols, però són molt cars. Hi ha detectors de partícules de baix cost i d’alta qualitat al mercat, com demostren alguns estudis.
per exemple:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Per tant, vaig decidir construir un dispositiu capaç de mesurar el nombre de partícules per classes de mida (de 0,5 µm a 10 µm), visualment amb una simple visualització del resultat (anell de neo píxels), una visualització més detallada en una pantalla TFT i una còpia de seguretat amb marca de temps en una targeta SD.
4 A més, he afegit un mòdul de comunicació bluetooth per poder comunicar-me amb una aplicació d'Android i publicar els resultats en un servidor IOT.
5 El cost global del conjunt no supera els 60 €
Subministraments
-Arduino uno R3
-Escut proto arduino
-Pantalla TFT ST7735
-Anell Neopixel de 24 leds
-Plantower PMS5003
-Mòdul bluetooth HC-06
Pas 1: connectar els components
els diferents components es connecten segons el diagrama anterior
Pas 2: Biblioteca i programa Arduino
1 la biblioteca
per a la pantalla TFT
github.com/adafruit/Adafruit-GFX-Library
per a l'anell de neo píxels
github.com/adafruit/Adafruit_NeoPixel
per a la targeta sd
github.com/arduino-libraries/SD
2 l'esbós arduino
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #incloure
// Quin pin de l'Arduino està connectat als NeoPixels?
#define PIN 6 // A Trinket o Gemma, suggeriu canviar-lo a 1
// Quants NeoPixels estan connectats a l'Arduino?
#define NUMPIXELS 24 // Popular NeoPixel ring size Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Color (0, 250, 0); uint32_t taronja = píxels. Color (250, 250, 0); uint32_t rouge = pixels. Color (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // també podeu connectar-lo al restabliment d'Arduino
#include // Biblioteca de gràfics bàsics
#include // Biblioteca específica de maquinari #include #include const int cs_sd = 4; int temps; // temps d’acquisition double tempsInit; // initialisation du timer au démarrage du loop ()
#if definit (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opció 1: utilitzeu qualsevol pin però una mica més lent
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opció 2: cal utilitzar els pins SPI de maquinari
// (per a UNO thats sclk = 13 i sid = 11) i el pin 10 ha de ser // una sortida. Això és molt més ràpid, també és necessari si voleu // utilitzar la targeta microSD (vegeu l'exemple de dibuix de la imatge) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; configuració nul·la () {Serial.begin (9600); // Inicialitzar la connexió I2C Wire.begin (); // Inicialitzar el mòdul RTC RTC.begin (); Serial.print ("init SD"); retard (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); tornar; } Serial.print ("Carta SD OK");
Dades del fitxer = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Adquisició Démarrage"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicialitzar un xip ST7735S, pestanya negra Serial.println ("init"); // la nostra sortida de depuració tft.fillScreen (ST7735_BLACK); // la velocitat de transmissió del sensor és de 9600 pmsSerial.begin (9600);
pixels.begin (); // INICIALITZAR NeoPixel strip object (OBLIGATORI)
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 partícules_03um, partícules_05um, partícules_10um, partícules_25um, partícules_50um, partícules_100um; uint16_t unused; uint16_t suma de comprovació; };
struct pms5003data data; bucle buit () {pixels.clear (); // Estableix tots els colors de píxels a "off" DateTime ara = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (ara);
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 ("parts nbre / 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 (" microg / 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 ("parts nbre / 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);
if ((nombre_leds = 1)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (taronja, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (taronja, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Envieu els colors de píxels actualitzats al maquinari.
// Définition données String PM03 = String (data.particles_03um); Cadena PM05 = Cadena (data.particles_05um); Cadena PM10 = Cadena (data.particles_10um); Cadena PM25 = Cadena (data.particles_25um); Cadena PM50 = Cadena (data.particles_50um); Cadena PM100 = Cadena (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
Dades del fitxer = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps + "" + PM03 + "" + PM05 + "" + PM10 + "" + PM25 + "" + PM50 + "" + PM100 + "" + PMS10 + "" + PMS25 + "" + PMS100 + ""); data.close (); }
}
readPMSdata booleà (corrent *) {
if (! s-> available ()) {return false; } // Llegiu un byte a la vegada fins que arribem al byte especial "0x42" si (s-> peek ()! = 0x42) {s-> read (); tornar fals; }
// Ara llegiu els 32 bytes
if (s-> available () readBytes (buffer, 32);
// prepara la suma de comprovació
for (uint8_t i = 0; i <30; i ++) {sum + = buffer ; }
/ * depuració
per a (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (memòria intermèdia , HEX); Serial.print (","); } Serial.println (); * / // Les dades vénen endian'd, això les resol, de manera que funcionen a totes les plataformes 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); }
// posa-ho en una bonica estructura:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (suma! = data.checksum) {
Serial.println ("Error de suma de verificació"); tornar fals; } // èxit! tornar cert; }
// 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"; cas 1: torna "LUN"; cas 2: retornar "MAR"; cas 3: retornar "MER"; cas 4: tornar "JEU"; cas 5: retornar "VEN"; cas 6: retornar "SAM"; per defecte: retorn ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// Data String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Cadena (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 (""); Dades del fitxer = 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 ("data"); 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);
retard (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (nombre de bytes) {String resultat = ""; if (nombre <10) resultat = "0"; return result + = String (nombre, DEC); }
Pas 3: Programa MIT App Inventor 2
aquest és el bloc de codi inventor de l'aplicació MIT
Pas 4: EL RESULTAT
aquí teniu el vídeo del resultat
Recomanat:
Detecció de contaminació atmosfèrica + filtració d'aire: 4 passos
Detecció de la contaminació atmosfèrica + filtració de l’aire: els estudiants (Aristobulus Lam, Victor Sim, Nathan Rosenzweig i Declan Loges) de German Swiss International School van treballar amb el personal de MakerBay per produir un sistema integrat de mesura de la contaminació de l’aire i efectivitat de la filtració de l’aire. Això
Monitorització de la qualitat de l'aire mitjançant fotó de partícules: 11 passos (amb imatges)
Monitorització de la qualitat de l’aire mitjançant fotó de partícules: en aquest projecte s’utilitza el sensor de partícules PPD42NJ per mesurar la qualitat de l’aire (PM 2.5) present a l’aire amb el fotó de partícules. No només mostra les dades a la consola Particle i dweet.io, sinó que també indica la qualitat de l’aire mitjançant LED RGB canviant-lo
Monitor de qualitat de l'aire amb partícules: 7 passos
Monitor de qualitat de l’aire amb partícules: qualitat de l’aire. Probablement hi pensareu més ara que el nostre aire net s’ha convertit en una boira permanent pel cel. Ull. Una cosa que teniu control és la qualitat de l’aire a casa vostra. En aquest tutorial, us mostraré com construir un aire
Construïu un detector de contaminació de partícules LoRa: 8 passos
Construïu un detector de contaminació de partícules LoRa: construirem un detector de matèria de partícules mitjançant el sensor de qualitat de l’aire PM2.5, ESP32, UNO i el mòdul LoRa. La contaminació de partícules, també coneguda com a matèria de partícules, és una barreja de grans mides de sòlids i líquids que es troben a l’aire. Algunes d'aquestes p
Bona qualitat V qualitat! Auriculars Sony Ericsson: 3 passos
Bona qualitat V qualitat! … Auriculars Sony Ericsson: només podem accedir-hi … He comprat uns auriculars Sony Ericsson per 5 €, considerablement menys que els auriculars bluetooth que poden costar fins a 50 €. , tenien una bona relació qualitat-preu, però la qualitat és dolenta, us mostraré algunes tècniques per a