ESP32 튜토리얼 33/55 - SunFounder의 ESP32 IoT 학습 키트를 사용한 디지털 주사위
이 튜토리얼에서는 SunFounder의 IoT 학습 키트에 포함된 ESP32와 7세그먼트 디스플레이를 사용하여 디지털 주사위를 만들어 보겠습니다. 이 프로젝트를 통해 버튼을 누르면 1부터 6까지의 숫자를 생성하는 가상 주사위를 굴릴 수 있습니다. 이는 디스플레이 및 버튼 인터페이스에 대해 배우면서 ESP32의 기능을 탐구할 수 있는 훌륭한 방법입니다. 더 자세한 내용은 비디오(0:00 부분)를 확인하세요.
하드웨어 설명
이 프로젝트의 주요 구성 요소는 ESP32 마이크로컨트롤러, 74HC595 시프트 레지스터, 7세그먼트 디스플레이 및 푸시 버튼입니다. ESP32는 Wi-Fi와 Bluetooth를 통합한 강력한 마이크로컨트롤러로 IoT 애플리케이션에 적합합니다. 74HC595 시프트 레지스터를 사용하면 각 세그먼트를 직접 연결하는 것보다 더 적은 핀으로 7세그먼트 디스플레이를 제어할 수 있습니다.
7세그먼트 디스플레이는 숫자를 표시하며 시프트 레지스터에서 데이터를 보내 제어됩니다. 푸시 버튼은 주사위 굴림을 트리거하여 표시될 난수를 생성하는 데 사용됩니다. 버튼을 누르면 ESP32의 핀 13에 연결되며, 이 핀에는 내부 풀업 저항이 있어 누르지 않았을 때 높은 상태를 유지합니다.
데이터시트 세부 정보
| 제조업체 | Texas Instruments |
|---|---|
| 부품 번호 | 74HC595 |
| 로직/IO 전압 | 2 V ~ 6 V |
| 공급 전압 | 4.5 V ~ 5.5 V |
| 출력 전류(채널당) | 최대 6 mA |
| 피크 전류(채널당) | 최대 35 mA |
| PWM 주파수 가이드 | 해당 없음 |
| 입력 로직 임계값 | VIH ≥ 2 V, VIL ≤ 0.8 V |
| 전압 강하 / RDS(on) / 포화 | 최대 0.5 V |
| 열 제한 | 150 °C |
| 패키지 | DIP-16 |
| 참고 사항 / 변형 | 디지털 디스플레이에 일반적으로 사용됨 |
- 안정적인 작동을 위해 적절한 전압 레벨(4.5 V ~ 5.5 V)을 유지하세요.
- 시프트 레지스터 손상을 방지하기 위해 출력 전류를 제한하세요.
- 전압을 안정화하려면 전원 핀 근처에 디커플링 커패시터를 사용하세요.
- 숫자가 잘못 표시되지 않도록 7세그먼트 디스플레이를 올바르게 연결하세요.
- 예기치 않은 동작을 유발할 수 있는 느슨한 연결이 없는지 배선을 확인하세요.
배선 지침

디지털 주사위를 배선하려면 먼저 전원 연결을 설정하세요. 브레드보드의 접지(파란색 선)를 ESP32의 접지 핀에 연결하고 모든 접지 지점이 서로 연결되어 있는지 확인하세요. 다음으로 ESP32의 3.3V 핀을 브레드보드의 전원 레일(빨간색 선)에 연결하세요.
74HC595 시프트 레지스터의 경우 핀 1이 3.3V 레일에 연결되고 핀 8이 접지에 연결되었는지 확인하세요. 데이터 출력 핀(DS)을 ESP32의 핀 25에, 시프트 클록 핀(SHCP)을 핀 26에, 스토리지 클록 핀(STCP)을 핀 27에 연결하세요. 푸시 버튼은 ESP32의 핀 13과 접지 사이에 연결하여 누르면 핀이 낮아지도록 해야 합니다.
코드 예제 및 설명
코드에서 먼저 시프트 레지스터와 버튼에 사용되는 핀을 정의합니다. 버튼 핀은 buttonPin으로 정의되며 ESP32의 핀 13으로 설정됩니다. 데이터 배열 datArray에는 7세그먼트 디스플레이용 숫자 0-9의 이진 표현이 포함되어 있습니다.
const int STcp = 27;//ST_CP
const int SHcp = 26;//SH_CP
const int DS = 25; //DS
const int buttonPin = 13;
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
setup() 함수에서 버튼 핀을 입력 모드로 설정하고 시프트 레지스터 핀을 출력 모드로 설정합니다. 이는 버튼에서 입력을 읽고 디스플레이로 데이터를 보내기 위한 핀을 준비합니다.
void setup ()
{
pinMode(buttonPin,INPUT);
pinMode(STcp,OUTPUT);
pinMode(SHcp,OUTPUT);
pinMode(DS,OUTPUT);
}
프로그램의 주요 로직은 loop() 함수에 있습니다. 버튼이 눌렸는지 확인하고 난수를 생성한 다음 show_number() 함수를 호출하여 7세그먼트 디스플레이에 숫자를 표시합니다.
void loop()
{
if(digitalRead(buttonPin) == LOW)
{
int diceNumber = random(1, 7);
show_number(diceNumber);
delay(50);
}
}
show_number() 함수는 데이터 배열에서 적절한 값을 시프트 레지스터로 보내며, 시프트 레지스터는 디스플레이의 세그먼트를 제어하여 생성된 숫자를 표시합니다. 이 함수는 버튼을 눌렀을 때 시각적 피드백을 제공하는 데 중요합니다.
시연 / 기대 효과
설정이 완료되고 코드가 업로드되면, 버튼을 누를 때마다 1에서 6 사이의 난수가 생성되어 7-세그먼트 디스플레이에 표시됩니다. 모든 배선이 올바르게 연결되었다면, 버튼을 누를 때마다 디스플레이에 숫자가 표시되어야 합니다. 플로팅 입력에 주의하세요. 버튼이 접지에 제대로 연결되어 있지 않으면 불규칙한 동작이 발생할 수 있습니다(비디오 1:30 참조).
비디오 타임스탬프
- 00:00 시작
- 1:48 프로젝트 소개
- 3:40 디지털 주사위 배선 설명
- 13:16 디지털 주사위 Arduino 코드 설명
- 19:19 Arduino IDE에서 ESP32 보드 및 COM 포트 선택
- 21:00 디지털 주사위 시연
- 22:15 Arduino 코드 수정
// Define the pins used for the 74hc595 and button
const int STcp = 27;//ST_CP
const int SHcp = 26;//SH_CP
const int DS = 25; //DS
const int buttonPin = 13;
// Define an array of values to display numbers on a 7-segment display
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int buttonState = false;
void setup ()
{
// Set the button pin to input mode
pinMode(buttonPin,INPUT);
//Set pins to 74hc595
pinMode(STcp,OUTPUT);
pinMode(SHcp,OUTPUT);
pinMode(DS,OUTPUT);
}
void loop()
{
// Check if the button is pressed
if(digitalRead(buttonPin) == LOW)
{
// Generate a random number between 1 and 6
int diceNumber = random(1, 7);
// Display the number on the 7-segment display
show_number(diceNumber);
// Delay for 50 milliseconds
delay(50);
}
}
// Function to display a number on a 7-segment display
void show_number(int num)
{
// Ground ST_CP and hold low for as long as you are transmitting
digitalWrite(STcp, LOW);
// Send the data for the number to the shift register
shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
// Pull the ST_CP to save the data
digitalWrite(STcp, HIGH);
}
Common Course Links
Common Course Files
자원 및 참고자료
-
문서화ESP32 Tutorial 33/55- SunFounder doc page for digital dicedocs.sunfounder.com
파일📁
파일이 없습니다.