Taula de continguts:

Sistema de control de la qualitat de l’aire per a la contaminació de partícules: 4 passos
Sistema de control de la qualitat de l’aire per a la contaminació de partícules: 4 passos

Vídeo: Sistema de control de la qualitat de l’aire per a la contaminació de partícules: 4 passos

Vídeo: Sistema de control de la qualitat de l’aire per a la contaminació de partícules: 4 passos
Vídeo: Qualitat de l'aire dintre, a sobre i al voltant de Barcelona 2024, Juliol
Anonim
Sistema de control de la qualitat de l’aire per a la contaminació de partícules
Sistema de control de la qualitat de l’aire per a la contaminació de partícules
Sistema de control de la qualitat de l’aire per a la contaminació de partícules
Sistema de control de la qualitat de l’aire per a la contaminació de partícules

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

Connexió dels components
Connexió dels 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

Programa MIT App Inventor 2
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: