아두이노프로세싱 프로그래밍

아두이노 우노 0.96 OLED 디스플레이 온습도계 DHT11/시계 동시 코딩

coding art 2017. 6. 9. 16:37
728x90


선명도가 뚜렷하고 광활하게 넓은 0.96 모노크롬 OLED 에 시간만 기록하기에는 웬지 미흡한 듯하여 DHT11 온습도계를 사이좋게 나란히 장착하고 시계/타이머 코드를 수정하였다.

 

두 개의 서로 다른 코드를 큰 수정 없이 합치는 과정인데 주의할 점은 두 가지 결과를 0.96 OLED에 깔끔하게 출력하는 일이다.

 

0.96 OLED 기준에서 볼 때에 디자인 감각 상 시간 표현에 다소 큰 폰트 를 사용하기 때문에 온도와 습도를 모두 함께 출력하기에는 그 광활한 OLED도 협소한듯하다.


시스템 사진과 배선도 상의 온습도계가 모양이 다르다. 사진에는 LED가 없는 온습도계가 사용되었는데 실험 결과 아무런 차이가 없었다.


OLED와  DHT11의 배선 작업은 그다지 복잡하지는 않다. OLEDI2C 인터페이스 배선이므로 SCLA5 SDAA4를 할당한다.

 

아울러 DHT11의 데이터 핀 선은 디지털 5번 핀에 할당한다.

 

전원은 둘 다 3.3V 5V 가 가능하므로 전력 소모가 작은 3.3V로 배선하도록 한다.

따라서 시간 표현과 온습도 표현을 분리하여 따로따로 번갈아 가며 출력하는 것이 시각적으로 바람직하다

.

시간 표현 후 2초를 지연시키고 온습도 측정도 12초 정도 소요되므로 2초간 시간 지연을 주도록 한다. 시간 표현에서 디스플레이 될 때마다 4초씩 점프하는 것을 관찰할 수 있을 것이다. 코딩 시 각자 적절한 시간 지연을 시험해 보기 바란다.

 

코드의 구조는 그다지 복잡하지 않으므로 아두이노 우노 DHT11 온습도 측정 코드와 0.96 OLED 시계/타이머 코드를 살펴서 비교해보면 좋을 것이다. 참고로 NodeMCU와는 0.96OLED 지원 라이브러리가 완전히 다르므로 혼동하지 않도록 하자.


OLED_DHT11_01

 

  #include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <DHT11.h>
#define OLED_RESET 4

int pin = 5;
 unsigned long currentHr = 16;
 unsigned long currentMin = 18;
 
 Adafruit_SH1106 display(OLED_RESET);
 DHT11 dht11(pin);

void setup()   {               
  Serial.begin(9600);
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);
}

void loop() {

    unsigned long currentMillis = millis();
    unsigned long hr = currentHr + currentMillis/3600000;
    currentMillis = currentMillis%3600000;
    unsigned long minute = currentMin + currentMillis/60000;
    unsigned long second = currentMillis%60000;
    unsigned long sec = second/1000;
  
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(5,15);
    if( hr <12 ) {
      display.println("AM");
    }
    else if( hr <24 ) {
      display.println("PM");
    }
    else {
      hr = hr -24;
      display.println("AM");
    }
    display.setTextSize(2);
    display.setCursor(5,35);
    if( minute >= 60 ) {
      hr = hr + 1;
      minute = minute - 60;
    }
    display.print((unsigned long)hr);
    display.print(":");
    display.print((unsigned long)minute);
    display.print(":");
    display.print((unsigned long)sec);   
    display.display();
    delay(2000);

  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    Serial.print("temperature:");
    Serial.print(temp);
    Serial.print(" humidity:");
    Serial.print(humi);
    Serial.println();
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(5,15);
    display.print("Temp: ");
    display.println((int)temp);
    display.setCursor(5,35);
    display.print("Humid: ");
    display.print((int)humi);
    display.display();
  }
  else  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();   
  }
  delay(2000);          
}//끝