Search Code

ESP32 튜토리얼 10/55 - 세그먼트 디스플레이 74HC595를 사용한 디지털 카운터 - ESP32 IoT 학습 키트

ESP32 튜토리얼 10/55 - 세그먼트 디스플레이 74HC595를 사용한 디지털 카운터 - ESP32 IoT 학습 키트

이 튜토리얼에서는 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_Animte7Segment-counter-up-down
ESP32_Animte7Segment-counter-1

데이터시트 세부 정보

제조업체 Texas Instruments
부품 번호 74HC595
로직/IO 전압 2 V ~ 6 V
공급 전압 2 V ~ 6 V
출력 전류(채널당) 6 mA
피크 전류(채널당) 35 mA
PWM 주파수 가이드 최대 1 kHz
입력 로직 임계값 0.3 VCC ~ 0.7 VCC
전압 강하 / RDS(on) / 포화 최대 0.2 V
열 제한 125 °C
패키지 DIP-16
참고 사항 / 변형 다양한 패키지로 제공됨

 

  • 적절한 전압 공급(2 V ~ 6 V)을 확인하세요.
  • 과열을 방지하기 위해 출력 전류를 제한하세요.
  • 최적의 밝기를 위해 각 세그먼트에 별도의 저항을 사용하세요.
  • 단락 및 잘못된 연결을 피하기 위해 배선에 주의하세요.
  • 잘못된 구성을 피하기 위해 핀 배치를 주의 깊게 따르세요.

배선 지침

ESP32-10-seven-segment-wiring

브레드보드 설정부터 시작하세요. 접지 레일(파란색 선)과 전원 레일(빨간색 선)을 연결하세요. 접지는 브레드보드 한쪽의 파란색 선에 연결하고, 전원은 반대쪽의 빨간색 선에 연결해야 합니다. 검은색 와이어로 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가 디스플레이로 전송되는 데이터를 제어할 수 있습니다.

void setup ()
{
  //set pins to output
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}

여기서 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 참조).

세그먼트를 개별적으로 조작할 때는 문자나 특정 세그먼트를 표시하기 위해 올바른 이진 값을 보내야 합니다. 디스플레이가 어두워 보이면 각 세그먼트에 개별 저항을 추가하여 디스플레이 전체의 밝기를 일정하게 유지하는 것을 고려하세요.

비디오 타임스탬프

  • 00:00 시작
  • 1:53 7세그먼트 소개
  • 4:38 배선 설명
  • 13:15 Arduino 코드-1
  • 17:01 COM 포트 및 ESP32 보드 선택
  • 18:43 시연-1
  • 20:13 한 자리만 표시
  • 21:38 증가/감소 카운터
  • 23:07 각 세그먼트 켜기/끄기
  • 24:53 A, B, C, D, E, F 표시

이미지

ESP32_Animte7Segment-counter-1
ESP32_Animte7Segment-counter-1
ESP32_Animte7Segment-counter-up-down
ESP32_Animte7Segment-counter-up-down
ESP32_Animte7Segment-letters
ESP32_Animte7Segment-letters
ESP32_Animte7Segment-segments
ESP32_Animte7Segment-segments
ESP32-10-seven-segment-schematic
ESP32-10-seven-segment-schematic
ESP32-10-seven-segment-wiring
ESP32-10-seven-segment-wiring
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);
  }
}

자원 및 참고자료

파일📁

파일이 없습니다.