[WinForms / 아두이노] (디지털 입력) LED 제어, 푸시 버튼을 슬라이드 스위치처럼

00·2025년 2월 15일

프로젝트

목록 보기
10/14

개요

푸시 버튼을 슬라이드 스위치처럼 작동하게 스케치 코드 수정

푸시버튼은 누르는 동안 상태가 변경되었다 떼면 원래의 상태로 되돌아가고, 슬라이드 스위치는 스위치를 움직일 때마다 변경된 상태를 계속 유지한다. 따라서 푸시버튼을 슬라이드 스위치로 변경하지 않고, 스케치 코드만 수정해서 푸시버튼을 슬라이드 스위치처럼 동작하도록 만들어보려고 한다.


아두이노 회로

스케치 코드

// c# code
//

int flag = 0; // 버튼 상태 변경 여부를 확인하기 위한 변수 선언

void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT); // 7번 디지털 핀을 입력 모드로 설정 
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int inputValue = digitalRead(7); // 입력 핀의 값(HIGH 혹은 LOW)을 읽어 변수에 저장
  Serial.println(inputValue); // 변수값(1 혹은 0)을 직렬 모니터에 출력
  
  
  // 만약 읽은 값이 HIGH이고(푸시 버튼이 눌렸고)
  if(inputValue == HIGH)
  {
  	 if(flag == 0) // flag 변수가 0이면
    {
      flag = 1; // flag 변수를 1로 변경한다. 
    }

    else // 만약 읽은 값이 HIGH가 아니고,
    {
        if(flag == 1) // flag 변수가 1이면
      {
        int ledState = digitalRead(8); // 현재 LED의 상태를 읽는데,
          if(ledState == HIGH) // 현재 LED의 상태가 HIGH(켜짐)이면,
            digitalWrite(8, LOW); // LED의 상태를 LOW(꺼짐)로 변경하고,
          else // 현재 LED의 상태가 HIGH(켜짐)이 아니면,
            digitalWrite(8,HIGH); // LED의 상태를 HIGH(켜짐)로 변경한다.
         
        flag = 0; // 그리고 flag 변수를 0으로 변경한다. 
      }
      delay(100);
    }
  }
 
}
  • 전역변수와 지역변수
    같은 변수라 하더라도 생명주기가 다르며, 전역변수는 한번 선언되면 프로그램이 종료되거나 리셋 되기 전까지 그 값을 유지하고 있지만 지역변수는 해당 함수 또는 블록 내에서만 유효하며 해당 함수나 블록이 실행될 때마다 초기화되고 다른 함수나 블록에서 접근할 수 없습니다. 스케치 코드에서 전역변수는 setup() 함수와 loop() 함수 바깥에 선언된 flag 변수이며 지역변수는 loop() 함수내에 선언된 inputValue와 ledStatus입니다. 따라서 flag 변수는 어느 함수에서도 접근 가능하며 값이 변경되더라도 그 값의 상태를 유지합니다. 반면 inputValue 변수와 ledStatus는 loop() 함수가 재실행될 때마다 매번 초기화되어 기존에 변경된 값을 유지하지 않습니다.
  • flag 변수와 조건문을 추가해 푸시버튼을 슬라이드 스위치처럼 작동하게 만들었습니다.

실행


스케치 코드

C#을 공부했었으므로, if문을 중첩시키지 않고 푸시 버튼을 슬라이드 스위치처럼 작동하도록 아두이노 스케치 코드를 수정하려고 시도했다.

// C# code

bool ledState = false; // LED 상태를 저장하는 변수 (초기값: false - 꺼짐)

void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT);  // 7번 디지털 핀을 입력 모드로 설정
}

void loop()
{
  int buttonState = digitalRead(7); // 7번 핀 (버튼)의 상태를 읽습니다.

  if (buttonState == HIGH) // 버튼이 눌렸으면
  {
    ledState = !ledState; // LED 상태를 토글합니다.
    digitalWrite(8, ledState ? HIGH : LOW); // LED 상태에 따라 8번 핀 (LED)을 켜거나 끕니다.
    delay(100); // 채터링 방지를 위해 짧은 지연 시간을 추가합니다.
  }
}
  • 이 코드는 푸시 버튼을 한 번 누를 때마다 LED 상태를 토글합니다.
  • 즉, 버튼을 누르면 LED가 켜지고, 다시 누르면 LED가 꺼집니다.
  • Toggle의 원뜻은 빗장이라는 뜻이다. 컴퓨터 기능 중 하나로 한번만 눌러도 그 기능이 계속 지속되는 방식으로 기능하는 것이다.

코드 설명

  • bool ledState = false;: LED의 현재 상태를 저장하는 변수입니다. false는 LED가 꺼진 상태를, true는 LED가 켜진 상태를 나타냅니다.
  • loop() 함수:
    • int buttonState = digitalRead(7);: 7번 핀 (푸시 버튼)의 상태를 읽어 buttonState 변수에 저장합니다.
    • if (buttonState == HIGH): 버튼이 눌렸는지 확인합니다.
    • ledState = !ledState;: LED의 상태를 반전시킵니다. 즉, LED가 꺼져 있으면 켜고, 켜져 있으면 끕니다.
    • digitalWrite(8, ledState ? HIGH : LOW);: LED의 상태에 따라 8번 핀 (LED)을 켜거나 끕니다. ledStatetrue이면 HIGH (켜짐), false이면 LOW (꺼짐)를 출력합니다.
    • delay(100);: 채터링 방지를 위해 짧은 지연 시간을 추가합니다. 채터링은 버튼을 누르거나 뗄 때 발생하는 접촉 불안정 현상으로 인해 여러 번 신호가 입력되는 현상입니다.

실행

정상적으로 기능하는 것을 확인할 수 있다.

0개의 댓글