Съдържание:

Система за наблюдение на качеството на въздуха за замърсяване с частици: 4 стъпки
Система за наблюдение на качеството на въздуха за замърсяване с частици: 4 стъпки

Видео: Система за наблюдение на качеството на въздуха за замърсяване с частици: 4 стъпки

Видео: Система за наблюдение на качеството на въздуха за замърсяване с частици: 4 стъпки
Видео: Каква е историята зад продуктите на IS Clinical и Augustinus Bader? 2024, Юли
Anonim
Система за мониторинг на качеството на въздуха за замърсяване с частици
Система за мониторинг на качеството на въздуха за замърсяване с частици
Система за мониторинг на качеството на въздуха за замърсяване с частици
Система за мониторинг на качеството на въздуха за замърсяване с частици

ВЪВЕДЕНИЕ:

1 В този проект аз показвам как да се изгради детектор на частици с показване на данни, архивиране на данни на SD карта и IOT. Визуално неопикселовият пръстен показва качеството на въздуха.

2 Качеството на въздуха е все по -важна грижа днес. има системи за измерване на праха, но те са много скъпи. На пазара има евтини, висококачествени детектори за частици, както показват някои проучвания.

например:

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

3 Затова реших да създам устройство, способно да измерва броя на частиците по класове по размер (0,5 µm до 10 µm), визуално с просто показване на резултата (неопикселен пръстен), по -подробен дисплей на TFT екран и архивиране с отметка във времето на SD карта.

4 Освен това добавих комуникационен модул за Bluetooth, за да мога да комуникирам с приложение за Android и по този начин да публикувам резултатите на IOT сървър.

5 Общата цена на цялото не надвишава 60 €

Консумативи

-Arduino uno R3

-Arduino прото щит

-TFT екран ST7735

-Неопикселов пръстен 24 led

-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?

#define PIN 6 // На Trinket или Gemma, предложете да промените това на 1

// Колко NeoPixels са свързани към Arduino?

#define 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);

Софтуер Сериен pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // можете също да свържете това към нулирането на Arduino

#include // Основна библиотека с графики

#include // Хардуерно-специфична библиотека #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // инициализация на таймера au deémarrage du loop ()

#if определено (_ 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)) // Условие за проверка на SD картата е est présente dans l'appareil {Serial.print ("Defaut SD"); връщане; } Serial.print ("Carte SD OK");

Файлови данни = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "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);

pixels.begin (); // ИНИЦИАЛИЗИРАЙ обект на лента NeoPixel (ЗАДЪЛЖИТЕЛНО)

pixels.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 частици_03um, частици_05um, частици_10um, частици_25um, частици_50um, частици_100um; uint16_t неизползван; uint16_t контролна сума; };

struct pms5003данни данни; void loop () {пиксели.clear (); // Задайте всички цветове на пикселите на 'off' 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 части/ 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); tft.print (" микрог/м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/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 части/ 0,1 л");

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

if ((nombre_leds = 1)) {

pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (оранжево, 8, ((nombre_leds) -8)); } иначе ако (nombre_leds> 16) {

pixels.fill (vert, 0, 8); pixels.fill (оранжево, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } пиксели.show (); // Изпраща актуализираните цветове на пикселите до хардуера.

// Дефиниция без данни String PM03 = String (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); String Temps = Низ (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 (); }

}

boolean readPMSdata (Stream *s) {

if (! s-> available ()) {return false; } // Четене на байт наведнъж, докато стигнем до специалния начален байт '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }

// Сега прочетете всичките 32 байта

if (s-> available () readBytes (буфер, 32);

// подгответе контролната сума

for (uint8_t i = 0; i <30; i ++) {сума+= буфер ; }

/* отстраняване на грешки

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (буфер , HEX); Serial.print (","); } Serial.println (); */ // Данните идват в endian'd, това ги решава, така че работи на всички платформи uint16_t buffer_u16 [15]; for (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 (сума! = data.checksum) {

Serial.println ("Грешка в контролната сума"); return false; } // успех! връщане true; }

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

Низ donne_jour_semaine (uint8_t j) {ключ (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) {// Низ за дата jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Низ (datetime.year (), DEC); // heure Низ heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial.print (jour); 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

Низ Vers2Chiffres (байт номер) {String resultat = ""; if (nombre <10) resultat = "0"; резултат на връщане += низ (nombre, DEC); }

Стъпка 3: Програма MIT App Inventor 2

Програма MIT App Inventor 2
Програма MIT App Inventor 2

това е кодовият блок на изобретателя на приложението MIT

Стъпка 4: РЕЗУЛТАТА

ето видеото на резултата

Препоръчано: