반응형
더 정확한 센서를 사용하는 방법은 아래 글을 참고하자
https://diy-project.tistory.com/145
이전글 2018/12/26 - [IOT 프로젝트] - Blynk와 아두이노로 온습도 표시하기와 이어지는 내용이다.
미세먼지 센서중 미세먼지 센서중 GP2Y1010AU 센서는 가격이 매우 저렴하고 사용법이 간단해 아두이노에서 자주 사용되는 센서중 하나이다.
필자의 경우 알리익스프레스에서 저렴하게 구매했는데, 집안 미세먼지 농도를 실시간으로 확인해 보고자 Blynk와 연동하여 사용해 보기로 했다. 우선 아래와 같이 회로를 꾸미면 된다. (캐패시터와 저항은 센서를 구입할 때 같이 준다.) 와이파이 모듈은 ESP-01이다.
사실 GP2Y1010AU가 그리 정밀한 센서는 아니다. 그래서 새다리님 블로그의 https://blog.naver.com/twophase/221139319142 글에 나와있는 GP2Y1010AU 센서를 보정하는 코드를 참고했다. 아래 코드를 업로드 한다.
#define BLYNK_PRINT Serial
#define ESP8266_BAUD 9600
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include <SoftwareSerial.h>
BlynkTimer timer;
SoftwareSerial EspSerial(2, 3);
char auth[] = "*****";
char ssid[] = "*****";
char pass[] = "*****";
int pinDrive = A0; // Sensor IR LED Drive
int pinADC = A1; // Reading Sensor Output
int pinLED = A2; // LED Indicattion of Dust Density
boolean pinState = 1;
int result;
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680; // Pulse Interval (0.28 + 0.04 + 9.68 = 10 ms)
unsigned long measureInterval = 20; // Time Interval of Measurement (ms)
unsigned long blinkInterval = 3000; // Time Interval for LED Indicator
unsigned long prevMeasure; // Previous Time of Measure
unsigned long prevBlink; // Previous Time of LED ON or OFF
float voltageADC = 0.0; // Instantaneous Voltage (ADC)
float smoothADC = 0.8; // Moving Average Voltage
float voltageClean = 0.8; // Voltage for Clean Air (Zero Setting)
ESP8266 wifi(&EspSerial);
void setup() {
pinMode(pinDrive, OUTPUT);
pinMode(pinLED, OUTPUT);
Serial.begin(9600);
delay(10);
EspSerial.begin(ESP8266_BAUD);
delay(10);
Blynk.begin(auth, wifi, ssid, pass);
timer.setInterval(1000L, myTimerEvent1);
prevMeasure = millis();
prevBlink = millis();
}
void myTimerEvent1()
{
Blynk.virtualWrite(V1, result);
}
void loop() {
Blynk.run();
timer.run();
if(millis() - prevMeasure > measureInterval) {
prevMeasure = millis();
digitalWrite(pinDrive, LOW); // Pulse ON
delayMicroseconds(samplingTime); // 0.28 ms
voltageADC = analogRead(pinADC) / 1023.0 * 5.0; // ADC to Voltage Convertion
delayMicroseconds(deltaTime); // 0.04 ms
digitalWrite(pinDrive, HIGH); // Pulse OFF
delayMicroseconds(sleepTime); // 9.68 ms
smoothADC = voltageADC * 0.005 + smoothADC * 0.995; // Exponential Moving Average
result = smoothADC * 171.9;
Serial.print("* V_instant = ");
Serial.print(voltageADC, 4);
Serial.print(", * V_smooth = ");
Serial.println(smoothADC, 4);
}
blinkInterval = long(50.0 / (smoothADC - voltageClean));
if(blinkInterval > 5000) {
blinkInterval = 5000;
pinState = 1;
}
if(millis() - prevBlink > blinkInterval) {
prevBlink = millis();
digitalWrite(pinLED, pinState);
pinState = !pinState;
}
}
****부분에 본인의 Blynk 토큰, 와이파이 이름, 비밀번호를 입력하면 된다. 센서의 전압값을 ug/m^3 단위로 바꾸는 보정치는 171.9를 사용했다.
Blynk에서 Gauge 위젯을 설치하고 Pin은 V1으로 설정하고 Reading Rate는 Push로 설정하면된다. 아래와 같은 화면이 나온다면 성공이다.
반응형
'아두이노' 카테고리의 다른 글
NodeMCU와 PMS5003 센서로 미세먼지 측정하기 (0) | 2022.12.04 |
---|---|
아두이노 + PMS5003 센서로 미세먼지 측정하기 (0) | 2022.05.23 |
Blynk와 아두이노로 온습도 표시하기 (0) | 2018.12.26 |
아두이노에서 Wii 눈차크 사용하기 [Wii Nunchuck] (0) | 2018.11.10 |
아두이노 스케치에서 package_index.json 파일 서명확인 실패 오류가 발생하는 경우 해결법 (아두이노 보드 매니저 오류) (2) | 2018.09.07 |