
Tartalomjegyzék:
2025 Szerző: John Day | [email protected]. Utoljára módosítva: 2025-01-23 14:47


INTRO:
1 Ebben a projektben megmutatom, hogyan lehet részecskeérzékelőt építeni adatkijelzővel, adatmentéssel SD kártyán és IOT -val. Vizuálisan egy neopixel gyűrűs kijelző jelzi a levegő minőségét.
2 A levegő minősége napjainkban egyre fontosabb kérdés. Vannak rendszerek a por mennyiségének mérésére, de nagyon drágák. Vannak olcsó, kiváló minőségű részecskeérzékelők a piacon, amint azt néhány tanulmány is mutatja.
például:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Ezért úgy döntöttem, hogy olyan eszközt építek, amely képes a részecskék számának méretosztályok szerinti (0,5 µm és 10 µm) szerinti mérésére, vizuálisan, az eredmény egyszerű megjelenítésével (neo pixel gyűrű), részletesebb kijelzővel a TFT képernyőn és időbélyegzett biztonsági mentés SD-kártyán.
4 Ezen kívül hozzáadtam egy bluetooth kommunikációs modult, hogy képes legyek kommunikálni egy androidos alkalmazással, és így közzétegyem az eredményeket egy IOT szerveren.
5 A teljes költség nem haladja meg a 60 eurót
Kellékek
-Arduino uno R3
-Arduino proto pajzs
-FTT képernyő ST7735
-Neopixel gyűrű 24 led
-Plantower PMS5003
-HC-06 bluetooth modul
1. lépés: Az alkatrészek csatlakoztatása

a különböző alkatrészek a fenti ábra szerint vannak csatlakoztatva
2. lépés: Könyvtár és Arduino program
1 a könyvtár
a TFT képernyőhöz
github.com/adafruit/Adafruit-GFX-Library
a neo pixel gyűrűhöz
github.com/adafruit/Adafruit_NeoPixel
az sd kártyához
github.com/arduino-libraries/SD
2 az arduino vázlat
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le modul RTC RTC_DS1307 RTC; #befoglalni
// Az Arduino melyik csapja csatlakozik a NeoPixelshez?
#define PIN 6 // Trinket vagy Gemma esetén javasoljuk, hogy módosítsa ezt 1 -re
// Hány NeoPixel kapcsolódik az Arduino -hoz?
#define NUMPIXELS 24 // Népszerű NeoPixel gyűrűméret Adafruit_NeoPixel pixelek (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixel. Color (0, 250, 0); uint32_t orange = pixel. Szín (250, 250, 0); uint32_t rouge = pixelek. Szín (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // ezt is csatlakoztathatja az Arduino resethez
#include // Core grafikus könyvtár
#include // Hardver-specifikus könyvtár #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializálás du timer au démarrage du loop ()
#if meghatározott (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// 1. lehetőség: használjon bármilyen csapot, de egy kicsit lassabban
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// 2. lehetőség: a hardver SPI csapjait kell használni
// (UNO esetén ez sclk = 13 és sid = 11) és a 10 -es tűnek // kimenetnek kell lennie. Ez sokkal gyorsabb - akkor is szükséges, ha // szeretné használni a microSD kártyát (lásd a kép rajzi példáját) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Liaison inicializálása I2C Wire.begin (); // Az RTC modul inicializálása RTC.begin (); Serial.print ("init SD"); késleltetés (1000); if (! SD.begin (cs_sd)) // Állapot vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); Visszatérés; } Serial.print ("Carte SD OK");
Fájladatok = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Démarrage szerzés"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializálja az ST7735S chipet, fekete lap Serial.println ("init"); // hibakeresési kimenetünk tft.fillScreen (ST7735_BLACK); // az érzékelő átviteli sebessége 9600 pmsSerial.begin (9600);
pixels.begin (); // NeoPixel szalagos objektum INICIALIZÁLÁSA (SZÜKSÉGES)
pixels.setBrightness (2);
}
struk pms5003data {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t részecskék_03um, részecskék_05um, részecskék_10um, részecskék_25um, részecskék_50um, részecskék_100um; uint16_t unused; uint16_t ellenőrző összeg; };
struk pms5003adatok; void loop () {pixels.clear (); // Állítsa az összes képpont színét "off" -ra DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (most);
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 alkatrészek/ 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 ("mikrog/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 ("mikrog/m3");
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre alkatrészek/ 0,1 l");
// Serial.print (temp);
// Serial.print (""); Serial.print ("#"); Soros.nyomtatás ("03µm"); Serial.print (adatok.részecskék_03um); Serial.print (""); Soros.nyomtatás ("05µm"); Serial.print (data.particles_05um); Serial.print (""); Soros.nyomtatás ("1µm"); Serial.print (data.particles_10um); Serial.print (""); Soros.nyomtatás ("25µm"); Serial.print (data.particles_25um); Serial.print (""); Soros.nyomtatás ("50µm"); Serial.print (data.particles_50um); Serial.print (""); Soros.nyomtatás ("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)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (narancssárga, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (narancssárga, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Küldje el a frissített képpontszíneket a hardvernek.
// Définition données String PM03 = Karakterlánc (adat.részecskék_03um); String PM05 = Karakterlánc (adat.részecskék_05um); String PM10 = Karakterlánc (adat.részecskék_10um); String PM25 = Karakterlánc (adat.részecskék_25um); String PM50 = Karakterlánc (adat.részecskék_50um); String PM100 = Karakterlánc (adat.részecskék_100um); Karakterlánc PMS10 = Karakterlánc (adat.pm10_standard); String PMS25 = Karakterlánc (adat.pm25_standard); String PMS100 = Karakterlánc (adat.pm100_standard); String Temps = String (temp);
// Ecriture des données dans le fichier texte
Fájladatok = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
boolean readPMSdata (adatfolyam *) {
if (! s-> available ()) {return false; } // Olvassunk egy bájtot, amíg el nem jutunk a speciális '0x42' kezdőbájtig, ha (s-> peek ()! = 0x42) {s-> read (); hamis visszatérés; }
// Most olvassa el mind a 32 bájtot
if (s-> available () readBytes (buffer, 32);
// készítsd el az ellenőrző összeget
for (uint8_t i = 0; i <30; i ++) {összeg+= puffer ; }
/* hibakeresés
for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (puffer , HEX); Serial.print (","); } Sorozat.println (); */ // Az adatok endian'd -ben érkeznek, ez megoldja, így minden platformon működik uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = puffer [2 + i*2 + 1]; puffer_u16 + = (puffer [2 + i*2] << 8); }
// szép struktúrába rakni:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (összeg! = adat.ellenőrző összeg) {
Serial.println ("Ellenőrzőösszeg hiba"); hamis visszatérés; } // siker! return true; }
// 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"; 1. eset: "LUN" visszaadása; 2. eset: "MAR" visszaadása; 3. eset: "MER" visszaadása; 4. eset: "JEU" visszaadása; 5. eset: "VEN" visszaadása; 6. eset: "SAM" visszaadása; alapértelmezett: return ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// Dátum String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Karakterlánc (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Serial.print (""); Soros.nyomtatás (heure); //Serial.print (""); Fájladatok = 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 ("dátum"); 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);
késleltetés (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; return resultat += Karakterlánc (nombre, DEC); }
3. lépés: MIT App Inventor 2 program

ez az MIT app feltaláló kód blokkja
4. lépés: AZ EREDMÉNY

itt a videó az eredményről
Ajánlott:
Hordozható finom részecskék mérése (kiterjesztés): 3 lépés

Hordozható finomrészecske -mérés (kiterjesztés): Cél: CO2 -érzékelő hozzáadása A program jobb olvashatósága A program megnyitása más típusú érzékelőkhöz. Ez a projekt egy másik, már közzétett projektet követ. Válaszol az olvasók kérdéseire. Egy további érzékelő került
Hordozható finom részecskék mérése: 4 lépés (képekkel)

Hordozható finom részecskék mérése: A projekt célja a levegő minőségének mérése a finom részecskék mennyiségének mérésével. Hordozhatóságának köszönhetően otthon vagy útközben is lehet méréseket végezni. Levegőminőség és finom részecskék: Részecskék (
Hogyan készítsünk intelligens árvíz -érzékelő riasztórendszert Raspberry Pi és Argon részecskék használatával: 6 lépés

Hogyan készítsünk intelligens árvíz -érzékelő riasztórendszert a Raspberry Pi és az Argon részecske használatával: A szabványos árvíz -érzékelők nagyszerűek, hogy megakadályozzák az otthoni vagy munkahelyi hatalmas károkat. De megnehezíti, ha nem vagy otthon, hogy részt vegyen a riasztásban. Természetesen Ezeket az árvízjelző rendszereket minden folyadék érzékeli, és riasztást vált ki
Kutyák hűtő- és érzékelő rendszere: 5 lépés

Kutyák hűtő- és érzékelő rendszere: Helló, a nevem Bryan és két kutyám van. Azon tűnődtem, hogyan tudnám lehűteni őket egy utánfutóban egy forró napon. A megoldásom az, hogy hűtő- és érzékelőrendszert készítek. Az észlelési rendszer biztosítja, hogy a rendszer aktív legyen, amikor a kutyák
Interaktív részecskék: 8 lépés

Interaktív részecskék: Ez a lépésről lépésre szóló útmutató a mellékelt Interaktív részecskék rendszer beállításához. Ez egy meglehetősen fejlett rendszer, amely néha zavaró lehet, és bizonyos ismeretek a kódolásban, a Max MSP, az Arduino és az audio/vizuális beállításokban ajánlott