
Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-23 15:11


INTRO:
1 I detta projekt visar jag hur man bygger en partikeldetektor med datavisning, säkerhetskopiering av data på SD -kort och IOT. Visuellt visar en neopixels ringdisplay luftkvaliteten.
2 Luftkvaliteten är en allt viktigare fråga idag. det finns system för att mäta dammhastigheten men de är mycket dyra. Det finns billiga, högkvalitativa partikeldetektorer på marknaden, vilket vissa studier visar.
till exempel:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Jag bestämde mig därför för att bygga en enhet som kan mäta antalet partiklar efter storleksklasser (0,5 µm till 10 µm), visuellt med en enkel visning av resultatet (neo pixelring), en mer detaljerad visning på en TFT -skärm och en tidsstämplad säkerhetskopia på ett SD-kort.
4 Dessutom har jag lagt till en Bluetooth -kommunikationsmodul för att kunna kommunicera med en Android -applikation och därmed publicera resultaten på en IOT -server.
5 Den totala kostnaden för helheten överstiger inte 60 €
Tillbehör
-Arduino uno R3
-Arduino proto sköld
-TFT -skärm ST7735
-Neopixelring 24 led
-Plantower PMS5003
-HC-06 Bluetooth-modul
Steg 1: Ansluta komponenterna

de olika komponenterna är anslutna enligt diagrammet ovan
Steg 2: Bibliotek och Arduino -program
1 biblioteket
för TFT -skärmen
github.com/adafruit/Adafruit-GFX-Library
för neopixelringen
github.com/adafruit/Adafruit_NeoPixel
för sd -kortet
github.com/arduino-libraries/SD
2 arduino -skissen
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #omfatta
// Vilken pin på Arduino är ansluten till NeoPixels?
#define PIN 6 // På Trinket eller Gemma, föreslå att du ändrar detta till 1
// Hur många NeoPixels är anslutna till Arduino?
#define NUMPIXELS 24 // Populär NeoPixel -ringstorlek Adafruit_NeoPixel -pixlar (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixlar. Färg (0, 250, 0); uint32_t orange = pixlar. Färg (250, 250, 0); uint32_t rouge = pixlar. Färg (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // du kan också ansluta detta till Arduino -återställningen
#include // Core grafikbibliotek
#include // Hardware-specifikt bibliotek #include #include const int cs_sd = 4; int temps; // temps d'acquisition dubbel tempsInit; // initialisering av timer au démarrage du loop ()
#if definierat (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Alternativ 1: använd alla stift men lite långsammare
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Alternativ 2: måste använda maskinvarans SPI -stift
// (för UNO det är sclk = 13 och sid = 11) och stift 10 måste vara // en utgång. Detta är mycket snabbare - krävs också om du vill // använda microSD -kortet (se bildritningsexemplet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Initialize la liaison I2C Wire.begin (); // Initiera modulen RTC RTC.begin (); Serial.print ("init SD"); fördröjning (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); lämna tillbaka; } Serial.print ("Carte SD OK");
Fildata = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Démarrage -förvärv"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initiera ett ST7735S -chip, svart flik Serial.println ("init"); // vår felsökningsutmatning tft.fillScreen (ST7735_BLACK); // sensorns överföringshastighet är 9600 pmsSerial.begin (9600);
pixlar. börjar (); // INITIALISERA NeoPixel -bandobjekt (KRÄVS)
pixlar.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 partiklar_03um, partiklar_05um, partiklar_10um, partiklar_25um, partiklar_50um, partiklar_100um; uint16_t oanvänd; uint16_t kontrollsumma; };
struct pms5003data data; void loop () {pixels.clear (); // Ställ in alla pixelfärger till 'off' DateTime nu = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nu);
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 delar/ 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 (" mikrog/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 delar/ 0,1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Seriellt tryck ("03 um"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 µm"); Serial.print (data.particles_05um); Serial.print (""); Seriellt tryck ("1 um"); Serial.print (data.particles_10um); Serial.print (""); Seriellt tryck ("25 um"); Serial.print (data.particles_25um); Serial.print (""); Seriellt tryck ("50 µm"); Serial.print (data.particles_50um); Serial.print (""); Seriellt tryck ("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)) {
pixlar. fyllning (vert, 0, nombre_leds); } annars if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixlar. fyllning (orange, 8, ((nombre_leds) -8)); } annat om (nombre_leds> 16) {
pixlar. fyllning (vert, 0, 8); pixlar. fyllning (orange, 8, 8); pixlar. fyllning (rouge, 16, ((nombre_leds) -16)); } annars if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixlar. visa (); // Skicka de uppdaterade pixelfärgerna till hårdvaran.
// 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_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
Fildata = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
booleskt readPMSdata (Stream *s) {
om (! s-> tillgänglig ()) {return false; } // Läs en byte i taget tills vi kommer till den speciella '0x42' startbyten if (s-> peek ()! = 0x42) {s-> read (); return falsk; }
// Läs nu alla 32 byte
if (s-> tillgänglig () readBytes (buffert, 32);
// gör redovisningen klar
för (uint8_t i = 0; i <30; i ++) {sum+= buffert ; }
/* felsökning
för (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffert , HEX); Serial.print (","); } Serial.println (); */ // Data kommer i endian'd, detta löser det så att det fungerar på alla plattformar uint16_t buffer_u16 [15]; för (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffert [2 + i*2 + 1]; buffer_u16 + = (buffert [2 + i*2] << 8); }
// sätta in det i en fin struktur:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (summa! = data.checksumma) {
Serial.println ("Checksumfel"); return falsk; } // Framgång! återvända sant; }
// Converti le numéro de jour en jour /! / La semaine commence un dimanche
Sträng donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; fall 1: returnera "LUN"; fall 2: returnera "MAR"; fall 3: returnera "MER"; fall 4: returnera "JEU"; fall 5: returnera "VEN"; fall 6: returnera "SAM"; default: 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 (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 (""); Fildata = 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);
fördröjning (500);
}
// permet d'afficher les nombres sur deux chiffres
Sträng Vers2Chiffres (byte nombre) {String resultat = ""; if (nr <10) resultat = "0"; returresultat += String (nombre, DEC); }
Steg 3: MIT App Inventor 2 Program

detta är MIT -appens uppfinnarkodblock
Steg 4: RESULTATET

här är videon av resultatet
Rekommenderad:
Enkel övervakning av luftkvalitet med TFT LCD-skärm- Ameba Arduino: 3 steg

Enkel övervakning av luftkvalitet med TFT LCD-skärm-Ameba Arduino: Introduktion Nu när de flesta stannar hemma för att undvika nära kontakt med potentiell COVID-19-virusbärare, blir luftkvalitet en viktig faktor för människors välbefinnande, särskilt i tropiska länder där att använda luftkonditionering är ett måste under dagen
Användning av mikrokontroller för drift och övervakning av fjärrbevattningssystem: 4 steg

Användning av mikrokontroller för drift och övervakning av fjärrbevattningssystem: jordbrukare och växthusoperatörer för ett billigt automatiskt bevattningssystem. I detta projekt integrerar vi en elektronisk jordfuktighetssensor med en mikrokontroller för att automatiskt bevattna växter när jorden är för torr utan mänskligt ingripande
AirCitizen - Övervakning av luftkvalitet: 11 steg (med bilder)

AirCitizen - Övervakning av luftkvalitet: Hej alla! Idag lär vi dig hur du reproducerar vårt projekt: AirCitizen av AirCitizenPolytech Team!-Kommer från 'OpenAir / What your air?' Projekt, AirCitizen -projektet syftar till att göra det möjligt för medborgarna att aktivt utvärdera kvaliteten
Sensly Hat för Raspberry Pi luftkvalitet och gasdetektor V0.9: 8 steg

Sensly Hat för Raspberry Pi luftkvalitet och gasdetektor V0.9: Sensly är en bärbar föroreningssensor som kan upptäcka föroreningsnivåerna i luften med hjälp av sina inbyggda gassensorer för att samla information om de olika gaserna som finns. Denna information kan matas direkt till din smartphone för realtid
Övervakning av pulsmätare för pulsmätning: 19 steg (med bilder)

Träning Pulsmätare Övervaka: College är en hektisk och kaotisk tid i ens liv, det är därför det är mycket viktigt att hålla din stressnivå låg. Ett sätt vi gillar att göra detta är genom att träna, det hjälper till att hålla ditt sinne klart och kroppen känns frisk. Det är därför vi skapade en bärbar