Índice:
- Suprimentos
- Etapa 1: Conectando os componentes
- Etapa 2: Biblioteca e Programa Arduino
- Etapa 3: Programa MIT App Inventor 2
- Etapa 4: O RESULTADO
Vídeo: Sistema de monitoramento da qualidade do ar para poluição por partículas: 4 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:36
INTRODUÇÃO:
1 Neste projeto, mostro como construir um detector de partículas com exibição de dados, backup de dados em cartão SD e IOT. Visualmente, um display de anel de neopixels indica a qualidade do ar.
2 A qualidade do ar é uma preocupação cada vez mais importante hoje. existem sistemas para medir a taxa de poeira, mas são muito caros. Existem no mercado detectores de partículas de baixo custo e alta qualidade, como mostram alguns estudos.
por exemplo:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Portanto, decidi construir um dispositivo capaz de medir o número de partículas por classes de tamanho (0,5 µm a 10 µm), visualmente com uma exibição simples do resultado (anel de neo pixel), uma exibição mais detalhada em uma tela TFT e um backup com carimbo de data / hora em um cartão SD.
4 Além disso, adicionei um módulo de comunicação bluetooth para ser capaz de se comunicar com um aplicativo Android e, assim, publicar os resultados em um servidor IOT.
5 O custo total do conjunto não excede 60 €
Suprimentos
-Arduino uno R3
-Proto escudo Arduino
- Tela TFT ST7735
-Neopixel anel 24 led
-Plantower PMS5003
- Módulo bluetooth HC-06
Etapa 1: Conectando os componentes
os diferentes componentes são conectados de acordo com o diagrama acima
Etapa 2: Biblioteca e Programa Arduino
1 a biblioteca
para a tela TFT
github.com/adafruit/Adafruit-GFX-Library
para o anel neo pixel
github.com/adafruit/Adafruit_NeoPixel
para o cartão SD
github.com/arduino-libraries/SD
2 o esboço do arduino
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #incluir
// Qual pino do Arduino está conectado aos NeoPixels?
#define PIN 6 // No Trinket ou Gemma, sugira alterá-lo para 1
// Quantos NeoPixels estão anexados ao Arduino?
#define NUMPIXELS 24 // Tamanho do anel NeoPixel popular Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Color (0, 250, 0); uint32_t laranja = pixels. Cor (250, 250, 0); uint32_t rouge = pixels. Color (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // você também pode conectar isso à redefinição do Arduino
#include // Biblioteca gráfica principal
#include // Biblioteca específica de hardware #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicialização do cronômetro au démarrage du loop ()
#if definido (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opção 1: use quaisquer pinos, mas um pouco mais devagar
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opção 2: deve usar os pinos SPI de hardware
// (para UNO isso é sclk = 13 e sid = 11) e o pino 10 deve ser // uma saída. Isso é muito mais rápido - também necessário se você quiser // usar o cartão microSD (veja o exemplo de desenho da imagem) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Inicializar a ligação I2C Wire.begin (); // Inicializar o módulo RTC RTC.begin (); Serial.print ("init SD"); atraso (1000); if (! SD.begin (cs_sd)) // Condição vérifiant si la carte SD est presente no appareil {Serial.print ("Defaut SD"); Retorna; } Serial.print ("Carte SD OK");
Dados do arquivo = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("aquisição Démarrage"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializa um chip ST7735S, guia preta Serial.println ("init"); // nossa saída de depuração tft.fillScreen (ST7735_BLACK); // a taxa de transmissão do sensor é 9600 pmsSerial.begin (9600);
pixels.begin (); // INITIALIZE NeoPixel strip object (REQUIRED)
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ículas_03um, Partículas_05um, Partículas_10um, Partículas_25um, Partículas_50um, Partículas_100um; uint16_t unused; uint16_t checksum; };
struct pms5003data data; void loop () {pixels.clear (); // Definir todas as cores de pixel para 'off' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (now);
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 ("partes 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 ("partes 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 (laranja, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (laranja, 8, 8); pixels.fill (vermelho, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Envie as cores de pixel atualizadas para o hardware.
// 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 (dados.partículas_25um); String PM50 = String (dados.particles_50um); String PM100 = String (dados.partículas_100um); String PMS10 = String (data.pm10_standard); String PMS25 = String (dados.pm25_ padrão); String PMS100 = String (dados.pm100_ padrão); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Dados do arquivo = 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; } // Lê um byte de cada vez até chegarmos ao byte inicial '0x42' especial if (s-> peek ()! = 0x42) {s-> read (); retorna falso; }
// Agora leia todos os 32 bytes
if (s-> available () readBytes (buffer, 32);
// prepare a soma de verificação
para (uint8_t i = 0; i <30; i ++) {soma + = buffer ; }
/ * debugging
para (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); * / // Os dados vêm em endian'd, isso resolve para que funcione em todas as plataformas uint16_t buffer_u16 [15]; para (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i * 2 + 1]; buffer_u16 + = (buffer [2 + i * 2] << 8); }
// coloque em uma boa estrutura:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (sum! = data.checksum) {
Serial.println ("Falha na soma de verificação"); retorna falso; } // sucesso! return true; }
// Converti le numéro de jour en jour /! / La semaine start un dimanche
String donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; caso 1: retorna "LUN"; caso 2: retornar "MAR"; caso 3: retornar "MER"; caso 4: retornar "JEU"; caso 5: retornar "VEN"; caso 6: retornar "SAM"; padrão: 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 (data / hora.ano (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jornal); Serial.print (""); Serial.print (heure); //Serial.print (""); Dados do arquivo = 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);
atraso (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (número de bytes) {String resultat = ""; if (número <10) resultat = "0"; return resultat + = String (número, DEC); }
Etapa 3: Programa MIT App Inventor 2
este é o bloco de código do inventor do aplicativo MIT
Etapa 4: O RESULTADO
aqui está o vídeo do resultado
Recomendado:
MQ7-MONITORAMENTO DE POLUIÇÃO USANDO COISA FALAR E NODEMCU: 4 etapas
MQ7-MONITORAMENTO DE POLUIÇÃO USANDO COISA FALAR E NODEMCU: A poluição é o maior problema do nosso mundo de hoje. Mas como podemos monitorar nossa poluição por perto, agora é muito fácil. VAMOS COMEÇAR:
Monitoramento da qualidade do ar usando partículas de fóton: 11 etapas (com imagens)
Monitoramento da qualidade do ar usando partículas de fóton: Neste projeto o sensor de partículas PPD42NJ é usado para medir a qualidade do ar (PM 2,5) presente no ar com partículas de fótons. Ele não apenas exibe os dados no console de partículas e no dweet.io, mas também indica a qualidade do ar usando RGB LED, alterando-o
Monitor de qualidade do ar movido a partículas: 7 etapas
Monitor de qualidade do ar movido a partículas: Qualidade do ar. Você provavelmente pensa mais nisso agora que nosso ar puro se transformou em uma névoa permanente no céu. Que nojo. Uma coisa sobre a qual você tem controle é a qualidade do ar dentro de sua casa. Neste tutorial, vou mostrar como construir um ar
Construir um Detector de Poluição por Partículas LoRa: 8 etapas
Construir um Detector de Poluição por Partículas LoRa: Construiremos um detector de Material Particulado usando o Sensor de Qualidade do Ar PM2.5, ESP32, UNO e Módulo LoRa. A poluição por partículas, também conhecida como matéria particulada, é uma mistura de diversos tamanhos de sólidos e líquidos encontrados no ar. Alguns desses p
Estação de monitoramento de partículas de poeira alimentada por Arduino: 4 etapas (com fotos)
Estação de monitoramento de partículas de poeira alimentada por Arduino: você pode facilmente construir um dispositivo de Internet das coisas DIY que monitora a poluição por poeira em sua casa por menos de US $ 50 e ser notificado quando o nível de poeira ficar muito alto para que você possa arejar o ambiente, ou você pode configurar fora e seja notificado se for