[1] LED제어3
1. Push button 구조
- 구조는 아래와 같고, 버튼을 누르면 a쪽과 b쪽이 연결된다.
2. 플로팅 현상
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gu04005&logNo=221235520661
Arduino) 풀다운 저항, 풀업 저항, 플로팅 현상 이해하기
오늘도 어김없이 방문해주신 여러분 안녕하세요 드미입니드아아아아아앗! 오우예스! 오늘은 쉬어가는타임으...
blog.naver.com
- 다음과 같이 회로 구성하고, 코드를 짠 상태에서 시리얼 모니터를 보면, 0과 1이 제멋대로 찍힌다.
- 주변 회로 등 주변 환경에 영향을 받아, 핀에 입력되는 전압이 0~5V를 왔다갔다 하게되어 발생한다.
- 이를 플로팅 현상이라고 한다.
- 이를 해결하기 위해서, 핀에 입력되는 전압을 고정시켜주는 작업이 필요하다.
- 그 작업은 풀다운 혹은 풀업 저항을 추가하여 주는 것
int push_btn =12;
int btn_state = 0; // 버튼의 현재 상태값을 저장하는 변수 => 0,1
void setup() {
Serial.begin(9600);
pinMode(push_btn, INPUT); //디지털 신호를 읽기 위해 핀모드를 설정
}
void loop() {
delay(1000);
// 입력핀으로 설정한 12번 핀의 입력된 현재 값을 읽어서 btn_state에 저장하기
btn_state = digitalRead(push_btn);
Serial.println(btn_state);
}
3. 풀다운 저항
- 위 회로에 풀다운 저항을 추가하면 다음과 같다.
- 이렇게 연결하면, 버튼을 안 눌렀을 때는 0이 정상적으로 나오고, 버튼을 눌렀을 때만 1이 나오게 된다.
4. 풀다운 방식 + LED제어 예제1
- 풀다운 방식으로 스위치를 연결해서 입력값을 읽고, 읽은 입력값을 출력해서 LED를 켜보자.
- 하나의 보드와 하나의 브래드보드에 연결했지만, 실제론 버튼 디바이스, LED 디바이스가 별도로 있다고 생각
- LED도 풀다운 방식으로 연결 : (+)를 입력핀, (-)를 GND에 연결
1) CODE
// push_btn_led_exam1
// push버튼을 누르면 led가 켜지도록 작성
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;
void setup() {
Serial.begin(9600);
pinMode(push_btn, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
delay(100);
btn_state = digitalRead(push_btn);
digitalWrite(led, btn_state);
Serial.println(btn_state);
if(btn_state==HIGH){
Serial.println("push버튼을 누름");
}else{
Serial.println("push버튼을 해제");
}
}
2) 회로 모델
3) 동작
5. 풀다운 방식 + LED제어 예제2
- 4.의 회로 그대로 사용하고, 버튼을 누르면 켜진 상태로 유지하고, 다시 누르면 꺼진 상태로 유지하도록 코드 수정
1) CODE
① 버튼 누르고 있어도 변하지 않도록 하는 방법1
- 무한루프 사용 --> while(digitalRead(push_btn)){ }
// push_btn_led_exam2
// push버튼을 누르면 led가 켜지고, 다시 누르면 led가 꺼지도록
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;
int led_state = 0;
void setup() {
Serial.begin(9600);
pinMode(push_btn, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
delay(100);
btn_state = digitalRead(push_btn);
Serial.println(btn_state);
if(btn_state==HIGH){
Serial.println("push버튼을 누름");
if(led_state==0){
digitalWrite(led, HIGH);
led_state = 1;
Serial.println("led_on:"+(String)led_state);
}else{
digitalWrite(led, LOW);
led_state = 0;
Serial.println("led off:"+(String)led_state);
}
}
while(digitalRead(push_btn)){} // 버튼을 누르고 있는 경우 변하지 않도록
}
② 버튼 누르고 있어도 변하지 않도록 하는 방법2
- 이전 버튼 상태를 저장
- btn_state_pre 변수에 btn_state의 이전 loop에서의 상태를 저장
- btn_state_pre 가 LOW(0) 이면, 이전 loop에서 버튼이 눌리지 않은 상태이므로 이번 loop에서 LED ON/OFF
- btn_state_pre 가 HIGH(1) 이면, 이전 loop에서 버튼이 눌렸던 상태이므로 이번 loop에서 LED ON/OFF X
// push_btn_led_exam2
// push버튼을 누르면 led가 켜지고, 다시 누르면 led가 꺼지도록
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;
int btn_state_pre = 0; // btn의 이전 loop에서의 상태를 저장
int led_state = 0;
void setup() {
Serial.begin(9600);
pinMode(push_btn, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
delay(100);
btn_state = digitalRead(push_btn);
Serial.println(btn_state);
if(btn_state_pre!=HIGH){
if(btn_state==HIGH){
Serial.println("push버튼을 누름");
if(led_state==0){
digitalWrite(led, HIGH);
led_state = 1;
Serial.println("led_on:"+(String)led_state);
}else{
digitalWrite(led, LOW);
led_state = 0;
Serial.println("led off:"+(String)led_state);
}
}
}
btn_state_pre = btn_state;
}
2) 동작
6. 풀업 저항
- 풀다운 저항과 반대로, 버튼을 누르면 0, 누르지 않으면 1을 읽어온다.
int push_btn =12;
int btn_state = 0; // 버튼의 현재 상태값을 저장하는 변수 => 0,1
void setup() {
Serial.begin(9600);
pinMode(push_btn, INPUT); //디지털 신호를 읽기 위해 핀모드를 설정
}
void loop() {
delay(1000);
// 입력핀으로 설정한 12번 핀의 입력된 현재 값을 읽어서 btn_state에 저장하기
btn_state = digitalRead(push_btn);
Serial.println(btn_state);
if(btn_state==HIGH){
Serial.println("push버튼을 해제");
}else{
Serial.println("push버튼을 누름");
}
}
7. 풀업/풀다운 방식 스위치 + LED 제어 예제
- 스위치 2개, LED 1개로 작업
- 스위치1은 풀업 방식, 스위치2는 풀다운 방식으로 연결
- 스위치1을 누르면 LED가 켜지고, 스위치2를 누르면 LED가 꺼지도록 구현
- LED가 켜지고 꺼지는 것은 함수로 구현
1) CODE
// push_btn_led_exam3
// 스위치 2개, led 1개를 이용해서 작업
// - 스위치1 : 풀업 방식 연결
// - 스위치2 : 풀다운 방식 연걸
// - 스위치1을 누르면 led가 켜지고, 스위치2를 누르면 led가 꺼지도록 구현
// led가 켜지고 꺼지는 것은 함수로 구현
int push_btn1 = 12;
int push_btn2 = 11;
int led_pin = 8;
int btn1_state = 0;
int btn2_state = 0;
void setup() {
Serial.begin(9600);
pinMode(push_btn1, INPUT);
pinMode(push_btn2, INPUT);
pinMode(led_pin, OUTPUT);
}
void loop() {
delay(100);
btn1_state = digitalRead(push_btn1);
btn2_state = digitalRead(push_btn2);
Serial.println("push_btn1: "+(String)btn1_state);
Serial.println("push_btn2: "+(String)btn2_state);
if(btn1_state==LOW){
led_on(led_pin);
}
if(btn2_state==HIGH){
led_off(led_pin);
}
}
// LED ON
void led_on(int pin){
digitalWrite(pin, HIGH);
}
// LED OFF
void led_off(int pin){
digitalWrite(pin, LOW);
}
2) 회로
3) 동작
- 끝 -
'프로젝트형 IoT 서비스 개발 4회차 > 2. 엣지 디바이스 제어' 카테고리의 다른 글
[Day41] 2022-03-28(월) 아두이노6 - RGB LED, 서보모터, 초음파센서 - 김서연 강사님 (0) | 2022.03.28 |
---|---|
[Day40] 2022-03-25(금) 아두이노5 - 채터링, 아날로그 입출력, RGB LED 설명 - 김서연 강사님 (4) | 2022.03.25 |
[Day38] 2022-03-23(수) 아두이노3 - C언어 기초2, LED제어2 - 김서연 강사님 (0) | 2022.03.23 |
[Day37] 2022-03-22(화) 아두이노2 - C언어 기초1, LED제어1 - 김서연 강사님 (0) | 2022.03.22 |
[Day36] 2022-03-21(월) 아두이노1 - 아두이노 설치/세팅/기본사용법, 시리얼 포트 - 김서연 강사님 (2) | 2022.03.21 |