INHOUDSOPGAWE:

Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling: 4 stappe
Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling: 4 stappe

Video: Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling: 4 stappe

Video: Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling: 4 stappe
Video: Teknologi pertanian organik terbaru di Jepang 2024, Julie
Anonim
Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling
Stelsel vir die monitering van luggehalte vir deeltjiesbesoedeling
Stelsel vir die monitering van luggehalte vir besoedeling van deeltjies
Stelsel vir die monitering van luggehalte vir besoedeling van deeltjies

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

Verbind die komponente
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

MIT App Inventor 2 -program
MIT App Inventor 2 -program

dit is die MIT -app -uitvinderskodeblok

Stap 4: DIE RESULTAT

hier is die video van die uitslag

Aanbeveel: