이 튜토리얼에서는 ESP32 마이크로컨트롤러로 제어되는 7-세그먼트 디스플레이를 사용하여 디지털 카운터를 만듭니다. 카운터는 0에서 9까지 증가한 다음 다시 0으로 감소하여 카운팅 과정을 명확하게 보여줍니다. 또한 7-세그먼트 디스플레이에서 개별 세그먼트를 켜고 문자를 표시하는 방법도 살펴보겠습니다.
ESP32_Animte7Segment-segments
이 프로젝트는 74HC595 시프트 레지스터를 사용하여 디스플레이를 제어하므로 ESP32의 GPIO 핀을 너무 많이 사용하지 않고도 세그먼트를 효율적으로 관리할 수 있습니다. 시프트 레지스터에 이진 값을 보내면 해당 세그먼트에 불을 켜 숫자와 문자를 나타낼 수 있습니다. 이 과정을 더 깊이 이해하려면 비디오(비디오 03:15 부분)를 참조할 수 있습니다.
ESP32_Animte7Segment-letters
하드웨어 설명
이 프로젝트의 주요 구성 요소는 ESP32 마이크로컨트롤러, 74HC595 시프트 레지스터 및 7-세그먼트 디스플레이입니다. ESP32는 Wi-Fi와 Bluetooth 기능이 내장된 강력한 마이크로컨트롤러로 IoT 프로젝트에 적합합니다. 74HC595는 몇 개의 입력 핀만으로 여러 출력을 제어할 수 있게 해주는 시프트 레지스터입니다. 직렬 데이터를 받아 병렬 출력으로 변환하는 방식으로 작동하며, 7-세그먼트 디스플레이를 구동하는 데 완벽합니다.
7-세그먼트 디스플레이는 8자 모양으로 배열된 7개의 개별 LED로 구성됩니다. 각 세그먼트는 시프트 레지스터에 적절한 이진 값을 보내 켜거나 끌 수 있습니다. 예를 들어 숫자 0을 표시하려면 가운데 세그먼트(G)를 제외한 모든 세그먼트에 불을 켜야 합니다.
브레드보드 설정부터 시작하세요. 접지 레일(파란색 선)과 전원 레일(빨간색 선)을 연결하세요. 접지는 브레드보드 한쪽의 파란색 선에 연결하고, 전원은 반대쪽의 빨간색 선에 연결해야 합니다. 검은색 와이어로 ESP32의 접지를 접지 레일에 연결하고, 빨간색 와이어로 ESP32의 3.3V 핀을 전원 레일에 연결하세요.
다음으로 74HC595 시프트 레지스터를 브레드보드에 삽입하고 노치 방향이 올바른지 확인하세요. 핀 11(DS)을 ESP32의 핀 25에, 핀 12(SH_CP)를 핀 26에, 핀 14(ST_CP)를 핀 27에 연결하세요. 시프트 레지스터의 접지(핀 8)를 접지 레일에 연결하고 활성화를 위해 핀 10(MR)을 전원 레일에 연결하세요.
7-세그먼트 디스플레이의 경우 세그먼트(a-g)에 해당하는 핀을 시프트 레지스터의 출력 핀에 연결하세요. 전류를 제한하기 위해 각 세그먼트에 저항(220옴)을 직렬로 사용하세요. 디스플레이 유형에 따라 공통 핀이 공통 양극 또는 공통 음극일 수 있으므로 올바르게 연결했는지 확인하세요.
코드 예제 및 설명
setup 함수에서 시프트 레지스터에 연결된 핀을 출력으로 정의하는 것으로 시작합니다. 이렇게 하면 ESP32가 디스플레이로 전송되는 데이터를 제어할 수 있습니다.
여기서 STcp, SHcp, DS를 각각 시프트 레지스터의 ST_CP, SH_CP, DS에 연결된 핀으로 정의합니다. 이 핀들을 출력으로 설정하면 시프트 레지스터를 제어할 수 있습니다.
프로그램의 메인 루프는 0에서 9까지 카운트하며 shiftOut 함수를 사용하여 해당 값을 디스플레이로 보냅니다.
for(int num = 0; num <10; num++)
{
digitalWrite(STcp,LOW); //ST_CP를 접지하고 전송하는 동안 낮게 유지
shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
digitalWrite(STcp,HIGH); //ST_CP를 높여 데이터 저장
delay(1000);
}
이 루프는 num 변수를 증가시키며, datArray의 해당 값을 매초 디스플레이로 전송합니다. shiftOut 함수는 데이터를 시프트 레지스터로 전송하며, 이는 적절한 세그먼트를 켭니다.
시연 / 예상 결과
배선이 완료되고 코드가 업로드되면, 7세그먼트 디스플레이가 0부터 9까지 카운트하고, 잠시 멈춘 후 다시 0으로 카운트다운하는 것을 볼 수 있습니다. 각 숫자는 1초 동안 표시됩니다. 카운트 속도를 높이려면 루프의 지연 시간을 조정할 수 있습니다(비디오 15:30 참조).
세그먼트를 개별적으로 조작할 때는 문자나 특정 세그먼트를 표시하기 위해 올바른 이진 값을 보내야 합니다. 디스플레이가 어두워 보이면 각 세그먼트에 개별 저항을 추가하여 디스플레이 전체의 밝기를 일정하게 유지하는 것을 고려하세요.
809-ESP32 Tutorial 10/55 - Arduino code for 2.5 7 segment
언어: C++
const int STcp = 27;//ST_CP
const int SHcp = 26;//SH_CP
const int DS = 25; //DS
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void setup ()
{
//set pins to output
pinMode(STcp,OUTPUT);
pinMode(SHcp,OUTPUT);
pinMode(DS,OUTPUT);
}
void loop()
{
for(int num = 0; num <10; num++)
{
digitalWrite(STcp,LOW); //ground ST_CP and hold low for as long as you are transmitting
shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
delay(1000);
}
}