기본 콘텐츠로 건너뛰기

PM2008 미세먼지 정보 LED로 표시하기


PM2008 센서 값을 표시하는 가장 기본적인 예제이다. 디바이스마트 51호 기사의 4 LED 예제를 3 LED로 수정했다.

PM2008 센서는 PM1.0과 PM2.5, 그리고 PM10 미세먼지 측정값을 출력한다. 환경부 기준은 PM2.5(초미세먼지 크기 2.5㎛이하인 먼지) 년간 평균치 15㎍/㎥이하, 24시간 평균치 35㎍/㎥이하이고 PM10(미세먼지 크기 10㎛이하인 먼지)은 년간 평균치 50㎍/㎥이하, 24시간 평균치 100㎍/㎥이하로 정하고 있다.

여기서는 PM1.0과 PM2.5는 15이하이면 좋음(초록), 15초과 ~ 35이하이면 보통(노랑), 35초과이면 나쁨(빨강)으로, PM10은 50이하이면 좋음(초록), 50초과 100이하이면 보통(노랑), 100초과이면 나쁨(빨강)으로 표시하게 했다.

실제로 유의미한 값을 표시하기 위해서는 최소한 24시간 평균값을 표시하도록 해야 할 것 같다.

#include <pm2008_i2c.h>

PM2008_I2C pm2008_i2c;

void setup() {
  pm2008_i2c.begin();
  Serial.begin(9600);
  pm2008_i2c.command();
  delay(1000);

  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  uint8_t ret = pm2008_i2c.read();

  uint8_t pm1p0_grade = 0;
  uint8_t pm2p5_grade = 0;
  uint8_t pm10_grade = 0;
  uint8_t total_grade = 0;

  if (ret == 0) {
    // PM 1.0
    if (pm2008_i2c.pm1p0_grimm < 16) {
      pm1p0_grade = 1;
    } else if (pm2008_i2c.pm1p0_grimm < 35) {
      pm1p0_grade = 2;
    } else {
      pm1p0_grade = 3;
    }

    // PM 2.5
    if (pm2008_i2c.pm2p5_grimm < 16) {
      pm2p5_grade = 1;
    } else if (pm2008_i2c.pm2p5_grimm < 35) {
      pm2p5_grade = 2;
    } else {
      pm2p5_grade = 3;
    }

    // PM 10
    if (pm2008_i2c.pm10_grimm < 51) {
      pm10_grade = 1;
    } else if (pm2008_i2c.pm10_grimm < 101) {
      pm10_grade = 2;
    } else {
      pm10_grade = 3;
    }

    // Get worst grade
    total_grade = max(pm1p0_grade, pm2p5_grade);
    total_grade = max(total_grade, pm10_grade);

    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);

    Serial.print("PM1.0: ");
    Serial.println(pm2008_i2c.pm1p0_grimm);
    Serial.print("PM2.5: ");
    Serial.println(pm2008_i2c.pm2p5_grimm);
    Serial.print("PM10: ");
    Serial.println(pm2008_i2c.pm10_grimm);

    switch (total_grade) {
      case 1: {
        Serial.println("Good!");
        digitalWrite(3, HIGH);
        break;
      }

      case 2: {
        Serial.println("Nomal!");
        digitalWrite(4, HIGH);
        break;
      }

      case 3: {
        Serial.println("Worst!!!");
        digitalWrite(5, HIGH);
        break;
      }

      default:
        break;
    }
  }
  
  delay(2000);

}

아두이노UNO & PM2008센서와 LED 연결
시리얼 모니터 출력

댓글

이 블로그의 인기 게시물

ESP8266 마이크로컨트롤러에서 UART0과 UART2 동시 사용하기

ESP-12F와 2개의 FTDI를 UART0과 UART2에 연결 ESP8266은 3개의 UART 포트를 제공한다. UART0과 UART2는 같은 Serial 클래스에서 관리하므로 동시 사용이 불가능하므로 교대로 사용해야 한다. UART1은 Serial1 클래스에서 관리하므로 동시 사용이 가능하지만 출력 전용이기 때문에 TX만 정의되어 있다. UART0 UART1 UART2 RX GPIO3(RX) - GPIO13 TX GPIO1(TX) GPIO2 GPIO15 아두이노 클래스 Serial Serial1 Serial 비고 UART2와 동일한 클래스를 통해 관리됨 메시지 수신을 위한 RX는 정의되어 있지 않음 UART0와 동일한 클래스를 통해 관리됨 UART0과 UART2는 동시 사용이 불가능하므로 한 번에 하나의 포트만 사용하도록 Serial 클래스의 swap() 멤버함수를 사용한다. NodeMCU와 USB-UART 연결 NodeMCU는 ESP-12E 개발보드가 사용되었으며, micro-USB 포트를 제공한다. micro-USB 포트는 UART0 포트를 사용하며, RX(GPIO3)와 TX(GPIO1) 핀을 공유한다. USB-UART 연결 장치를 UART2 포트에 연결하기 위해 D7(GPIO13)과 D8(GPIO15) 핀에 연결했다. NodeMCU는 UART0 포트를 이용하여 Ardino의 시리얼 모니터로 출력을 보내며, UART2 포트의 출력은 별도의 터미널프로그램으로 접속하여 출력을 모니터했다.

자작 :: 아두이노 온습도계

사용부품: Arduino UNO 호환보드, DH-22 온습도 센서, 캐릭터 LCD(16x2글자), Potentionmeter 아두이노 온습도계 AM2302 DH-22 온습도센서는 다음과 같이 3개의 핀을 사용한다. Pin 1. Vcc (전원 3.3~ 5.5V) Pin 2. GND (접지) Pin 3. DOUT (데이터 송신, SDA핀 연결) 온습도 센서의 데이터 수신을 위해 DOUT 핀은 아두이노의 D2 핀에 연결했고, 전원과 DOUT을 10㏀ 풀업 저항을 달아 연결했다. 부품 구성도 LCD는 웹사이트의 카달로그로 보기에는 백색 LED 백라이트가 멋있게 보여 구매를 했는데, 가독성면에서는 옐로우-그린 LED가 더 나을 것 같기도 하다. 아두이도는 기본적으로 LCD의 D4 ~ D7까지의 핀으로 4bit 통신을 한다. D2 핀은 밝기 조절을 위해 가변저항의 가운데 핀과 연결했다. 백라이트 전원은 220Ω 저항을 달았다. 온습도 정보를 수집하여 LCD에 출력하기 위한 아두이노 소스는 다음과 같다. 소스코드:  https://github.com/Jeongsam/arduino-DH22-LCD1602 #include <adafruit_sensor.h=""> #include <liquidcrystal.h=""> #include <dht.h=""> #include <dht_u.h=""> /** * 현재 온습도를 디스플레이하기 * DHT22(AMS2302)로부터 데이터를 받아 LCD16x2 디스플레이에 표시 */ // 온습도 센서 설정 #define DHTPIN 2 // 온습도 데이터 연결 핀 번호 #define DHTTYPE DHT22 // AMS2302 DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t d...

Adafuit HUZZAH ESP8266 보드를 이용한 Arduino IDE 환경설정하기

 Espressif社의 ESP8266 마이크로컨트롤러는 Arduino 보드에 사용된 AVR 마이크로컨트롤러와 같은 종류이다. 가장 큰 장점은 WiFi 통신이 가능하며, 별도의 추가적인 하드웨어 없이 펌웨어만으로 WiFi 클라이언트와 Access Point 기능을 제공한다는 점이다. 최근 중요한 이슈로 자리잡은 사물인터넷(IoT)을 구현하는데 더없이 좋은 마이크로컨트롤러라 할 수 있다. 게다가 저렴한 가격은 덤! (8,000 ~ 10,000원 정도이니 Arduino UNO 호환보드 가격이다.)  HUZZAH 보드의 특징을 간단히 살펴보면 다음과 같다. Adafruit HUZZAH ESP8266 ESP8266 칩(64KB RAM, 96KB data RAM, 4MB QIO FLASH) 리셋 버튼 프로그램을 업로드하는데 필요한 부트로딩 모드로 전환하기 위한 버튼 프로그래밍 가능한 RED UART 통신 기능 Analog 입력 1개 (최대 1V) GPIO 핀 9개 (3.3V), I2C와 SPI 이용 가능  프로그래밍을 위해 FTDI 연결이 필요하다. 프로그래밍은 Arduino IDE를 사용할 수 있으며, Arduino와 같이 C/C++ 코드를 이용하여 개발이 가능하다. 참고로 Epressif社의 ESP8266 개발보드인 NodeMCU는 루아(LUA)라는 프로그래밍언어를 기본 제공한다. Adafruit社의 HUZZAH 보드는 기본적으로 핀헤더 없이 반제품으로 판매되며 필요에 따라 핀헤더를 직접 납땜해서 부착해야한다. 핀헤더 및 USB 포트를 기본제공하는 개발보드 형태의 제품을 별도로 판매하고 있다. Arduino IDE를 이용하여 프로그래밍을 하기 위해서는 우선 라이브러리에 ESP8266 보드를 추가해야 한다. Arduino IDE에 ESP8266 애드온 설치하기 1. 환경설정에서 "추가적인 보드 매니저 URLs"에 다음 URL을 입력한다. http://arduino.esp8266.com/sta...