
Съдържание:
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 14:36


ВЪВЕДЕНИЕ:
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
Стъпка 4: РЕЗУЛТАТА

ето видеото на резултата
Препоръчано:
Система за наблюдение на въздуха, използваща NodeMCU и IOT Thingspeak: 4 стъпки

Система за наблюдение на въздуха, използваща NodeMCU и IOT Thingspeak: ThingSpeak е приложение за интернет на нещата с отворен код и API за съхраняване и извличане на данни от хардуерни устройства и сензори. Той използва HTTP протокол през интернет или LAN за комуникацията си. Анализът на MATLAB е включен, за да анализира и визуализира да
Мониторинг на качеството на въздуха с помощта на фотони от частици: 11 стъпки (със снимки)

Мониторинг на качеството на въздуха с помощта на фотон от частици: В този проект сензорът за частици PPD42NJ се използва за измерване на качеството на въздуха (PM 2.5), присъстващ във въздуха с частичен фотон. Той не само показва данните на Particle console и dweet.io, но също така показва качеството на въздуха с помощта на RGB LED, като го променя
ЧУВСТВИТЕЛНА ШАПКА ЗА КАЧЕСТВОТО НА КАЧЕСТВОТО НА ВЪЗДУХА И МАСКВАТА PI ВЪЗДУХ V1.1: 9 стъпки

РАЗУМНА ШАПКА ЗА КАЧЕСТВОТО НА КАЧЕСТВОТО НА ВЪЗДУХА НА МАЛИНАТА И ВЪЗДЕЙСТВИЕ НА ГАЗ V1.1: Sensly е преносим сензор за замърсяване, способен да открива нивата на замърсяване във въздуха, използвайки своите бордови газови сензори за събиране на информация за различните налични газове. Тази информация може да се подава директно на вашия смартфон за пускане в реално време
Монитор за качеството на въздуха с частици: 7 стъпки

Монитор за качеството на въздуха с частици: Качество на въздуха. Вероятно мислите повече за това сега, когато чистият ни въздух се превърна в постоянна мъгла по небето. Гадост. Едно нещо, над което имате контрол, е качеството на въздуха във вашия дом. В този урок ще ви покажа как да създадете въздух
Изградете детектор за замърсяване с частици LoRa: 8 стъпки

Изградете детектор за замърсяване с частици LoRa: Ще изградим детектор за прахови частици, използвайки сензор за качество на въздуха PM2.5, ESP32, UNO и модул LoRa. Замърсяването с частици, известно също като частици, е смес от различни размери твърди вещества и течности, открити във въздуха. Някои от тези п