아두이노

  • Button_Led

3색 신호등 프로젝트

  • 주제 : 3색 신호등 만들기

  • 요구사항 명세

  • 동작

신호등은 기기 관리자의 선택에 따라 세가지 상태으로 동작한다. 일반적인 교통 신호 상태, 차량을 천천히 가도록 하는 노랑점멸, 차량이 반드시 멈추고 주변을 살핀 후 통과하도록 하는 빨강 점멸 상태이다. 각 상태별 동작은 다음과 같다.

□ 일반: 초록 점멸(1초 유지 후 꺼짐) → 노랑 점멸(0.5초 유지 후 꺼짐) → 빨강 점멸(1초 유지 후 꺼짐)

□ 노랑점멸: 노랑만 0.5초 간격으로 점멸한다. 초록,빨강은 끈다.

□ 빨강점멸: 빨강만 0.5초 간격으로 점멸한다. 초록,노랑은 끈다.


  • 입력 : 3개의 푸쉬 버튼 스위치로 ON/OFF

  • 출력 : 녹색, 노랑, 빨강의 LED


■ 신호 상태

일반

노랑점멸

빨강점멸

■ 신호등 회로 구성도

■ 신호등 회로 테스트

각 버튼으로 LED를 켜고 끄도록 코드를 작성하여 테스트

■ 신호등 회로 테스트 소스 코드

/* 신호등 회로 테스트

기능 : 세 개의 버튼으로 세 개의 LED를 각각 제어한다.

YunKyuSung@KNUE 2020.8.4. GNU.

*/

#define LED_G_PIN 8

#define LED_Y_PIN 9

#define LED_R_PIN 10


#define BTN1_PIN 2

#define BTN2_PIN 3

#define BTN3_PIN 4


void setup() {

pinMode(LED_G_PIN, OUTPUT);

pinMode(LED_Y_PIN, OUTPUT);

pinMode(LED_R_PIN, OUTPUT);

pinMode(BTN1_PIN, INPUT_PULLUP);

pinMode(BTN2_PIN, INPUT_PULLUP);

pinMode(BTN3_PIN, INPUT_PULLUP);

}


void loop() {


// 버튼으로 LED 제어: BTN1 - LED_G, BTN2 - LED_Y, BTN3 - LED_R

if (digitalRead(BTN1_PIN) == LOW) // BTN1 누르면

digitalWrite(LED_G_PIN, HIGH);

else

digitalWrite(LED_G_PIN, LOW);


if (digitalRead(BTN2_PIN) == LOW) // BTN2 누르면

digitalWrite(LED_Y_PIN, HIGH);

else

digitalWrite(LED_Y_PIN, LOW);


if (digitalRead(BTN3_PIN) == LOW) // BTN3 누르면

digitalWrite(LED_R_PIN, HIGH);

else

digitalWrite(LED_R_PIN, LOW);

}


■ 플로팅 현상과 풀업/풀다운 저항 [바로 가기]

Easy Module Shield Test

Easy Module Shield Test 자료 [다운로드]

LED Module 활용한 제어문-반복문 학습

소스코드

// 제어,반복문 학습 예제

// 회로 구성 : D1~D13까지 LED bar module 연결 D7은 GND

// 2020.9.15. yunkyusng@KNUE. GNU.


int L[12] = {1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13}; // D7은 공통GND용

int dTime = 50;


void setup() {

for (int i = 1; i < 14; i++) { // 핀모드 셋업

pinMode(i, OUTPUT);

digitalWrite(i, LOW);

}

}


void loop() {


#if 1

//[과제1] 위/아래로 쌓기

upStack(); // 1 -> 13 위로 쌓기(up stack)

allClear();

downStack(); // 1 <- 13 아래로 쌓기(down stack)

allClear();


//[과제2]위/아래로 하나씩 점멸(2회 반복)

for (int k = 0; k < 2; k++) {

upBlink(); // 1 -> 13 위로 하나씩 점멸(up blink)

downBlink(); // 1 <- 13 아래로 하나식 점멸(down blink)

}


//[과제3] 안으로/밖으로 하나씩 점멸(2회 반복)

for (int k = 0; k < 2; k++) {

innerBlink(); // 1 -> 6 8 <- 13 밖에서 안으로 하나씩 점멸(to center blink)

outerBlink(); // 1 <- 6 8 -> 13 안에서 밖으로 하나씩 점멸(to outer blink)

}


////[과제4] 아래로/위로 날아가서 쌓기

flyDownStack(12); // 아래로 날아가서 12개 쌓기(fly down stack)

delay(500); allClear();

flyUpStack(); // 위로 날아가서 쌓기(fly up stack)

delay(500); allClear();


//[과제5] 홀/짝 번갈아 점멸(10회)

alterBlink(10); // 홀,짝 번갈아 10회 점멸(odd even alternating blink)

allClear();


#endif


#if 1

//[추가1] 6개 쌓고 하나씩 위로 데려가기

flyDownStack(6); // 아래로 날아가서 12개 쌓기(fly down stack)

delay(500);

takeOutUp(); // 하나씩 위로 데려가기(take out upward)

#endif


delay(1000);


}//loop


// 1 -> 13 위로 쌓기(up stack)

void upStack() {

for (int i = 0; i < 12; i++) {

digitalWrite(L[i], HIGH);

delay(dTime);

}

}


// 1 <- 13 아래로 쌓기(down stack)

void downStack() {

for (int i = 11; i >= 0; i--) {

digitalWrite(L[i], HIGH);

delay(dTime);

}

}


// 1 -> 13 위로 하나씩 점멸(up blink)

void upBlink() {

for (int i = 0; i < 12; i++) {

digitalWrite(L[i], HIGH);

delay(dTime);

digitalWrite(L[i], LOW);

}

}


// 1 <- 13 아래로 하나씩 점멸(down blink)

void downBlink() {

for (int i = 11; i >= 0; i--) {

digitalWrite(L[i], HIGH);

delay(dTime);

digitalWrite(L[i], LOW);

}

}


// 1 -> 6 8 <- 13 밖에서 안으로 하나씩 점멸(to center blink)

void innerBlink() {

for (int i = 0; i < 6; i++) {

digitalWrite(L[i], HIGH);

digitalWrite(L[11 - i], HIGH);

delay(dTime);

digitalWrite(L[i], LOW);

digitalWrite(L[11 - i], LOW);

}

}


// 1 <- 6 8 -> 13 안에서 밖으로 하나씩 점멸(to outer blink)

void outerBlink() {

for (int i = 5; i >= 0; i--) {

digitalWrite(L[i], HIGH);

digitalWrite(L[11 - i], HIGH);

delay(dTime);

digitalWrite(L[i], LOW);

digitalWrite(L[11 - i], LOW);

}

}


// 아래로 날아가서 쌓기(fly down stack)

void flyDownStack(int n) {

for (int i = 0; i < n; i++) {

for (int j = 11; j > i; j--) {

digitalWrite(L[j], HIGH);

delay(10 * i);

digitalWrite(L[j], LOW);

}

digitalWrite(L[i], HIGH);

delay(dTime);

}

}


// 위로 날아가서 쌓기(fly up stack)

void flyUpStack() {

for (int i = 11; i >= 0; i--) {

for (int j = 0; j < i; j++) {

digitalWrite(L[j], HIGH);

delay(110 - 10 * i);

digitalWrite(L[j], LOW);

}

digitalWrite(L[i], HIGH);

delay(dTime);

}

}


// 홀,짝 번갈아 cnt회 점멸(odd even alternating blink)

void alterBlink(int cnt) {

for (int i = 0; i < (cnt * 2); i++) {

for (int j = 0; j < 11; j += 2) {

digitalWrite(L[j], i % 2);

digitalWrite(L[j + 1], !(i % 2));

}

delay(dTime * 2);

}

}


// 하나씩 위로 데려가기(take out upward)

void takeOutUp() {

for (int j = 5; j >= 0; j--) {

for (int k = 11; k > j; k--) { // 데리러 가기

digitalWrite(L[k], HIGH);

delay(dTime);

digitalWrite(L[k], LOW);

}


for (int l = j; l < 11; l++) { // 데리고 가기

digitalWrite(L[l], HIGH);

digitalWrite(L[l + 1], HIGH);

delay(dTime);

digitalWrite(L[l], LOW);

digitalWrite(L[l + 1], LOW);

}

digitalWrite(L[11], HIGH); // 사라질 때 마지막 LED 보이기

delay(dTime);

digitalWrite(L[11], LOW);

delay(dTime * 4);

}

}


// 모든 LED 끄기(all LEDs off)

void allClear() {

for (int i = 0; i < 12; i++) {

digitalWrite(L[i], LOW);

}

}

LED Level Meter

소스코드

// LED level meter : 가변저항에 따라 led 켜지는 개수 제어


int L[12] = {1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13}; // D7은 공통GND용

int readValue;


void setup() {

for (int i = 1; i < 14; i++) { // 핀모드 셋업

pinMode(i, OUTPUT);

digitalWrite(i, LOW);

}

}


void loop() {

readValue = analogRead(A0);

LevelMeter(readValue);

}


// 입력값에 따라 LED 켜지는 개수 제어

void LevelMeter(int val) {

int Level = int(val / 79); // 1023/13 = 78.7(약79)

allClear(); // LED 모두 끄기

for (int i = 0; i < Level; i++) // 레벨만큼 켜기

digitalWrite(L[i], HIGH);

}


// LED 모두 끄기

void allClear(){

for (int i = 0; i < 12; i++)

digitalWrite(L[i], LOW);

}