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);
}//끝
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
6월 22일" 초보자를 위한 아두이노 와이파이 코딩" 종이책 출간 안내 (0) | 2017.06.22 |
---|---|
초보자를 위한 라즈베리 파이 블루투스로 스마트폰 연결 출입 체크 파이선 2 코딩 (0) | 2017.06.20 |
wiringPi 라이브러리 설치 및 C언어에 의한 LED BLINK (0) | 2017.06.12 |
아두이노 NodeMCU 또는 우노로 전해 캐패시터의 충전 전압을 모니터링 하자. (0) | 2017.06.10 |
아두이노 라즈베리 파이 IOT(사물인터넷) 센서 산업 구글트렌드 상관관계 (0) | 2017.06.10 |