아두이노 시프트 레지스터로 화려한 라이트 시퀀스 만들기
부품 및 소모품
| 부품 | 수량 |
| 아두이노 우노 | 1 |
| 브레드보드 (일반) | 2 |
| 점퍼 와이어 (일반) | 55 |
| 74HC595 시프트 레지스터 | 1 |
| 버튼 | 4 |
| 로터리 포텐쇼미터 (일반) | 1 |
| LED (일반) | 8 |
| 저항 220옴 | 9 |
| 저항 10k옴 | 4 |
필요한 도구
앱 및 온라인 서비스
프로젝트 소개
시프트 레지스터와 LCD 화면을 활용해 코드를 직접 수정하지 않고도 라이트 애니메이션을 생성하고 수정할 수 있는 프로그램을 만들었습니다. 4개의 버튼(1~4번)을 통해 메뉴 탐색과 변수 변경을 할 수 있습니다.
- 버튼 1: 값 증가 / LED 상태 HIGH로 설정
- 버튼 2: 값 감소 / LED 상태 LOW로 설정
- 버튼 3: 프레임 제작 중 커서 뒤로 이동
- 버튼 4: '뒤로 가기' 기능
애니메이션 속도와 반복 횟수를 조절할 수 있으며, 코드 상단의 ARR_SIZE 값을 변경해 프레임 수를 조정할 수 있습니다.
코드
아래 코드를 아두이노에 업로드하고 배선이 올바르다면 바로 작동합니다.
#include <LiquidCrystal.h>
#define ARR_SIZE 16 // 프레임 수 변경 가능
#define LIGHTS 8
const int btn1 = 7, btn2 = 8, btn3 = 9, btn4 = 10;
int bs1 = 0, bs2 = 0, bs3 = 0, bs4 = 0;
const int latchPin = 11;
const int clockPin = 13;
const int dataPin = 12;
byte data;
bool ArrOne[ARR_SIZE][LIGHTS] = {false};
byte lightArrOne[ARR_SIZE] = {0xFF};
int animSpeed = 50;
int loopCount = 5;
const int rs = 15, en = 14, d4 = 3, d5 = 4, d6 = 5, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
pinMode(btn4, INPUT_PULLUP);
lcd.begin(16, 2);
pinMode(latchPin, OUTPUT);
PrintMenu();
}
void loop() {
bs1 = digitalRead(btn1);
bs2 = digitalRead(btn2);
bs3 = digitalRead(btn3);
bs4 = digitalRead(btn4);
if (bs1 == HIGH) { bs1 = LOW; delay(150); Play(); }
else if (bs2 == HIGH) { bs2 = LOW; delay(150); Create(ArrOne); }
else if (bs3 == HIGH) { bs3 = LOW; delay(150); SetSpeed(); }
else if (bs4 == HIGH) { bs4 = LOW; delay(150); SetLoop(); }
PrintMenu();
delay(150);
}
// 메뉴 출력, 프레임 생성, 속도/루프 설정, 애니메이션 재생 등
// 상세 함수는 원본 코드 참조
회로도
회로도 이미지를 참고해 배선하세요. 저항 길이 제한으로 실제 조립보다 여유 있게 그려져 있으니, 직접 조립 시 더 깔끔하게 정리해보세요.