BASIC4MCU | 질문게시판 | DS1307 세그먼트 출력 질문드립니다.
페이지 정보
작성자 쭝짱 작성일2020-12-06 14:19 조회4,526회 댓글3건본문
#include <RTClib.h>
#include "Wire.h"
RTC_DS1307 RTC;
// 0~9까지 숫자 표현을 위한 세그먼트 a, b, c, d, e, f, g, dp의 패턴
byte patterns[]{
0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6
};
int digit_select_pin[] = {65, 66, 67, 68, 69}; //자릿수 선택 핀
//7세그먼트 모듈 연결 핀 'a, b, c, d, e, f, g, dp, dp1' 순서
int segment_pin[] = {56, 57, 58, 59, 60, 61, 62, 63};
int segment_pin1 = 64;
int now_hour, now_minute;
int SEGMENT_DELAY = 1;
unsigned long time_previous, time_current;
void setup() {
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__)); //컴퓨터의 컴파일 시간으로 RTC를 초기화
for (int i=0; i<5; i++){ //자릿수 선택 핀을 출력으로 설정
pinMode(digit_select_pin[i], OUTPUT);
}
for(int i=0; i<8; i++){ //세그먼트 제어 핀을 출력으로 설정
pinMode(segment_pin[i], OUTPUT);
}
pinMode(digit_select_pin[4], OUTPUT); // 세그먼트의 ':' 자리 출력으로 설정
pinMode(segment_pin1, OUTPUT); // 세그먼트의 ':' 핀 출력으로 설정
}
byte bcd2bin(byte n){
byte val = 0;
int dec1 = n>>4;
int dec2 = n&0x0f;
val = dec1*10 + dec2;
return val;
}
void show_digit(int pos, int number){ // (위치, 출력할 숫자)
for (int i=0; i<5; i++){
if (i+1 == pos) //해당 자릿수의 선택 핀만 LOW로 설정
digitalWrite(digit_select_pin[i], LOW);
else //나머지 자리는 HIGH로 설정
digitalWrite(digit_select_pin[i], HIGH);
}
for(int i=0; i<8; i++){
boolean on_off = bitRead(patterns[number], 7-i);
digitalWrite(segment_pin[i], on_off);
}
}
void show_4_digit(int number1, int number2){
int one = number1 / 10;
int two = number1 % 10;
int three = number2 / 10;
int four = number2 % 10;
show_digit(1, one); //'number1'자리에 숫자 'number2'를 표시
delay(SEGMENT_DELAY);
show_digit(2, two);
delay(SEGMENT_DELAY);
show_digit(3, three);
delay(SEGMENT_DELAY);
show_digit(4, four);
delay(SEGMENT_DELAY);
}
void loop() {
DateTime now = RTC.now();
time_current = millis();
if (time_current - time_previous >= 100){
time_previous = time_current;
now_hour = bcd2bin(now.hour());
now_minute = bcd2bin(now.minute());
}
show_4_digit(now_hour, now_minute);
}
아직 완성된 코드는 아니지만 이 코드를 세그먼트로 출력했을 때 숫자가 제대로 안들어옵니다.
세그먼트 연결은 다 잘되어있고 다른 코드로 숫자 출력하여 테스트도 해봤습니다,
위 코드에서 DS1307 시계 모듈로 현재시간을 받아와 4비트씩 BCD 수를 십진수로 변환하여 세그먼트 한자리 한자리에 출려할 예정입니다.
하지만 위 코드의 시계모듈에서 현재시간을 못받아 오는 것 같습니다. DS1307 모듈이 BCD 코드를 출력하는 건지도 검색하면서 알게되었는데 자세하게는 잘 모르겠습니다 ..ㅠ
아니면 세그먼트 핀 출력 코드가 잘못된걸까요??
댓글 3
조회수 4,526master님의 댓글
master 작성일
라이브러리를 이용하는데
사용자가 BCD 변환을 해야 할 정도로 라이브러리에서 아무 것도 안하고 있을까요?
이미 라이브러리에서 BCD 변환을 해서 넘겨줄테니 사용자가 변환할 필요는 없을겁니다.
쭝짱님의 댓글
쭝짱 작성일
void loop() {
DateTime now = RTC.now();
time_current = millis();
if (time_current - time_previous >= 100){
time_previous = time_current;
now_hour = now.hour();
now_minute = now.minute();
}
show_4_digit(now_hour, now_minute);
}
그럼 이 코드처럼 변환안하고 바로 show_4_digit 함수로 넘겨줬는데도 세그먼트 출력이 이상하게 나오는건 세그먼트로의 입력값이 잘못된걸까요??
DS1307로 현재시간을 시리얼 모니터로 출력하는 테스트도 해봤는데 정상동작 했습니다..
master님의 댓글
master
세그먼트 출력만 해결하면 되겠습니다.
브레드보드는 접촉이 안 좋은 경우도 있습니다.
세그먼트 예제로 세그먼트가 정상 출력하는지 체크하세요