Inhoudsopgave:

Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen

Video: Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen

Video: Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen
Video: Webinar luchtkwaliteit 2024, Juli-
Anonim
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging

INTRO:

1 In dit project laat ik zien hoe je een deeltjesdetector bouwt met gegevensweergave, gegevensback-up op SD-kaart en IOT. Visueel geeft een neopixels ringdisplay de luchtkwaliteit aan.

2 Luchtkwaliteit is tegenwoordig een steeds belangrijker aandachtspunt. er zijn systemen om de stofsnelheid te meten, maar die zijn erg duur. Er zijn goedkope deeltjesdetectoren van hoge kwaliteit op de markt, zoals blijkt uit sommige onderzoeken.

bijvoorbeeld:

www.atmos-meas-tech.net/11/4823/2018/amt-1…

3 Daarom besloot ik een apparaat te bouwen dat het aantal deeltjes per grootteklasse (0,5 µm tot 10 µm) kan meten, visueel met een eenvoudige weergave van het resultaat (neo pixelring), een meer gedetailleerde weergave op een TFT-scherm en een back-up met tijdstempel op een SD-kaart.

4 Daarnaast heb ik een bluetooth communicatie module toegevoegd om te kunnen communiceren met een android applicatie en zo de resultaten op een IOT server te publiceren.

5 De totale kostprijs van het geheel bedraagt niet meer dan 60 €

Benodigdheden

-Arduino uno R3

-Arduino proto-schild

-TFT-scherm ST7735

-Neopixelring 24 led

-Plantentoren PMS5003

-HC-06 bluetooth-module

Stap 1: De componenten aansluiten

De componenten aansluiten
De componenten aansluiten

de verschillende componenten zijn aangesloten volgens het bovenstaande schema

Stap 2: Bibliotheek en Arduino-programma

1 de bibliotheek

voor het TFT-scherm

github.com/adafruit/Adafruit-GFX-Library

voor de neo-pixelring

github.com/adafruit/Adafruit_NeoPixel

voor de sd-kaart

github.com/arduino-libraries/SD

2 de arduino-schets

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #erbij betrekken

// Welke pin op de Arduino is verbonden met de NeoPixels?

#define PIN 6 // Op Trinket of Gemma, stel voor dit te wijzigen in 1

// Hoeveel NeoPixels zijn aangesloten op de Arduino?

#define NUMPIXELS 24 // Populaire NeoPixel ringmaat Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Kleur (0, 250, 0); uint32_t oranje = pixels. Kleur (250, 250, 0); uint32_t rouge = pixels. Kleur (255, 0, 0);

SoftwareSerial pmsSerial(2, 3);

#define cs 10 #define dc 9 #define rst 8 // deze kan je ook aansluiten op de Arduino reset

#include // Core grafische bibliotheek

#include // Hardwarespecifieke bibliotheek #include #include const int cs_sd=4; int-temp; // temps d'acquisition dubbele tempsInit; // initialisatie van de timer au démarrage du loop()

#indien gedefinieerd(_SAM3X8E_)

#undef _FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif

// Optie 1: gebruik alle pinnen, maar een beetje langzamer

//Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);

// Optie 2: moet de hardware SPI-pinnen gebruiken

// (voor UNO is dat sclk = 13 en sid = 11) en pin 10 moet // een output zijn. Dit is veel sneller - ook vereist als u // de microSD-kaart wilt gebruiken (zie het afbeeldingsvoorbeeld) Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); float nombre_leds=0; void setup() { Serial.begin(9600); // Initialiseer de liaison I2C Wire.begin(); // Initialiseer de 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"); opbrengst; } Serial.print("Carte SD OK");

Bestandsgegevens = SD.open("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println(""); data.println("Démarrage acquisitie"); // Ecrit dans ce ficier data.close(); tft.initR(INITR_GREENTAB); // initialiseer een ST7735S-chip, zwarte tab Serial.println ("init"); // onze foutopsporingsuitvoer tft.fillScreen (ST7735_BLACK); // de baudrate van de sensor is 9600 pmsSerial.begin (9600);

pixels.begin(); // INITIALISEER NeoPixel-stripobject (VERPLICHT)

pixels.setHelderheid(2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t partikels_03um, partikels_05um, partikels_10um, partikels_25um, partikels_50um, partikels_100um; uint16_t ongebruikt; uint16_t controlesom; };

structuur pms5003data-gegevens; void loop() { pixels.clear(); // Zet alle pixelkleuren op 'off' DateTime now=RTC.now(); //Recupère l'heure et le date courante //affiche_date_heure(nu);

temps = ((millis() - tempsInit))/1000; // Démarrage du chrono

if (leesPMSdata (& pmsSerial)) { // tft.fillScreen (ST7735_BLACK); tft.setCursor(10, 5); tft.setTextColor(ST7735_WHITE); tft.println(" aantal onderdelen/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(" microgram/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(" aantal onderdelen/0.1 l");

// Serial.print (tijdelijk);

// Serial.print (" "); Serieafdruk ("#"); Serial.print ("03 µm "); Serial.print(data.particles_03um); Serieafdruk (" "); Serieafdruk ("05 µm "); Serial.print(data.particles_05um); Serieafdruk (" "); Serieafdruk ("1µm "); Serial.print(data.particles_10um); Serieafdruk (" "); Serieafdruk ("25 µm "); Serial.print(data.particles_25um); Serieafdruk (" "); Serieafdruk ("50 µm "); Serial.print(data.particles_50um); Serieafdruk (" "); Serieafdruk ("100 µm "); Serial.print(data.particles_100um); Serieel.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(oranje, 8, ((nombre_leds)-8)); } else if (nombre_leds>16) {

pixels.fill(vert, 0, 8); pixels.fill(oranje, 8, 8); pixels.fill(rouge, 16, ((nombre_leds)-16)); } else if (nombre_leds<=1) { pixels.fill(vert, 0, 1); } pixels.show(); // Stuur de bijgewerkte pixelkleuren naar de hardware.

// Definitie 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_standard); String PMS25=String(data.pm25_standard); String PMS100=String(data.pm100_standard); String Temps=String(temp);

//Ecriture des données dans le fichier texte

Bestandsgegevens=SD.open("donnees.txt", FILE_WRITE); data.println(Temps + " " + PM03+ " " + PM05 +" " +PM10+" " +PM25+" "+PM50+" " +PM100+" "+PMS10+" "+PMS25+" "+PMS100+" "); gegevens.sluiten(); }

}

boolean readPMSdata(Stream *s) {

if (! s->available()) { return false; } // Lees een byte per keer totdat we bij de speciale '0x42' start-byte komen if (s->peek() != 0x42) { s->read(); onwaar retourneren; }

// Lees nu alle 32 bytes

if (s->available() readBytes(buffer, 32);

// maak de checksum klaar

for (uint8_t i=0; i<30; i++) { sum += buffer; }

/* debuggen

for (uint8_t i=2; i<32; i++) { Serial.print("0x"); Serial.print(buffer, HEX); Serieel.print(", "); } Serieel.println(); */ // De gegevens komen in endian'd, dit lost het op zodat het op alle platforms werkt 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); }

// zet het in een mooie structuur:)

memcpy((void *)&data, (void *)buffer_u16, 30);

if (sum != data.checksum) {

Serial.println ("Checksum-fout"); onwaar retourneren; } // succes! retourneer waar; }

//Converti le numéro de jour en jour /!\ la semaine start un dimanche

String donne_jour_semaine(uint8_t j){ switch(j){ geval 0: retourneer "DIM"; geval 1: retourneer "LUN"; geval 2: retourneer "MAR"; geval 3: retourneer "MER"; geval 4: retourneer "JEU"; geval 5: retourneer "VEN"; geval 6: retourneer "SAM"; standaard: retourneer " "; } }

// 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); Serieel.print(" "); Serial.print(heure); //Serial.print(" "); Bestandsgegevens=SD.open("donnees.txt", FILE_WRITE); data.print(jour + " " + heure+" "); gegevens.sluiten();

tft.setCursor(2, 120);

tft.setTextColor(ST7735_GREEN); tft.setTextSize(1); tft.print("date ");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 resultat = ""; if(nombre < 10) resultat = "0"; resultaat resultaat += String (nombre, DEC); }

Stap 3: MIT App Inventor 2-programma

MIT App Inventor 2-programma
MIT App Inventor 2-programma

dit is het codeblok van de MIT-app-uitvinder

Stap 4: HET RESULTAAT

hier is de video van het resultaat

Aanbevolen: