Мазмуну:
- Жабдуулар
- 1 -кадам: Компоненттерди туташтыруу
- 2 -кадам: Китепкана жана Arduino программасы
- 3 -кадам: MIT App Inventor 2 программасы
- 4 -кадам: ЖЫЙЫНТЫК
Video: Булганууну бөлүкчөлөр үчүн абанын сапатын көзөмөлдөө системасы: 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:40
INTRO:
1 Бул долбоордо мен маалымат дисплейи менен бөлүкчө детекторун кантип түзүүнү, SD картадагы маалыматтын камдык көчүрмөсүн жана IOTту көрсөтөм. Неопикселдүү шакек дисплей абанын сапатын көрсөтөт.
2 Аба сапаты бүгүнкү күндө барган сайын маанилүү маселе. чаңдын ылдамдыгын өлчөөчү системалар бар, бирок алар абдан кымбат. Кээ бир изилдөөлөр көрсөткөндөй, рынокто арзан жана сапаттуу бөлүкчө детекторлору бар.
Мисалы:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Ошондуктан мен бөлүкчөлөрдүн санын класстар боюнча (0,5кмден 10мкмге чейин) өлчөй ала турган, натыйжаны жөнөкөй көрсөтүү менен (нео пикселдик шакекче), TFT экранда деталдуу дисплейди жана SD картада убакыт мөөрү камдалган.
4 Мындан тышкары, мен bluetooth байланыш модулун коштум, ал андроид тиркемеси менен байланышып, натыйжаларын IOT серверине жарыялай алат.
5 Жалпы наркы 60 € ашпайт
Жабдуулар
-Arduino uno R3
-Arduino прото калканы
-TFT экраны ST7735
-Neopixel шакеги 24 жетелейт
-Plantower PMS5003
-HC-06 Bluetooth модулу
1 -кадам: Компоненттерди туташтыруу
ар кандай компоненттер жогорудагы схемага ылайык туташтырылган
2 -кадам: Китепкана жана Arduino программасы
1 китепкана
TFT экраны үчүн
github.com/adafruit/Adafruit-GFX-Library
нео пикселдик шакек үчүн
github.com/adafruit/Adafruit_NeoPixel
sd карта үчүн
github.com/arduino-libraries/SD
2 arduino эскизи
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #кошуу
// Arduinoдогу кайсы пин NeoPixelsке туташкан?
#аныктоо PIN 6 // Trinket же Gemma боюнча, муну 1ге өзгөртүүнү сунуштаңыз
// Ардуиного канча NeoPixels тиркелет?
#define NUMPIXELS 24 // Популярдуу NeoPixel шакек өлчөмү Adafruit_NeoPixel пикселдери (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = пиксель. Color (0, 250, 0); uint32_t апельсин = пиксель. Түс (250, 250, 0); uint32_t rouge = пиксел. Color (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // сиз муну Arduino баштапкы абалына туташтырсаңыз болот
#кошуу // Негизги графикалык китепкана
#include // Hardware-specific library #include #include const int cs_sd = 4; int temps; // temps d'acquisition кош tempsInit; // баштоо дю таймер au démarrage du loop ()
#аныкталган болсо (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// 1 -вариант: каалаган пиндерди колдонуңуз, бирок бир аз жайыраак
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// 2 -вариант: SPI жабдыктарын колдонушу керек
// (UNO thats үчүн sclk = 13 жана sid = 11) жана пин 10 чыгарылышы болушу керек. Бул бир топ ылдамыраак - эгер сиз кааласаңыз // microSD картасын колдонууну кааласаңыз (сүрөттү тартуу мисалын караңыз) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Баштоо I2C Wire.begin (); // Баштоо ле модулу RTC RTC.begin (); Serial.print ("init SD"); кечигүү (1000); if (! SD.begin (cs_sd)) // Шарт vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); кайтуу; } Serial.print ("Carte SD OK");
Файл маалыматы = SD.open ("donnees.txt", FILE_WRITE); // Ооба, "donnees.txt"
data.println (""); data.println ("Démarrage алуу"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // ST7735S чипин инициализациялоо, кара табулатура Serial.println ("init"); // биздин мүчүлүштүктөрдү оңдоо tft.fillScreen (ST7735_BLACK); // сенсордун ылдамдыгы 9600 pmsSerial.begin (9600);
piksel.begin (); // NeoPixel тилкесинин объектисин ИНТИЗАЛДОО (КЕРЕК)
piksel.setBrightness (2);
}
pms5003data түзүмү {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t бөлүкчөлөр_03ум, бөлүкчөлөр_05ум, бөлүкчөлөр_10ум, бөлүкчөлөр_25ум, бөлүкчөлөр_50ум, бөлүкчөлөр_100um; uint16_t колдонулбаган; uint16_t текшерүү суммасы; };
pms5003 маалыматынын структурасы; void loop () {piksel.clear (); // Бардык пиксель түстөрүн 'өчүрүү' DateTime азыр = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (азыр);
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 parts/ 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) " микрог/м3 ");
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/mrg (")
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 (") микроф.
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre parts/ 0.1 l");
// Serial.print (темптер);
// 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);
эгер ((nombre_leds = 1)) {
piksel.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {piksel.fill (vert, 0, 8); pixel.fill (кызгылт сары, 8, ((nombre_leds) -8))); } башка if (nombre_leds> 16) {
piksel.fill (vert, 0, 8); pixel.fill (кызгылт сары, 8, 8); pix.fill (rouge, 16, ((nombre_leds) -16))); } else if (nombre_leds <= 1) {piksel.fill (vert, 0, 1); } piksel.show (); // Аппаратурага жаңыртылган пиксел түстөрүн жөнөтүңүз.
// Dnfinition 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
Файл маалыматы = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
логикалык readPMSdata (Stream *s) {
if (! s-> available ()) {return false; } // Атайын '0x42' старт-байтына жеткенге чейин бир убакта байтты окуңуз (s-> peek ()! = 0x42) {s-> read (); жалган кайтаруу; }
// Эми 32 байттын баарын окуу
if (s-> available () readBytes (буфер, 32);
// текшерүү суммасын даярдаңыз
for (uint8_t i = 0; i <30; i ++) {sum+= buffer ; }
/* мүчүлүштүктөрдү оңдоо
үчүн (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (буфер , HEX); Serial.print (","); } Serial.println (); */ // Маалыматтар endian'd түрүндө келет, бул аны чечет, андыктан ал бардык платформаларда иштейт uint16_t buffer_u16 [15]; үчүн (uint8_t i = 0; i <15; i ++) {buffer_u16 = буфер [2 + i*2 + 1]; buffer_u16 + = (буфер [2 + i*2] << 8); }
// аны жакшы структурага кой:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (sum! = data.checksum) {
Serial.println ("Текшерүү суммасы ишке ашпай калды"); жалган кайтаруу; } // ийгилик! чындыкка кайтуу; }
// 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 -абал: "LUN" кайтаруу; 2 -жагдай: "MAR" кайтаруу; 3 -жагдай: "MER" кайтаруу; 4 -жагдай: "ЖЭБди" кайтаруу; 5 -жагдай: "VEN" кайтаруу; 6 -жагдай: "SAM" кайтаруу; демейки: кайтаруу ""; }}
// 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 ()) + "/" + Сап (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (журналы); Serial.print (""); Serial.print (heure); //Serial.print (""); Файл маалыматы = 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 ("дата"); 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);
кечигүү (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (байт номери) {String resultat = ""; if (nombre <10) resultat = "0"; returnatatat = = String (nombre, DEC); }
3 -кадам: MIT App Inventor 2 программасы
бул MIT колдонмосунун ойлоп табуучуларынын код блогу
4 -кадам: ЖЫЙЫНТЫК
бул жерде видеонун жыйынтыгы
Сунушталууда:
TFT LCD дисплейи менен жөнөкөй аба сапатын көзөмөлдөө- Ameba Arduino: 3 кадам
TFT ЖК дисплейи менен жөнөкөй абанын мониторинги-Ameba Arduino: Киришүү Азыр адамдардын көпчүлүгү потенциалдуу COVID-19 вирус ташуучусу менен тыгыз байланышта болбоо үчүн үйдө калышкандыктан, абанын сапаты адамдардын жыргалчылыгынын маанилүү факторуна айланат, айрыкча тропикалык өлкөлөрдө кондиционерди колдонуу бул мезгилде сөзсүз керек
Grafana жана Raspberry Pi аркылуу абанын сапатын көзөмөлдөңүз: 7 кадам
Grafana жана Raspberry Pi аркылуу абанын сапатын көзөмөлдөңүз: Мен кичинекей IOT долбоорун издеп жүрчүмүн жана бир досум бул окуу куралын карап чыгууну сунуштады: https: //dzone.com/articles/raspberry-pi-iot-sensor .. Мониторинг үчүн Raspberry Pi түзүүнү улантуу үчүн окуу куралын аткарууну сунуштаңыз
Абанын сапатын өлчөө: 17 кадам
Абанын сапатын өлчөө: Абанын сапаты жана майда бөлүкчөлөр: Асма бөлүкчөлөр ("PM" "бөлүкчө заттары" үчүн белгиленет) жалпысынан аба ташыган майда катуу бөлүкчөлөр (Wikipedia). Майда бөлүкчөлөр өпкөгө терең кирип кетет. Алар себеп болушу мүмкүн
Бөлүкчөлөрдүн фотонун колдонуу менен абанын сапатын көзөмөлдөө: 11 кадам (сүрөттөр менен)
Бөлүкчөлөрдүн фотонун колдонуу менен абанын мониторинги: Бул долбоордо PPD42NJ бөлүкчөлөрүнүн сенсорлору абанын бөлүкчөлөрүнүн фотонунун жардамы менен абанын сапатын (PM 2.5) өлчөө үчүн колдонулат. Бул Particle консолундагы жана dweet.ioдогу маалыматтарды гана көрсөтпөстөн, аны өзгөртүү менен RGB LEDдин жардамы менен абанын сапатын да көрсөтөт
AirCitizen - Абанын сапатын көзөмөлдөө: 11 кадам (Сүрөттөр менен)
AirCitizen - Абанын сапатын көзөмөлдөө: Баарына салам! Бүгүн биз сизге долбоорубузду кантип кайра чыгарууну үйрөтөбүз: AirCitizen AirCitizenPolytech командасы тарабынан!-'OpenAir / Эмне абаң бар?' Долбоорлор, AirCitizen долбоору жарандардын сапатты жигердүү баалоосуна мүмкүнчүлүк берүүнү көздөйт