使用 Blynk IOT 長時間監測周圍的灰塵和大顆粒 (》0.5μm) 并繪制數據以供進一步研究。
在這個項目中,我制作了一個基于物聯網的塵埃密度監測器,它可以測量周圍的塵埃并通過互聯網發送數據,我可以以圖形方式監測一個地方塵埃密度的長期值。這可以幫助制定未來的項目,如改善空氣污染和許多其他項目。
關于傳感器(夏普 gp2y1014au0f)
夏普 gp2y1014au0f 是一款使用 IR LED 的微粒傳感器,當空氣中的微粒進入傳感器時,光線會向光電探測器反彈。這種技術稱為激光散射。散射(反彈)光的強度取決于灰塵顆粒。塵埃顆粒越多,彈跳或散射就越嚴重。光檢測器上的這種光強度變化會改變傳感器的輸出電壓。我們可以讀取輸出電壓并測量空氣中的灰塵密度。
我將傳感器作為套件購買。該套件包括:
1x GP2Y1014AU0F 傳感器
1 x 6 針尾纖電纜,用于輕松連接傳感器
1 x 150 歐姆電阻
1 x 220uF 電容
因為它有 6 個連接器,我必須添加電阻器和電容器,所以我用它制作了一個模塊。
制作項目
這個項目基于物聯網,所以我使用 Arduino UNO 微控制器和 ESP8266 (ESP01) Wi-Fi 模塊來連接互聯網。我還使用 Blynk(物聯網平臺)應用程序來可視化 Arduino 發送的數據。
Arduino 和 ESP01
要將 Wi-Fi 添加到 Arduino UNO,我連接了一個 ESP-01 模塊。在此之前,您可能需要更新 ESP8266 模塊的固件。
連接:
Arduino RX - ESP01 TX
Arduino TX - ESP01 RX
Arduino 3.3V - ESP01 VCC 和芯片選擇引腳
Arduino GND - ESP01 GND
Arduino 和 GP2Y1014AU0F
GP2Y1014AU0F中的紅外發射器必須通過 Arduino 的脈沖進行控制才能運行。傳感器的輸出是模擬信號,所以它應該連接到 Arduino 的模擬引腳。所以我相應地連接傳感器和Arduino。
連接:
Arduino D7 - 傳感器 LED
Arduino A5 - 傳感器 VOUT
編碼
首先,我們必須使用一些庫
#include
#include
#include
根據傳感器數據表,首先必須打開 IR LED 并等待 280μs 才能讀取讀數。然后從模擬引腳讀取電壓值。這個操作大約需要 50μs,所以給一個 50μs 的延遲,然后關閉 IR led。根據數據表,IR LED 應每 10ms 開啟和關閉一次脈沖,因此它必須等待剩余的 (10000-280-50)μs = 9670μs。
?digitalWrite(led,LOW);
?delayMicroseconds(280);
?SensorOut = analogRead(SensorPin);
?delayMicroseconds(50);
?digitalWrite(led,HIGH);
?delayMicroseconds(9670);
然后要計算灰塵密度,我們需要數據表中的一些值,K 是傳感器的靈敏度,它是 0.5V/100μgm/m^3。Voltage_noDust是空氣中沒有灰塵時的電壓。這個電壓從0.1V-1V變化。您可能需要調整此值。
之后使用一些簡單的計算,我們可以測量灰塵密度
?SensorVo = SensorOut*(5.0/1024);
?Dust = (SensorVo-Voltage_noDust)*100/K;
然后使用 Blynk.virtualWrite(V1,Dust); 函數將灰塵密度值發送到云端。該值每秒發送一次。
其余代碼由注釋解釋。
Blynk 應用程序設置
按照步驟
上傳代碼后檢查一切是否正常。
之后您可以從應用程序中導出 Excel 數據,并將其發送到您的電子郵件地址,然后使用該數據進行進一步分析。
Dust_density monitor:
#define BLYNK_PRINT Serial
#include
#include
#include
char auth[] = "fI1Hhyw20XUE7WmUhcJhJ_QAFHVYkPxQ"; ?//The authentication token send to your email?
//Your WIFI credentials
char ssid[] = "ABID"; ? ? ? ? ? ? ? ? ? ? ? ? ? ??
char pass[] = "8901234567";
#define ESP8266_BAUD 115200 ? ?
ESP8266 wifi(&Serial);
int SensorPin = A5;
int led = 7; ?
float SensorOut = 0;
float SensorVo = 0;
float Dust = 0;
float Voltage_noDust = 0.12; ? ? ?//calibrate by changing this
float K = 0.5; ? ? ? ? ? ? ? ? ? ?//Sensitivity from the datasheet 0.5V/ugm/m^3
SimpleTimer timer;
void sendSensor(){ ?
? digitalWrite(led,LOW); ? ? ? ? ? ? ? ? ? ? //turning on the led
? delayMicroseconds(280); ? ? ? ? ? ? ? ? ? ?//wait for 0.28ms
? SensorOut = analogRead(SensorPin); ? ? ? ? //read the sensor output voltage
? delayMicroseconds(50); ? ? ? ? ? ? ? ? ? ? //wait for 50us
? digitalWrite(led,HIGH); ? ? ? ? ? ? ? ? ? ?//turning off the led
? delayMicroseconds(9670); ? ? ? ? ? ? ? ? ? //wait for (10000-280-50)=9670us
? SensorVo = SensorOut*(5.0/1024); ? ? ? ? ? //calculating sensor output voltage
? Dust = (SensorVo-Voltage_noDust)*100/K; ? ?//calculating Dust density(ugm)/m^3
?
? if ( Dust < 0)
? {
? ? Dust = 0.00;
? }
? Blynk.virtualWrite(V1,Dust); ?//sending data to the cloud
}
void setup()
{
?pinMode(led,OUTPUT);
?Serial.begin(115200);
?delay(10);
?Serial.begin(ESP8266_BAUD);
?delay(10);
?Blynk.begin(auth, wifi, ssid, pass);
?timer.setInterval(1000L, sendSensor); ? ? //set timer interval of 1s
}
void loop()
{
?Blynk.run();
?timer.run();
}
評論