
ESP32 스마트 시계 프로젝트를 진행하면서 디지털시계처럼 동작하는 모듈을 만드는 일을 맡게 되었다. 시간 표시는 잠시 미뤄두고, 7 segment에 불을 켜는 것부터 시작했다. 부품을 선정하고, 회로를 구성하고, 코드를 작성하여 업로드하는 모든 과정을 이 게시글로 남긴다.
이 글에서 소개하는 방법은 다음과 같은 특징을 가진다.
- Arduino IDE 사용
- 코드 작성할 때 GPT 일부 활용함
- Common anode(Active LOW) 4 digit 7 segment 사용
- BCD to 7 segment decoder 칩 사용하지 않음
사용한 부품
고휘도 LED
디바이스마트에서 구매했다. 사이즈가 크고, 밝기가 밝아 LED 시계를 만드는 목적에 적합했다.
ESP32 보드
동신전자에 간 김에 구매했다. 급하게 구매했지만 잘 작동된다.
20옴 저항
ESP32 보드와 마찬가지로 동신전자에 간 김에 구매했다. 10개에 100원 정도라 온라인으로 주문하기에는 배송비가 너무 많이 나온다.
브레드보드(빵판)
최종 결과물을 납땜할 예정이라고 해도 브레드보드 위에서 테스트를 해 보는 것이 좋다. ESP32는 일반적은 브레드보드의 넓이와 맞지 않아서 나는 2개의 브레드보드를 서로 연결해서 사용했다.
ESP32의 특징
ESP32는 3.3V output을 가지고 있고, 흰색 LED는 전압 범위가 3.4V~4.0V이다. (부품의 Datasheet를 구할 수 없어 이 블로그 게시글을 참고하였다.) 그래도 너무 큰 전류가 흐르면 안 되기 때문에 작은 저항을 달아 줘야 한다. 나는 LED를 최대한 밝게 켜는 게 목적이었기 때문에 20옴의 작은 저항을 달았다.
또한 이 게시글을 보면 알 수 있듯 ESP32는 GPIO pin 개수가 많지 않다. 따라서 7 segment 이외의 부품을 연결해야 한다면 미리 pin 개수를 확인해 계획을 잘 세워야 한다.
PC의 사용자 이름(정확히는 Users/사용자 폴더의 이름)이 한글인 경우 Arduino IDE에서 ESP32로 업로드가 안될 수 있다. 보드 매니저에서 문제가 생기는 것으로 추정된다. 이 문제로 나는 PC에 영문 이름의 다른 사용자를 만들어서 Arduino IDE 전용으로 사용했다.
7 segment의 특징
모든 LED가 그렇지만, 너무 높은 전압을 걸면 금방 타 버린다. LED가 밝게 빛났다가 다시는 켜지지 않는다면 LED가 탔다고 보면 된다. 꼭 적당한 저항을 걸어야 한다. 반드시 V=IR을 이용해서 필요한 저항을 미리 계산하고, 잘 모르겠다면 일단 큰 저항을 걸자. 너무 큰 저항은 말고.
저항은 모든 pin에 연결할 필요는 없다. digit pin에만 연결하면 된다.
회로 구성


가지고 있는 브레드보드의 넓이가 ESP32와 맞지 않아서 2개의 브레드보드를 연결하여 사용했다. 뒷면이 양면테이프로 되어 있는 브레드보드에서 전원 레일을 떼어내고 다른 브레드보드 옆에 붙였다.
사진상 pin이 잘 보이지 않는데, 똑같이 연결할 필요는 없다.
ESP32와 연결할 때에는 이 게시글을 참고하여 사용 가능한 pin에만 연결해야 한다. 7 segment와 연결할 때에는 판매처의 pin map을 보고 연결하면서, 7 segment의 어느 pin을 ESP32의 어느 pin과 연결했는지 기록해두는 것이 좋다. 나중에 코드를 짤 때 필요하다.
업로드한 코드
이 코드는 미리 설정한 4자리 숫자를 7 segment에 표시하는 코드이다.
이 코드를 사용하고 싶다면 2가지 부분을 수정해야 한다.
- segment와 연결된 pin number
- 표시하고자 하는 숫자
필요에 따라 Serial로 입력받은 숫자를 표시하도록 하거나, 3자리 이하 숫자를 표시할 수 있도록 기능을 추가해야 한다.
#include <Arduino.h>
const int LUT[10][8] = {
{0,0,0,0,0,0,1,1}, // 0 -> a, b, c, d, e, f 켜짐
{1,0,0,1,1,1,1,1}, // 1 -> b, c 켜짐
{0,0,1,0,0,1,0,1}, // 2 -> a, b, d, e, g 켜짐
{0,0,0,0,1,1,0,1}, // 3 -> a, b, c, d, g 켜짐
{1,0,0,1,1,0,0,1}, // 4 -> b, c, f, g 켜짐
{0,1,0,0,1,0,0,1}, // 5 -> a, c, d, f, g 켜짐
{0,1,0,0,0,0,0,1}, // 6 -> a, c, d, e, f, g 켜짐
{0,0,0,1,1,1,1,1}, // 7 -> a, b, c 켜짐
{0,0,0,0,0,0,0,1}, // 8 -> a, b, c, d, e, f, g 켜짐
{0,0,0,0,1,0,0,1} // 9 -> a, b, c, d, f, g 켜짐
};
const int pin[8] = {12, 27, 25, 13, 4, 14, 33, 26}; // 순서대로 a,b,c,d,e,f,g,dot과 연결된 pin
const int dig[4] = {16, 17, 5, 18}; // 순서대로 dig4, dig3, dig2, dig1과 연결된 pin
void show_digit(int digit, int number);
void setup() {
// put your setup code here, to run once:
for (int i=2;i<13;i++)
pinMode(i, OUTPUT);
}
int seg[4] = {1, 2, 3, 4}; // 표시하고자 하는 숫자
void loop() {
// put your main code here, to run repeatedly:
show_digit(1, seg[0]);
show_digit(2, seg[1]);
show_digit(3, seg[2]);
show_digit(4, seg[3]);
}
void show_digit(int digit, int number){
// 7 segment에 연결된 pin에 값을 보내는 함수
for (int d=0; d<4; d++){
if (d + 1 == digit) digitalWrite(dig[d], LOW);
else digitalWrite(dig[d], HIGH);
for (int i=0; i<8; i++){
digitalWrite(pin[i],LUT[number][i]);
}
}
}
마무리하며
segment가 잘 보이게 하려면 얇은 아크릴 판을 앞에 씌우는 게 좋을 것 같다. LED가 매우 밝아서 적당한 두께의 아크릴 판을 덮으면 오히려 숫자가 잘 보일 것 같다.
'Arduino & ESP32' 카테고리의 다른 글
아크릴 칼로 만능기판 잘라서 사용하기 (0) | 2024.08.08 |
---|
댓글