Мазмұны:

Бөлшектердің ластануына ауа сапасын бақылау жүйесі: 4 қадам
Бөлшектердің ластануына ауа сапасын бақылау жүйесі: 4 қадам

Бейне: Бөлшектердің ластануына ауа сапасын бақылау жүйесі: 4 қадам

Бейне: Бөлшектердің ластануына ауа сапасын бақылау жүйесі: 4 қадам
Бейне: Басқа тышты деген осы 😡 2024, Шілде
Anonim
Бөлшектердің ластануына ауа сапасын бақылау жүйесі
Бөлшектердің ластануына ауа сапасын бақылау жүйесі
Бөлшектердің ластануына ауа сапасын бақылау жүйесі
Бөлшектердің ластануына ауа сапасын бақылау жүйесі

INTRO:

1 Бұл жобада мен ақпаратты дисплейі бар бөлшектер детекторын қалай құру керектігін, SD картасында және IOT -та деректердің сақтық көшірмесін жасауды көрсетемін. Неопиксельді сақиналы дисплей визуалды түрде ауа сапасын көрсетеді.

2 Қазіргі таңда ауа сапасы маңызды мәселеге айналып отыр. шаңды өлшейтін жүйелер бар, бірақ олар өте қымбат. Кейбір зерттеулер көрсеткендей, нарықта арзан және жоғары сапалы бөлшектер детекторлары бар.

Мысалға:

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

3 Сондықтан мен бөлшектердің санын (0,5 мкм -ден 10 мкм) кластар бойынша өлшеуге қабілетті құрылғыны құруды шештім, нәтижені қарапайым көрсету (нео пиксель сақинасы), TFT экранында және SD картасындағы уақыт белгісі бар резервтік көшірме.

4 Сонымен қатар, мен Android қосымшасымен байланыса алу үшін Bluetooth байланыс модулін қостым, осылайша нәтижелерді IOT серверінде жариялай аламын.

5 Жалпы шығын 60 евродан аспайды

Жабдықтар

-Arduino uno R3

-Arduino прото қалқаны

-ST7735 TFT экраны

-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 -ке қосылған?

#6 PIN кодын анықтаңыз // Trinket немесе Gemma -де оны 1 -ге өзгертуді ұсыныңыз

// Arduino -ға қанша NeoPixels бекітілген?

#depine NUMPIXELS 24 // Танымал NeoPixel сақина өлшемі Adafruit_NeoPixel пикселдері (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = пиксель. Түс (0, 250, 0); uint32_t қызғылт сары = пиксель. Түс (250, 250, 0); uint32_t rouge = пиксель. Түс (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#dsefine cs 10 #decine dc 9 #define rst 8 // сіз мұны Arduino қалпына келтіруге қосуға болады

#қосу // Негізгі графикалық кітапхана

#include // Аппараттық құралдарға арналған кітапхана #include #include const int cs_sd = 4; температура; // temps d'acquisition қос tempsInit; // инициализация timer 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 үшін 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 жолақ объектісін инициализациялау (ҚАЖЕТ)

pixel.setBrightness (2);

}

pms5003data құрылымы {

uint16_t жақтау; uint16_t pm10_standart, pm25_standard, pm100_standard; uint16_t pm10_kz, pm25_kk, pm100_kk; uint16_t бөлшектер_03um, бөлшектер_05ум, бөлшектер_10um, бөлшектер_25ум, бөлшектер_50ум, бөлшектер_100um; uint16_t пайдаланылмаған; uint16_t бақылау сомасы; };

pms5003 деректерінің құрылымы; void loop () {piksel.clear (); // Барлық пиксель түстерін 'off' күйіне орнатыңыз DateTime now = 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 («бөлшектер/ 0,1 л»);

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 («) микрограмм

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 («бөлшектер/ 0,1 л»);

// 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);

егер ((nombre_leds = 1)) {

pixel.fill (шың, 0, nombre_leds); } else if ((nombre_leds = 8)) {piksel.fill (vert, 0, 8); pixel.fill (қызғылт сары, 8, ((nombre_leds) -8))); } егер басқа (nombre_leds> 16) {

pixel.fill (шың, 0, 8); пиксель. толтыру (қызғылт сары, 8, 8); pixel.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {piksel.fill (vert, 0, 1); } пиксель.шоу (); // Жаңартылған пиксель түстерін аппараттық құралға жіберіңіз.

// Données анықтамасы String PM03 = Жол (data.particles_03um); PM05 жолы = Жол (data.particles_05um); PM10 жолы = Жол (data.particles_10um); PM25 жолы = Жол (data.particles_25um); PM50 жолы = Жол (data.particles_50um); PM100 жолы = Жол (data.particles_100um); PMS10 жолы = Жол (data.pm10_standard); PMS25 жолы = Жол (data.pm25_standard); PMS100 жолы = Жол (data.pm100_standard); Жолдың темптері = Жол (темптер);

// 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);

// бақылау сомасын дайындаңыз

үшін (uint8_t i = 0; i <30; i ++) {sum+= буфер ; }

/* отладка

үшін (uint8_t i = 2; i <32; i ++) {Serial.print («0x»); Serial.print (буфер , HEX); Serial.print («,»); } Serial.println (); */ // Деректер ендіan'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);

егер (қосынды! = деректер.шексу) {

Serial.println («Бақылау сомасының сәтсіздігі»); жалған қайтару; } // жетістік! шындықты қайтару; }

// Converti le numéro de jour en jour /! / La semaine commence un dimanche

Donne_jour_semaine (uint8_t j) {switch (j) {0 жағдай: «DIM» қайтару; 1 -жағдай: «LUN» қайтару; 2 -жағдай: «MAR» қайтару; 3 -жағдай: «MER» қайтару; 4 -жағдай: «JEU» қайтару; 5 -жағдай: «VEN» қайтару; 6 -жағдай: «SAM» қайтару; әдепкі: қайтару «»; }}

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

void affiche_date_heure (DateTime datetime) {// Date String журналы = 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 (журнал + «» + heure + «»); data.close ();

tft.setCursor (2, 120);

tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print («date»); 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

Жол2 VersionChiffres (байт саны) {String resultat = «»; if (nombre <10) resultat = «0»; нәтиже қайтару += Жол (nombre, DEC); }

3 -қадам: MIT App Inventor 2 бағдарламасы

MIT App Inventor 2 бағдарламасы
MIT App Inventor 2 бағдарламасы

бұл MIT қосымшасының өнертапқышының код блогы

4 -қадам: НӘТИЖЕ

міне, нәтиженің видеосы

Ұсынылған: