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

아두이노 초보자를 위한 “시리얼 모니터를 이용하는 0.96 OLED 시계/타이머 초기 시간 세팅”

coding art 2017. 6. 19. 21:11
728x90


millis() 명령을 이용하여 시간을 계산하는 아두이노 시계/타이머는 시계를 처음 샀을 때와 마찬가지로 항상 시간을 분 단위까지는 맞춰 주어야 한다.

아두이노 코드 초반에 현재 시간 및 분을 뜻하는 currentHr 와 currentMin 을 타이머로 사용한다면 초기 값을 각각 0으로 두면 되고 시계일 경우에는 자기 시계를 보고 맞춰 주면 될 것이다.

하지만 아두이노는 별도 입력 장치가 없어 코드 초반에 초기 값을 설정하고 컴파일 해야 하는 불편함이 있다.
 



이런 불편함을 해소하기 위해서 시리얼 모니터를 사용하여 초기 값을 입력할 수 있도록 코드를 수정해 보기로 한다.

setup()에서 통신속도를 설정한다음 시리얼 모니터에 시간 세팅을 위한 데이터를 0000 형태로 시간 분 정보 입력을 요청 출력한다. 오전 시간이라면 3자리 수로 입력해도 되며 오후 시간이라면 4자리 수 입력이 가능하다.

Serial.available() 은 시리얼 포트 버퍼 값을 체크한다. 시리얼 버퍼에 0 이 아닌 입력 값이 들어 있으면  while(⚫⚫⚫) {} 문을 끝내고 다음 명령으로 넘어 간다.
시리얼 포트로 입력된 값은 Serial.parseInt()를 사용하여 읽어 낸다.

시리얼 포트 입력 창에서 시간 분 정보 숫자 데이터를 입력하고 전

송 버튼을 누르면 입력이 된다.

입력된 값을 Serial.parseInt() 로 읽어 시리얼 모니터에 출력을 통해 입력 데이터 확인이 가능하다.

정수형 연산에서 100으로 나누었을 때 몫이 시간 정보가

되며 나머지가 분 정보가 되는 것이다.

그 나머지 시계/타이머 루틴은 수정 사항이 없다.



OLED_Clock_setting_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 = 0;
 unsigned long currentMin = 0;
 
 Adafruit_SH1106 display(OLED_RESET);
 DHT11 dht11(pin);

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

  Serial.println("Clock setting data with 0000 in HR & Min");
  while( Serial.available() == 0 ) {   
  }
  int hrmin = Serial.parseInt();
  currentHr = hrmin/100;
  Serial.println(currentHr);
  currentMin = hrmin%100;
  Serial.println(currentMin);
}

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);          
}//끝