- 필요한 구성 요소
- PM2.5 및 PM10 측정 용 Nova PM 센서 SDS011
- 0.96 'OLED 디스플레이 모듈의 기본
- 일산화탄소 (CO) 측정을위한 MQ-7 센서 준비
- 대기 질 지수 계산
- 회로도
- Perf Board에 공기질 모니터링 시스템 회로 구축
- Adafruit IO 설정
- 코드 설명
- AQI 모니터링 시스템 용 3D 프린팅 케이스
- AQI 모니터링 시스템 테스트
겨울이 다가 오면 우리 위에 드리 워진 공기는 불타는 들판, 산업 공장 및 차량 교통에서 나오는 연기와 가스 배출물로 두꺼워 져 태양을 차단하고 숨을 쉬기 어렵게 만듭니다. 전문가들은 높은 수준의 대기 오염과 COVID-19 대유행이 심각한 결과를 초래할 수있는 위험한 혼합이 될 수 있다고 말합니다. 실시간 대기 질 모니터링의 필요성은 매우 눈부 십니다.
따라서이 프로젝트에서는 Nova PM SDS011 센서, MQ-7 센서 및 DHT11 센서를 사용하여 ESP32 대기 질 모니터링 시스템 을 구축 할 것 입니다. 또한 OLED 디스플레이 모듈을 사용하여 대기 품질 값을 표시합니다. 인도 의 대기 질 지수 (AQI)는 PM10, PM2.5, SO2 및 NO2, CO, 오존, NH3 및 Pb의 8 가지 오염 물질을 기준으로합니다. 그러나 모든 오염 물질을 측정 할 필요는 없습니다. 그래서 우리는 대기 질 지수를 계산하기 위해 PM2.5, PM10 및 일산화탄소의 농도를 측정 할 것입니다. AQI 값은 Adafruit IO에 게시되어 어디서나 모니터링 할 수 있습니다. 이전에는 Arduino를 사용하여 LPG, Smoke 및 Ammonia 가스의 농도도 측정했습니다.
필요한 구성 요소
- ESP32
- Nova PM 센서 SDS011
- 0.96 'SPI OLED 디스플레이 모듈
- DHT11 센서
- MQ-7 센서
- 점퍼 와이어
PM2.5 및 PM10 측정 용 Nova PM 센서 SDS011
SDS011 센서는 Nova Fitness에서 개발 한 최신 공기질 센서 입니다. 레이저 산란 원리로 작동하며 공기 중 0.3 ~ 10μm의 입자 농도를 얻을 수 있습니다. 이 센서는 소형 팬, 공기 흡입구 밸브, 레이저 다이오드 및 광 다이오드로 구성됩니다. 공기는 광원 (레이저)이 입자를 비추고 산란 된 빛이 광 검출기에 의해 신호로 변환되는 공기 유입구를 통해 들어갑니다. 이러한 신호는 PM2.5 및 PM10의 입자 농도를 얻기 위해 증폭되고 처리됩니다. 이전에 Arduino와 함께 Nova PM 센서를 사용하여 PM10 및 PM2.5의 농도를 계산했습니다.
SDS011 센서 사양:
- 출력: PM2.5, PM10
- 측정 범위: 0.0-999.9μg / m3
- 입력 전압: 4.7V ~ 5.3V
- 최대 전류: 100mA
- 수면 전류: 2mA
- 응답 시간: 1 초
- 직렬 데이터 출력 주파수: 1 회 / 초
- 입자 직경 해상도: ≤0.3μm
- 상대 오차: 10 %
- 온도 범위: -20 ~ 50 ° C
0.96 'OLED 디스플레이 모듈의 기본
OLED (Organic Light Emitting Diode)는 전류가 흐를 때 여기되는 유기 화합물을 사용하여 만든 일종의 발광 다이오드입니다. 이러한 유기 화합물에는 자체 조명이 있으므로 일반 LCD와 같은 백라이트 회로가 필요하지 않습니다. 이러한 이유로 OLED 디스플레이 기술은 전력 효율적이며 텔레비전 및 기타 디스플레이 제품에 널리 사용됩니다.
디스플레이 색상, 핀 수, 크기 및 컨트롤러 IC에 따라 다양한 유형의 OLED가 시장에 나와 있습니다. 이 튜토리얼에서는 너비가 128 픽셀이고 길이가 64 픽셀 인 Monochrome Blue 7 핀 SSD1306 0.96”OLED 모듈을 사용합니다. 이 7 핀 OLED는 SPI 프로토콜을 지원하고 컨트롤러 IC SSD1306은 OLED가 수신 된 문자를 표시하도록 도와줍니다. 링크를 따라 OLED 및 다른 마이크로 컨트롤러와의 인터페이스에 대해 자세히 알아보십시오.
일산화탄소 (CO) 측정을위한 MQ-7 센서 준비
MQ-7 CO 일산화탄소 가스 센서 모듈은 공기 중 CO 농도를 감지합니다. 센서는 10 ~ 10,000ppm의 농도를 측정 할 수 있습니다. MQ-7 센서는 모듈로 구매하거나 센서로만 구매할 수 있습니다. 이전에는 다양한 유형의 가스 센서를 사용하여 다양한 가스를 감지하고 측정했으며, 관심이있는 경우 확인할 수도 있습니다. 이 프로젝트에서는 MQ-7 센서 모듈 을 사용하여 PPM의 일산화탄소 농도를 측정합니다. MQ-7 보드의 회로도는 다음과 같습니다.
부하 저항기 RL은 센서 작동에 매우 중요한 역할을합니다. 이 저항은 가스 농도에 따라 저항 값을 변경합니다. MQ-7 센서 보드는 쓸모없고 센서 판독 값에 영향을주는 1KΩ의 부하 저항과 함께 제공됩니다. 따라서 적절한 CO 농도 값을 측정하려면 1KΩ 저항을 10KΩ 저항으로 교체해야합니다.
대기 질 지수 계산
인도의 AQI는 표준 시간 간격 (대부분의 오염 물질의 경우 24 시간, 일산화탄소 및 오존의 경우 8 시간) 동안 측정 된 특정 오염 물질의 평균 농도를 기반으로 계산됩니다. 예를 들어 PM2.5 및 PM10에 대한 AQI는 24 시간 평균 농도를 기반으로하고 일산화탄소에 대한 AQI는 8 시간 평균 농도를 기반으로합니다. AQI 계산에는 PM10, PM2.5, 이산화질소 (NO 2), 이산화황 (SO 2), 일산화탄소 (CO),지면 오존 (O 3), 암모니아 (NH 3), 및 납 (Pb). 그러나 모든 오염 물질이 모든 위치에서 측정되는 것은 아닙니다.
측정 된 24 시간 대기 오염 물질 농도를 기반으로 농도의 선형 함수 인 하위 지수가 계산됩니다 (예: PM2.5의 하위 지수는 농도 31 µg / m3에서 51, 농도에서 100 60 µg / m3 및 45 µg / m3 농도에서 75). 최악의 하위 인덱스 (또는 모든 매개 변수의 최대 값)가 전체 AQI를 결정합니다.
회로도
IoT 기반 대기 질 모니터링 시스템의 회로도 는 매우 간단하며 다음과 같습니다.
SDS011 센서, DHT11 및 MQ-7 센서는 + 5V로 전원이 공급되고 OLED 디스플레이 모듈은 3.3V로 전원이 공급됩니다. SDS011의 송신기 및 수신기 핀은 ESP32의 GPIO16 및 17에 연결됩니다. MQ-7 센서의 Analog Out 핀은 GPIO 25에 연결되고 DHT11 센서의 데이터 핀은 GPIO27 센서에 연결됩니다. OLED 디스플레이 모듈은 SPI 통신을 사용하므로 OLED 모듈과 ESP32 사이에 SPI 통신을 설정했습니다. 연결은 아래 표에 나와 있습니다.
S. 아니 |
OLED 모듈 핀 |
ESP32 핀 |
1 |
GND |
바닥 |
2 |
VCC |
5V |
삼 |
D0 |
18 |
4 |
D1 |
23 |
5 |
RES |
2 |
6 |
DC |
4 |
7 |
CS |
5 |
S. 아니 |
SDS011 핀 |
ESP32 핀 |
1 |
5V |
5V |
2 |
GND |
GND |
삼 |
RX |
17 |
4 |
TX |
16 |
S. 아니 |
DHT 핀 |
ESP32 핀 |
1 |
Vcc |
5V |
2 |
GND |
GND |
삼 |
데이터 |
27 |
S. 아니 |
MQ-7 핀 |
ESP32 핀 |
1 |
Vcc |
5V |
2 |
GND |
GND |
삼 |
A0 |
25 |
Perf Board에 공기질 모니터링 시스템 회로 구축
메인 이미지에서 볼 수 있듯이 아이디어는 3D Printed Casing 내부에이 회로를 사용하는 것이 었습니다. 따라서 위에 표시된 전체 회로는 성능 기판에 납땜됩니다. OLED 및 센서를 장착 할 수있는 충분한 거리를두고 와이어를 사용하십시오. OLED에 납땜 된 성능 보드와 센서 모듈은 아래와 같습니다.
Adafruit IO 설정
Adafruit IO는 클라우드에서 라이브 데이터를 집계, 시각화 및 분석 할 수있는 개방형 데이터 플랫폼입니다. Adafruit IO를 사용하면 인터넷을 통해 데이터를 업로드, 표시 및 모니터링하고 프로젝트 IoT를 활성화 할 수 있습니다. Adafruit IO를 사용하여 인터넷을 통해 모터를 제어하고 센서 데이터를 읽고 멋진 IoT 애플리케이션을 만들 수 있습니다.
Adafruit IO를 사용하려면 먼저 Adafruit IO에 계정을 만듭니다. 이렇게하려면 Adafruit IO 웹 사이트로 이동하여 화면 오른쪽 상단의 '무료로 시작하기'를 클릭합니다.
계정 생성 과정이 끝나면 계정에 로그인하고 오른쪽 상단의 'View AIO Key'를 클릭하여 계정 사용자 이름과 AIO 키를 얻습니다.
'AIO 키'를 클릭하면 Adafruit IO AIO 키와 사용자 이름이 표시된 창이 나타납니다. 이 키와 사용자 이름을 복사하면 코드에서 사용됩니다.
이제 AIO 키를 얻은 후 DHT 센서 데이터를 저장할 피드를 만듭니다. 피드를 생성하려면 '피드'를 클릭하십시오. 그런 다음 '작업'을 클릭 한 다음 사용 가능한 옵션에서 '새 피드 만들기'를 선택합니다.
그런 다음 피드의 이름과 설명을 입력해야하는 새 창이 열립니다. 설명 작성은 선택 사항입니다.
그런 다음 '만들기'를 클릭하십시오. 새로 생성 된 피드로 리디렉션됩니다.
이 프로젝트를 위해 PM10, PM2.5, CO, 온도, 습도 및 AQI 값에 대해 총 6 개의 피드를 생성했습니다. 나머지 피드를 만들려면 위와 동일한 절차를 따르십시오.
피드를 생성 한 후 이제 단일 페이지에 센서 데이터를 시각화하는 Adafruit IO 대시 보드 기능을 생성합니다. 이를 위해 먼저 대시 보드를 만든 다음 해당 대시 보드에 이러한 모든 피드를 추가합니다.
대시 보드를 만들려면 대시 보드 옵션을 클릭 한 다음 '작업'을 클릭 한 다음 '새 대시 보드 만들기'를 클릭하십시오.
다음 창에서 대시 보드 이름을 입력하고 '만들기'를 클릭합니다.
대시 보드가 생성되면 이제 Gauge 및 Slider와 같은 Adafruit IO 블록을 사용하여 데이터를 시각화합니다. 블록을 추가하려면 오른쪽 상단의 '+'를 클릭하십시오.
그런 다음 '게이지'블록을 선택합니다.
다음 창에서 시각화 할 피드 데이터를 선택하십시오.
마지막 단계에서 블록 설정을 변경하여 사용자 지정합니다.
이제 위와 동일한 절차에 따라 나머지 피드에 대한 시각화 블록을 추가합니다. 내 Adafruit IO 대시 보드는 다음과 같습니다.
코드 설명
이 프로젝트의 전체 코드는 문서 끝에 제공됩니다. 여기에서는 코드의 중요한 부분을 설명합니다.
이 코드는 SDS011, Adafruit_GFX, Adafruit_SSD1306, Adafruit_MQTT 및 DHT.h 라이브러리를 사용합니다. SDS011, Adafruit_GFX 및 Adafruit_SSD1306 라이브러리는 Arduino IDE의 라이브러리 관리자에서 다운로드하여 설치할 수 있습니다. 이를 위해 Arduino IDE를 열고 Sketch <Include Library <Manage Libraries로 이동하십시오 . 이제 SDS011을 검색 하고 R. Zschiegner 의 SDS 센서 라이브러리를 설치합니다 .
마찬가지로 Adafruit 의 Adafruit GFX 및 Adafruit SSD1306 라이브러리를 설치합니다. Adafruit_MQTT.h 및 DHT11.h는 주어진 링크에서 다운로드 할 수 있습니다.
Arduino IDE에 라이브러리를 설치 한 후 필요한 라이브러리 파일을 포함하여 코드를 시작합니다.
#포함
다음 줄에서 OLED 디스플레이 너비와 높이를 정의합니다. 이 프로젝트에서는 128x64 SPI OLED 디스플레이를 사용했습니다. 당신은 변경할 수 있습니다 SCREEN_WIDTH을 하고 SCREEN_HEIGHT의 디스플레이에 따라 변수.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
그런 다음 OLED 디스플레이가 연결된 SPI 통신 핀을 정의합니다.
#define OLED_MOSI 23 #define OLED_CLK 18 #define OLED_DC 4 #define OLED_CS 5 #define OLED_RESET 2
그런 다음 앞에서 정의한 너비와 높이 및 SPI 통신 프로토콜을 사용하여 Adafruit 디스플레이에 대한 인스턴스를 만듭니다.
Adafruit_SSD1306 디스플레이 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
그런 다음 Adafruit IO 서버에서 복사 한 WiFi 및 Adafruit IO 자격 증명을 포함합니다. 여기에는 MQTT 서버, 포트 번호, 사용자 이름 및 AIO 키가 포함됩니다.
const char * ssid = "Galaxy-M20"; const char * pass = "ac312124"; #define MQTT_SERV "io.adafruit.com"#define MQTT_PORT 1883 #define MQTT_NAME "choudharyas"#define MQTT_PASS "988c4e045ef64c1b9bc8b5bb7ef5f2d9"
그런 다음 센서 데이터를 저장하기 위해 Adafruit IO 피드를 설정합니다. 제 경우에는 AirQuality, Temperature, Humidity, PM10, PM25, CO 등 다양한 센서 데이터를 저장하기 위해 6 개의 피드를 정의했습니다.
Adafruit_MQTT_Client mqtt (& client, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS); Adafruit_MQTT_Publish AirQuality = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / AirQuality"); Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / Temperature"); Adafruit_MQTT_Publish Humidity = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / Humidity"); Adafruit_MQTT_Publish PM10 = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / PM10"); Adafruit_MQTT_Publish PM25 = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / PM25"); Adafruit_MQTT_Publish CO = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / CO");
이제 setup () 함수 내에서 디버깅을 위해 9600의 전송 속도로 직렬 모니터를 초기화합니다. 또한 begin () 함수를 사용 하여 OLED 디스플레이, DHT 센서 및 SDS011 센서를 초기화합니다.
무효 설정 () {my_sds.begin (16,17); Serial.begin (9600); dht.begin (); display.begin (SSD1306_SWITCHCAPVCC);
설정 함수 내부 의 for 루프 는 정의 된 숫자까지 값을 수집 한 다음 카운터를 0으로 설정하는 데 사용됩니다.
for (int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++) {readingsPM10 = 0; }
센서 값 읽기:
이제 루프 함수 내에서 millis () 메서드를 사용하여 1 시간마다 센서 값을 읽습니다. 각 가스 센서는 0에서 4095까지의 아날로그 값을 출력합니다.이 값을 전압으로 변환하려면 다음 방정식을 사용하십시오. RvRo = MQ7Raw * (3.3 / 4095); 여기서 MQ7Raw 는 센서의 아날로그 핀의 아날로그 값입니다. 또한 SDS011 센서에서 PM2.5 및 PM10 판독 값을 읽으십시오.
if ((unsigned long) (currentMillis-previousMillis)> = interval) {MQ7Raw = analogRead (iMQ7); RvRo = MQ7Raw * (3.3 / 4095); MQ7ppm = 3.027 * exp (1.0698 * (RvRo)); Serial.println (MQ7ppm); 오류 = my_sds.read (& p25, & p10); if (! error) {Serial.println ("P2.5:"+ String (p25)); Serial.println ("P10:"+ 문자열 (p10)); }}
값 변환:
PM2.5 및 PM10 값은 이미 µg / m 3 이지만 일산화탄소 값을 PPM에서 mg / m 3 로 변환해야합니다. 변환 공식은 다음과 같습니다.
농도 (mg / m 3) = 농도 (PPM) × (분자 질량 (g / mol) / 몰 부피 (L))
여기서: CO의 분자 질량은 28.06 g / mol이고 몰 부피는 25 0 C 에서 24.45L입니다.
농도 INmgm3 = MQ7ppm * (28.06 / 24.45); Serial.println (ConcentrationINmgm3);
24 시간 평균 계산:
그런 다음 다음 줄에서 PM10, PM2.5 판독 값에 대해 24 시간 평균을 계산하고 일산화탄소 판독 값에 대해 8 시간 평균을 계산합니다. 코드의 첫 번째 줄에서 현재 합계를 가져와 배열의 첫 번째 요소를 뺀 다음 새 합계로 저장합니다. 처음에는 0이됩니다. 그런 다음 센서 값을 가져와 현재 판독 값을 합계에 더하고 숫자 인덱스를 늘립니다. 인덱스 값이 numReadings보다 크거나 같으면 인덱스를 다시 0으로 설정합니다.
totalPM10 = totalPM10-readingsPM10; 판독 값 PM10 = p10; totalPM10 = totalPM10 + readingsPM10; readIndexPM10 = readIndexPM10 + 1; if (readIndexPM10> = numReadingsPM10) {readIndexPM10 = 0; }
그런 다음 마지막으로이 값을 Adafruit IO에 게시합니다.
if (! Temperature.publish (온도)) {delay (30000); } if (! Humidity.publish (humidity)) {delay (30000); ………………………………………………………. ……………………………………………………….
AQI 모니터링 시스템 용 3D 프린팅 케이스
다음으로 버니어를 사용하여 설정의 치수를 측정하고 센서와 OLED의 치수를 측정하여 케이스를 설계했습니다. 내 디자인은 일단 완성되면 아래와 같이 보입니다.
디자인에 만족 한 후 STL 파일로 내보내고 프린터 설정에 따라 슬라이스 한 다음 마지막으로 인쇄했습니다. 다시 STL 파일은 Thingiverse에서 다운로드 할 수 있으며이를 사용하여 케이스를 인쇄 할 수 있습니다.
인쇄가 끝난 후, 나는 시설에 설치하기 위해 영구 인클로저에 설정된 프로젝트를 조립하는 작업을 진행했습니다. 완전한 연결을 통해 회로를 케이스에 조립했고 여기에서 볼 수 있듯이 모든 것이 잘 맞았습니다.
AQI 모니터링 시스템 테스트
하드웨어와 코드가 준비되면 장치를 테스트 할 차례입니다. 장치에 전원을 공급하기 위해 외부 12V 1A 어댑터를 사용했습니다. 보시다시피 장치는 OLED 디스플레이에 PM10, PM2.5 및 일산화탄소 농도를 표시합니다. PM2.5와 PM10의 농도는 ㎍ / m에 3 일산화탄소의 농도 밀리그램 / m 인 동안 3.
이러한 수치는 Adafruit IO 대시 보드에도 게시됩니다. 모든 매개 변수 (PM10, PM2.5 및 CO)의 최대 값은 AQI입니다.
지난 30 일의 AQI 값이 그래프로 표시됩니다.
이것이 SDS011 및 MQ-7 센서를 사용하여 대기 질 지수를 계산하는 방법입니다. 프로젝트의 전체 작업은 아래 링크 된 비디오에서도 찾을 수 있습니다. 프로젝트가 즐거웠고 자신 만의 프로젝트를 만드는 것이 흥미 로웠기를 바랍니다. 질문이 있으시면 아래 댓글 섹션에 남겨주세요.