재료

  • 저항 2개
  • 아두이노 우노 1개
  • 푸시 버튼 1개
  • 점프 와이어 7개
  • USB 케이블 1개
  • LED 1개
  • 브래드 보드 1개

 이번 프로젝트에서는 앞선 프로젝트에서 스케치에 의해서 LED를 자동으로 조절했던 것과는 다르게, 버튼을 이용해서 LED를 조작할 수 있도록 해보겠습니다. 앞에서 진행했던 프로젝트를 이용해서 하는 거니까 어렵지 않으실 거에요.




STEP1. 준비물

아두이노 보드, USB 케이블, 브래드 보드, 푸시 버튼 1개, LED 1개, 저항 2개, 점프와이어 7개




STEP2. 회로도



STEP3. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const int LED=12;
const int BUTTON=13;
 
int push=0, state=0, beforeState=0;
 
void setup() {
  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  push=digitalRead(BUTTON);  
 
  if(push==HIGH && beforeState==LOW){
    state=1-state;
    delay(10); //바운싱 제거
  }
  beforeState=push;
 
  if(state==1){
    digitalWrite(LED, HIGH);
  }
  else{
    digitalWrite(LED, LOW);    
  }
}
cs

일반적인 코드와 다르게 이번 코드에서는 이전 state에 대한 결과를 저장하고 그 결과와 현재 state를 확인한 뒤에 LED를 조작하도록 되어있습니다. 이렇게 이전 state를 저장해놓은 이유는 아두이노가 빠르기 때문입니다. 아두이노는 1초에 16만개의 내부 명령어를 실행하도록 되어 있기 때문에, 만약 위의 코드처럼 이전 state를 저장해놓지 않으셨다면 버튼을 눌렀을 때 원하지 않은 결과를 얻을 수도 있습니다. 또한 18번째 라인에 바운싱 제거라는 주석을 달아놓은 것을 확인하실 수 있을텐데요, 바운싱은 버튼을 완전히 누르지 않았을 때 일어나는 가짜 신호와 같은데, 이것을 제거하지 않으면 버튼을 한 번밖에 누르지 않았는데에도 여러 번 누른 것처럼 되는 경우가 발생할 수 있습니다.


STEP4. 결과 확인



STEP5. 응용

 3장에서 진행하였던 7 segment 프로젝트에도 버튼을 이용하여 LED를 조절할 수 있습니다.

준비물은 아래와 같습니다. 이전에 사용했던 준비물에서 저항 한 개와 버튼 하나만 더 준비하면 됩니다.



이전 프로젝트의 회로도에서 아래와 같이 회로도에 버튼을 추가하시고,


다음과 같이 코드를 변경하시면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
const int a=9;
const int b=8;
const int c=2;
const int d=3;
const int e=7;
const int f=6;
const int g=4;
const int dot=5;
const int BUTTON=13;
 
int push=0, state=0, beforeState=0;
int num=0;
 
void display_7_segment(int num){
  switch(num){
    case 0: 
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 1:
      digitalWrite(a, HIGH);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 2:
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH);
      digitalWrite(dot, LOW);
      break;
    case 3:
      digitalWrite(a, LOW);
      digitalWrite(b, HIGH);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 4:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 5:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 6:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, HIGH);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 7:
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, HIGH);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 8:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    case 9:
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, HIGH);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
      digitalWrite(dot, LOW);
      break;
    default:
      break;
  }
}
 
void setup() {
  // put your setup code here, to run once:
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dot, OUTPUT);
  pinMode(BUTTON, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  push=digitalRead(BUTTON); //입력 값을 읽어 저장
  
  if(push==HIGH && beforeState==LOW){
    num++;
    display_7_segment(num%10);
    delay(10);
  }
  beforeState=push;
}
cs


아래와 같은 결과를 확인할 수 있습니다.  

마찬가지로 가운데 LED에 불이 들어오지는 않지만 버튼을 누를 때마다 숫자가 하나씩 증가하는 것을 확인할 수 있네요.



버튼을 이용하니 원할 때 원하는 결과를 확인할 수 있어서 더욱 편리하네요!

댓글 3

MADE BY

김민정

사물인터넷, 아두이노