INHOUDSOPGAWE:
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
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
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
dit is die MIT -app -uitvinderskodeblok
Stap 4: DIE RESULTAT
hier is die video van die uitslag