LED는 20mA 전류가 흘러야 하는데, 50.8mA가 흐름 ->과전류로 인해 LED고장날 수 있음
R = V / I
(R 저항, V 전압, I 전류)
양극에 저항을 연결한 경우
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
LED사용할 때 저항을 음극, 양극 모두에 사용할 수 있다.(저항은 위아래 없음)
LED를 가로로 꽂으면 안된다. 가로줄은 하나로 연결되어있기 때문에. 음극과 양극을 다른 번호에 꽂아주어야 함.
<잘못된 예시>
1. 브레드보드에 전원공급을 안해주었기 때문에 LED에 불이 안들어온다.
1-1. 해결법
2. abcde와 fghij는 다른 라인이기 때문에 LED에 불이 안들어온다.
2-1. 해결법
저항을 어디에 연결하느냐에 따라 종류가 달라진다.
풀업(pull-up)저항
저항을 전원에 직접 연결
풀다운(pull-down)저항
저항을 접지(GND)에 직접 연결
버튼을 눌렀을 때 LED를 밝히는거 : 풀다운 저항
버튼을 눌렀을 때 LED가 꺼지는거 : 풀업 저항
https://k96-ozon.tistory.com/59
[풀다운저항1]
//버튼을 누르면 불이 켜진다.
//꾹 누르고 있으면 불 켜진 상태가 유지되지만 버튼을 안누르고 있으면 꺼진다.
void setup()
{
pinMode(13, OUTPUT);
pinMode(7, INPUT);
}
void loop()
{
int button = digitalRead(7);
digitalWrite(13, button);
delay(10);
}
[풀다운저항1]에서 양극과 음극을 바꿔서 연결한다면? (코드동일)
-> 저항이 전원에 직접 연결되므로 풀업저항이 된다.
[풀업저항1]
실행 결과 : 전원이 계속 들어오고 있는 상태이므로 LED는 항상 켜져있고 버튼을 누른 경우 LED가 꺼진다.(버튼을 꾹 누르고 있어야 LED의 꺼진 상태가 유지됨)
Q1. 스위치에 저항이 없이 연결되어 있다면?
오류는 안나지만 아무리 버튼을 누른다 해도 LED가 반응하지 않는다.
Q2. 접지와의 연결을 끊은 경우에는?
전류가 흐르지 않으므로 버튼을 눌러도 아무런 반응이 없고 LED도 항상 꺼져있는 상태가 된다.(위와 같은 코드일 경우)
[Q1] 버튼을 눌러도 아무런 반응이 없다. LED는 켜진 상태
핀을 음극쪽에 꽂으면 불이 켜지지 않는다. 핀은 전류가 들어오는 +쪽에 꽂을 것
//슬라이드 스위치를 켜면 LED에 불이 들어온 상태가 유지된다.
void setup()
{
Serial.begin(9600); //시리얼 모니터 사용할거니까
pinMode(13, OUTPUT);
pinMode(7, INPUT);
}
void loop()
{
int button = digitalRead(7);
Serial.println(button);
if(button == HIGH) { //1이면
digitalWrite(13, HIGH); //LED on
}else { //0이면
digitalWrite(13, LOW); //LED off
}
}
아날로그 입력
- 포텐셔미터의 다이얼을 돌리면 포텐셔미터 내부의 저항이 변화하면서 가운데 다리(2)로 출력되는 전압이 변화
//포텐셔미터의 값을 조절해주면 조절한 값이 출력됨.(0~1023)
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
int button = analogRead(A0);
Serial.println(button);
delay(100);
}
아두이노는 0~5V 사이의 전압을 변화시켜 출력하는 능력이 없기 때문에 디지털 출력을 응용해서 구현함.
//다이얼을 돌리면 전압에 따라 LED밝기가 달라진다.
void setup()
{
Serial.begin(9600);
pinMode(11, OUTPUT);
}
void loop()
{
int button = analogRead(A0);
Serial.println(button);
analogWrite(11, button/4);
delay(100);
}
//13번은 깜빡거리고 있는 상태, 버튼을 빠르게 누르면 LED가 꺼지지 않음. 1초정도 꾹 누르고 있어야 그제서야 꺼짐.(13번은 계속 깜빡깜빡)
//버튼이 눌려지고 1초는 다른것들이 동작할 수 없음. 따라서 ditalRead()동작 못함
//delay가 너무 길면 내가 버튼 눌러도 수행이 잘 안될 수 있음
void setup()
{
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
pinMode(6, INPUT);
}
void loop()
{
int button = digitalRead(6);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(11, button);
delay(10);
}
delay가 너무 길면 내가 버튼을 눌러도 수행이 잘 안될 수 있다.
버튼이 눌려지고 1초동안은 다른 것들이 동작할 수 없다. 따라서 digitalRead()도 동작 못함.
millis()
//스위치가 눌려져도 13번은 멈추지 않고 깜빡이면서 LED는 꺼진다.
unsigned long previousTime = 0;
boolean isOn = false;
void setup()
{
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
pinMode(6, INPUT);
}
void loop()
{
unsigned long current = millis();
if (current > previousTime+1000){
if(isOn) {
digitalWrite(13, HIGH);
}else {
digitalWrite(13, LOW);
}
isOn = !isOn;
previousTime = current;
}
int button = digitalRead(6);
digitalWrite(11, button);
delay(10);
}
과제
// C++ code
//
unsigned long previousTime = 0;
boolean isOn = false;
void setup()
{
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, INPUT);
}
void loop()
{
unsigned long current = millis();
int dial = analogRead(A4);
int button = digitalRead(6);
if(button==HIGH){
if(current > previousTime+1000) {
if(isOn){
digitalWrite(10, HIGH);
}else {
digitalWrite(10, LOW);
}
isOn = !isOn;
previousTime = current;
}
}else{
digitalWrite(10, LOW);
}
analogWrite(11, dial);
}
아래와 같이 하면 다이얼 돌리면 바로 적용이 안된다. delay()때문에 delay(2000)두번 지나고 나서야 LED밝기가 변한다.
void setup()
{
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, INPUT);
}
void loop()
{
//unsigned long current = millis();
int dial = analogRead(A4);
int button = digitalRead(6);
analogWrite(11, dial);
if(button=HIGH){
digitalWrite(10, HIGH);
delay(2000);
digitalWrite(10, LOW);
delay(2000);
}else {
digitalWrite(10, LOW);
}
}