Inhaltsverzeichnis:

System zur Überwachung der Luftqualität auf Feinstaubbelastung - Gunook
System zur Überwachung der Luftqualität auf Feinstaubbelastung - Gunook

Video: System zur Überwachung der Luftqualität auf Feinstaubbelastung - Gunook

Video: System zur Überwachung der Luftqualität auf Feinstaubbelastung - Gunook
Video: Feinstaub Luftüberwachung mit AirWatch von KEMPER 2024, Juli
Anonim
System zur Überwachung der Luftqualität auf Feinstaubbelastung
System zur Überwachung der Luftqualität auf Feinstaubbelastung
System zur Überwachung der Luftqualität auf Feinstaubbelastung
System zur Überwachung der Luftqualität auf Feinstaubbelastung

EINFÜHRUNG:

1 In diesem Projekt zeige ich, wie man einen Partikeldetektor mit Datenanzeige, Datensicherung auf SD-Karte und IOT baut. Optisch zeigt eine Neopixel-Ringanzeige die Luftqualität an.

2 Die Luftqualität ist heute ein immer wichtigeres Anliegen. Es gibt Systeme zur Messung des Staubanteils, die jedoch sehr teuer sind. Auf dem Markt gibt es preiswerte und qualitativ hochwertige Teilchendetektoren, wie einige Studien zeigen.

zum Beispiel:

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

3 Ich beschloss daher, ein Gerät zu bauen, das die Partikelanzahl nach Größenklassen (0,5 µm bis 10 µm) visuell messen kann, mit einfacher Ergebnisanzeige (Neo-Pixelring), einer detaillierteren Darstellung auf einem TFT-Bildschirm und a Backup mit Zeitstempel auf einer SD-Karte.

4 Zusätzlich habe ich ein Bluetooth-Kommunikationsmodul hinzugefügt, um mit einer Android-Anwendung kommunizieren zu können und so die Ergebnisse auf einem IOT-Server zu veröffentlichen.

5 Die Gesamtkosten des Ganzen überschreiten 60 € nicht

Lieferungen

-Arduino uno R3

-Arduino-Proto-Schild

-TFT-Bildschirm ST7735

-Neopixel-Ring 24 LEDs

-Pflanzenturm PMS5003

-HC-06 Bluetooth-Modul

Schritt 1: Anschließen der Komponenten

Anschließen der Komponenten
Anschließen der Komponenten

die verschiedenen Komponenten werden gemäß obigem Diagramm angeschlossen

Schritt 2: Bibliothek und Arduino-Programm

1 die Bibliothek

für den TFT-Bildschirm

github.com/adafruit/Adafruit-GFX-Library

für den Neopixelring

github.com/adafruit/Adafruit_NeoPixel

für die SD-Karte

github.com/arduino-libraries/SD

2 die arduino-skizze

#include #include // Bibliothek für I2C #include "RTClib.h" // Bibliothek für das Modul RTC RTC_DS1307 RTC; #enthalten

// Welcher Pin des Arduino ist mit den NeoPixels verbunden?

#define PIN 6 // Schlagen Sie bei Trinket oder Gemma vor, dies auf 1 zu ändern

// Wie viele NeoPixel sind an den Arduino angeschlossen?

#define NUMPIXELS 24 // Beliebte NeoPixel-Ringgröße Adafruit_NeoPixel-Pixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = Pixel. Farbe (0, 250, 0); uint32_t orange = Pixel. Farbe(250, 250, 0); uint32_t rouge = Pixel. Farbe(255, 0, 0);

SoftwareSerial pmsSerial(2, 3);

#define cs 10 #define dc 9 #define rst 8 // Sie können dies auch mit dem Arduino-Reset verbinden

#include // Kerngrafikbibliothek

#include // Hardwarespezifische Bibliothek #include #include const int cs_sd=4; int temps; // temps d'acquisition double tempsInit; // Initialisierung des Timers au demarrage du loop ()

#wenn definiert(_SAM3X8E_)

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

// Option 1: Beliebige Pins verwenden, aber etwas langsamer

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

// Option 2: muss die Hardware-SPI-Pins verwenden

// (für UNO ist das sclk = 13 und sid = 11) und Pin 10 muss // ein Ausgang sein. Dies ist viel schneller - auch erforderlich, wenn Sie // die microSD-Karte verwenden möchten (siehe Beispiel für die Bildzeichnung) Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); schweben nombre_leds=0; Void setup () { Serial.begin (9600); // Initialisiere la liaison I2C Wire.begin(); // Dateimodul RTC initialisieren RTC.begin(); Serial.print ("init SD"); Verzögerung (1000); If (! SD.begin (cs_sd)) // Bedingung für die SD-Karte, die im Appareil angezeigt wird {Serial.print ("Defaut SD"); Rückkehr; } Serial.print ("Karte SD OK");

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

data.println(""); data.println("Démarrage-Erwerb"); // Ecrit dans ce fichier data.close(); tft.initR(INITR_GREENTAB); // einen ST7735S-Chip initialisieren, schwarze Registerkarte Serial.println ("init"); // unsere Debugging-Ausgabe tft.fillScreen(ST7735_BLACK); // Sensorbaudrate beträgt 9600 pmsSerial.begin (9600);

Pixel.begin(); // NeoPixel-Streifenobjekt initialisieren (ERFORDERLICH)

Pixel.setHelligkeit(2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t Partikel_03um, Partikel_05um, Partikel_10um, Partikel_25um, Partikel_50um, Partikel_100um; uint16_t unbenutzt; uint16_t Prüfsumme; };

pms5003data-Daten strukturieren; Void Schleife () { Pixel.clear (); // Setze alle Pixelfarben auf 'off' DateTime now=RTC.now(); //Recupère l'heure et le date courante //affiche_date_heure(jetzt);

temps = ((millis() - tempsInit))/1000; // Demarrage du chrono

if (readPMSdata (&pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor(10, 5); tft.setTextColor(ST7735_WHITE); tft.println(" Anzahl Teile/ 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(" Mikrogramm/m³");

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(" Anzahl Teile/ 0,1 l");

// Serial.print (temps);

// Serial.print (" "); Seriendruck ("#"); Seriendruck ("03µm"); Serial.print (data.particles_03um); Seriendruck (" "); Seriendruck ("05µm"); Serial.print (data.particles_05um); Seriendruck (" "); Seriendruck ("1µm"); Serial.print (data.particles_10um); Seriendruck (" "); Seriendruck ("25µm"); Serial.print (data.particles_25um); Seriendruck (" "); Seriendruck ("50µm"); Serial.print (data.particles_50um); Seriendruck (" "); Seriendruck ("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);

wenn ((nombre_leds=1)){

Pixel.fill(vert, 0, nombre_leds); aufrechtzuerhalten. Sonst if ((nombre_leds = 8)) {pixel.fill (vert, 0, 8); Pixel.fill(orange, 8, ((nombre_leds)-8)); } sonst if (nombre_leds>16) {

Pixel.fill(vert, 0, 8); Pixel.fill(orange, 8, 8); Pixel.fill(rouge, 16, ((nombre_leds)-16)); aufrechtzuerhalten. Sonst if (nombre_leds<=1) {pixel.fill (vert, 0, 1); } Pixel.show(); // Senden Sie die aktualisierten Pixelfarben an die Hardware.

// Definition données String PM03=String(data.particles_03um); String PM05=String(data.particles_05um); Zeichenfolge PM10=Zeichenfolge(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(Temps);

//Ecriture des données dans le fichier texte

Datei data=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; } // Lesen Sie ein Byte nach dem anderen, bis wir zum speziellen '0x42'-Startbyte gelangen if (s->peek() != 0x42) { s->read(); falsch zurückgeben; }

// Jetzt alle 32 Byte lesen

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

// Prüfsumme fertig machen

für (uint8_t i=0; i<30; i++) { Summe += Puffer; }

/* Debugging

für (uint8_t i=2; i<32; i++) {Serial.print("0x"); Serial.print (Puffer, HEX); Serial.print (", "); } Serial.println(); */ // Die Daten kommen in endian'd, das löst es, damit es auf allen Plattformen funktioniert uint16_t buffer_u16[15]; für (uint8_t i=0; i<15; i++) { Puffer_u16 = Puffer[2 + i*2 + 1]; Puffer_u16 += (Puffer[2 + i*2] << 8); }

// setze es in eine schöne Struktur:)

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

if (sum != data.checksum) {

Serial.println ("Prüfsummenfehler"); falsch zurückgeben; } // Erfolg! true zurückgeben; }

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

String donne_jour_semaine(uint8_t j){ switch(j){ case 0: return "DIM"; Fall 1: Rückgabe von "LUN"; Fall 2: Rückgabe von "MAR"; Fall 3: Rückgabe von "MER"; Fall 4: Rückgabe "JEU"; Fall 5: Rückgabe von "VEN"; Fall 6: "SAM" zurückgeben; Vorgabe: Rückgabe " "; } }

// affiche la date et l'heure sur l'écran

void affiche_date_heure(DateTime datetime){ // Datumszeichenfolge 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); //Seriendruck (" "); Datei data=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);

Verzögerung (500);

}

//permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres(byte nombre) { String resultat = ""; if(nombre < 10) resultat = "0"; Ergebnis zurückgeben += String(Nombre, DEC); }

Schritt 3: MIT App Inventor 2-Programm

MIT App Inventor 2-Programm
MIT App Inventor 2-Programm

Dies ist der Codeblock des MIT-App-Erfinders

Schritt 4: DAS ERGEBNIS

hier ist das Video vom Ergebnis

Empfohlen: