Для начала я купил датчик пыли на основе sharp GP2Y1010AU0F прменяется для обнаружения PM2.5 частиц (менее 2.5 микрон) и сигаретного дыма. Принцип действия довольно простой: фототранзистор распознает свет, отражённый от частиц, который посылает инфракрасный светодиод.
Для подключения к Arduino не требуется ничего особенного: чёрный провод земля, красный 5 вольт, жёлтый на цифровой Pin 7, для управления (вкл/выкл) тем самым инфракрасным светодиодом, и синий на один из аналоговых пинов, например A0, для чтения показаний датчика.
Для того, чтобы считать данные с датчика, согласно DataSheet-у нужно включить инфракрасный светодиод, подождать 280 микросекунд, и затем померить выходное напряжение датчика.
#define DUST_ILED 7 #define DUST_PIN 0 #define NO_DUST_VOLT 0.9 void setup() { pinMode(DUST_ILED, OUTPUT); digitalWrite(DUST_ILED, LOW); } void loop() { // put your main code here, to run repeatedly: digitalWrite(DUST_ILED, HIGH); delayMicroseconds(280); int outVolt = analogRead(DUST_PIN); digitalWrite(DUST_ILED, LOW); float calcVoltage = outVolt * 5.0 / 1024.0 - NO_DUST_VOLT; if (calcVoltage < 0) { calcVoltage = 0; } delay(1000); }
Здесь мы делим значение, которое считали с датчика на 1024 – это максимальное значение, которое может считать Arduino Uno на аналоговых пинах и умножаем на 5 – напряжение, которое мы подали на датчик.
Согласно DataSheet-у типичное напряжение, которое показывает датчик при отсутствии пыли – это 0.9 вольт, так что просто вычтем это значение и будем считать, что наличие пыли начинается при напряжении > 0.9 вольт.
Второе, что нужно сделать – это отображать считанные значения. Простейший вариант – это напечатать в консоль, но когда ходишь по городу, то лучше иметь какой-нить маленький дисплей и я купил 0.96″ OLED дисплей с интерфейсом i2c, которому требуется 2 аналоговых пина (SDA на A4, а SCL на A5) плюс напряжение и земля.
У AdaFruit есть отличная, но “тяжёлая” библиотека для работы с подобными дисплеями. Прежде чем ею можно воспользоваться нужно поменять пару вещей в зависимости от модели дисплея. В моём случае это i2c адрес, который нужно выставить в 0x3C . Так же может понадобиться другая AdaFruit библиотека – AdaFruit GFX.
#include <Adafruit_SSD1306.h> #define DUST_ILED 7 #define DUST_PIN 0 #define NO_DUST_VOLT 0.9 #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); void setup() { pinMode(DUST_ILED, OUTPUT); digitalWrite(DUST_ILED, LOW); // put your setup code here, to run once: display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.display(); } void loop() { // put your main code here, to run repeatedly: digitalWrite(DUST_ILED, HIGH); delayMicroseconds(280); int outVolt = analogRead(DUST_PIN); digitalWrite(DUST_ILED, LOW); float calcVoltage = outVolt * 5.0 / 1024.0 - NO_DUST_VOLT; if (calcVoltage < 0) { calcVoltage = 0; } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.print("Dust: "); display.println(calcVoltage); display.display(); delay(1000); }
Теперь необходимо добавить датчики температуры и влажности для полноты информации. Например подойдёт DHT22 – это два датчика в одном.
У него 4 ножки, но одна (третья, согласно DataSheet-у) не используется, так что просто нужно подключить 5 вольт, землю и один из цифровых пинов, например 2й. Так же есть библиотека для работы с этим датчиком, так что считывание показаний можно легко добавить в предыдущий скетч:
#include <Adafruit_SSD1306.h> #include <DHT.h> #define DHT_TYPE DHT22 #define DHT_PIN 2 #define DUST_ILED 7 #define DUST_PIN 0 #define NO_DUST_VOLT 0.9 #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); DHT dht(DHT_PIN,DHT_TYPE); void setup() { pinMode(DUST_ILED, OUTPUT); digitalWrite(DUST_ILED, LOW); // put your setup code here, to run once: display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.display(); } void loop() { // put your main code here, to run repeatedly: digitalWrite(DUST_ILED, HIGH); delayMicroseconds(280); int outVolt = analogRead(DUST_PIN); digitalWrite(DUST_ILED, LOW); float calcVoltage = outVolt * 5.0 / 1024.0 - NO_DUST_VOLT; if (calcVoltage < 0) { calcVoltage = 0; } float h = dht.readHumidity(); float t = dht.readTemperature(); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.print("H: "); display.print(h); display.print(" T: "); display.println(t); display.println(""); display.setTextSize(2); display.print("Dust: "); display.println(calcVoltage); display.display(); delay(1000); }
просто читаем влажность и температуру с помощью библиотечных функций dht.readHumidity() и dht.readTemperature() и выводим их на экран:
Ещё нужен источник питания, такой, чтобы можно было легко носить “прибор” с собой. Например подойдут пальчиковые (АА) батарейки, которые можно вставить в батарейный отсек и приделать к ним разъём с клеммой для лёгкого способа подключения к Arduino
Сам Arduino засунуть в корпус и приклеить батарейный отсек с помощью 2х стороннего скотча:
Что скажите? Полезный девайс?