일반 주사위가 지겨워 아두이노로 디지털 주사위를 만들었습니다. 버튼을 누르면 "Rolling dice..." 메시지 후 4초 뒤 두 개의 랜덤 숫자(1~6)가 LCD에 표시됩니다. 간단하지만 아두이노 입문자에게 랜덤 함수, LCD 제어, 버튼 입력, 디바운스 기초를 익히기 좋은 프로젝트입니다.
회로 연결
LCD (HD44780 호환, 4비트 모드):
RS → 핀 7, EN → 핀 8, D4→9, D5→10, D6→11, D7→12
VSS→GND, VDD→5V, V0→가변저항 중간단 (대비 조절), RW→GND
백라이트 A→5V (저항 직렬 권장), K→GND
버튼 (쇼크 센서 핀으로 연결됨): 핀 2 → 버튼 한 쪽, 다른 쪽 → GND (내부 풀업 사용)
내장 LED: 핀 13 (주사위 굴릴 때 깜빡임용)
전체 코드 (주석 추가 및 정리)
#include <LiquidCrystal.h>
// LCD 핀: RS, EN, D4, D5, D6, D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// 커스텀 문자: 주사위 모양 아이콘
byte diceChar[] = {
B00000,
B00000,
B11111,
B11001,
B10101,
B10011,
B11111,
B00000
};
const int LED_PIN = 13;
const int BUTTON_PIN = 2; // 원본 'Shock' 핀 → 버튼으로 변경
long randNumber;
int buttonState;
void setup() {
lcd.begin(16, 2);
lcd.createChar(0, diceChar); // 커스텀 문자 0번 슬롯에 저장
lcd.home();
lcd.write(byte(0));
lcd.print("Digital Dice");
lcd.write(byte(0));
delay(1000);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // 내부 풀업 활성화
randomSeed(analogRead(0)); // 아날로그 노이즈로 시드 초기화
}
void loop() {
// 버튼 눌림 감지 (LOW = 눌림, 내부 풀업 사용)
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
lcd.clear();
lcd.print("Rolling dice...");
digitalWrite(LED_PIN, HIGH);
delay(4000); // 4초간 애니메이션 느낌
digitalWrite(LED_PIN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
randNumber = random(1, 7); // 1~6
lcd.print("Dice 1 = ");
lcd.print(randNumber);
lcd.setCursor(0, 1);
randNumber = random(1, 7);
lcd.print("Dice 2 = ");
lcd.print(randNumber);
}
delay(150); // 간단한 디바운스 겸 루프 지연
}
코드 설명
LiquidCrystal 라이브러리로 4비트 모드 LCD 제어
createChar()로 주사위 모양 커스텀 문자 생성
randomSeed(analogRead(0))로 난수 시드 초기화 (부동 핀 노이즈 활용)