본문 바로가기

아두이노우노 R4

아두이노 나노, PM2008 미세먼지 SSD1306 Oled Display

반응형

 

오랜만에 다시 미세먼지 센서와 OLED SSD1306을 연결해 데이터를 확인하는 실습을 한다.

 

코드는 최대한 간략하게 쓰고 설명한다. 그림 있던 거 또 그리고, 코드 있는 것 또 가져다 쓰고 하는 일도 좀 편하지가 않다.

 

회로도

 

 

 

 

아두이노 나노 코드

 


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <SimpleDHT.h>
#include <pm2008_i2c.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
//#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16

/*
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };
*/

PM2008_I2C pm2008_i2c;

int flag = 0; //for interrupt
#define debounceTime 200 // <<- Set debounce Time (unit ms) 

void setup()
{
    Serial.begin(9600);
    
    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
    // 바로 여기다 3C 로 수정한다. 
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) 
    { // Address 0x3D for 128x64
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
    }

    //pinMode(redPin, OUTPUT);
    //pinMode(greenPin, OUTPUT);
    //pinMode(bluePin, OUTPUT);
    //pinMode(buttoninput, INPUT);
   // attachInterrupt(0, ButtonInterrupt, FALLING);

    //digitalWrite(redPin, LOW);
    //digitalWrite(greenPin, LOW);
    //digitalWrite(bluePin, LOW);


    pm2008_i2c.begin();
    pm2008_i2c.command();

    initial_oled();
    
    delay(1000);
}

int currentmode = 1;

void loop()
{
    //mode lection process
    if(currentmode == 1)
    {
        display.clearDisplay();
        showfinedust();        
    }
    
    Serial.println("Show");
    delay(2000);
}

char _buffer[10];

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

if (ret == 0) {
        Serial.print("PM 1.0 (TSI) : ");
        Serial.println(pm2008_i2c.pm1p0_tsi);
        Serial.print("PM 2.5 (TSI) : : ");
        Serial.println(pm2008_i2c.pm2p5_tsi);
        Serial.print("PM 10 (TSI) : : ");
        Serial.println(pm2008_i2c.pm10_tsi);
    }
    else
      Serial.println("pm2008 Error");    

    display.setCursor(0, 10); 
    sprintf(_buffer, "PM1.0 %d", pm2008_i2c.pm1p0_tsi);
    display.println(_buffer);

    display.setCursor(0, 30); 
    sprintf(_buffer, "PM2.5 %d", pm2008_i2c.pm2p5_tsi);
    display.println(_buffer);

    display.setCursor(0, 50); 
    sprintf(_buffer, "PM10 %d", pm2008_i2c.pm10_tsi);
    display.println(_buffer);
    
    // update the display 
    display.display(); 

    delay(1000);   
}

void initial_oled()
{
    //initialize the SSD1306 OLED display with I2C address = 0x3D
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  // clear the display buffer.
  display.clearDisplay();
 
  //display.setTextSize(1);   // text size = 1
  display.setTextColor(WHITE, BLACK);  // set text color to white and black background
  //display.setCursor(15, 0);            // move cursor to position (15, 0) pixel
  //display.print("Today Weather");
  //display.display();        // update the display
  display.setTextSize(2);   // text size = 2
}

 

 

 

 

 

 

 

 

참고 자료

Portable Fine Dust PM10 Analyzer with Large OLED Digits 

 

 

 

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^