ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시리얼 통신의 활용 - LED와 센서
    Arduino/Serial 통신 2020. 10. 19. 19:00

    10k저항과 조도 센서를 연결하고 시리얼 모니터가 아닌 시리얼 플로터로 결과를 보자.

    연결은 다음과 같이 한다.

    시리얼 플로터는 툴 탭을 클릭하면 나온다.

    조도 센서를 어둡게하면서 밝게하면 그 그래프를 볼 수 있다.

    소스 코드

    //  10k저항과 조도 센서를 설치하고
    //  시리얼 모니터가 아닌 시리얼 플로터로 결과를 보자. 
    //  조도 센서를 어둡게하면서 밝게하면 그 그래프를 볼 수 있다.
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600); //  바운드 레이트 정의
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      Serial.println(analogRead(A0)); //  println함수는 2바이트, write함수는 1바이트
    
      delay(100);
    }

     

     

    1을 입력하면 LED가 켜지고, 0을 입력하면 LED가 꺼지도록 시리얼 통신으로 구현

    연결은 다음과 같이 한다.

    소스 코드

    //  1을 입력하면 LED가 켜지고, 0을 입력하면 LED가 꺼진다.
    //  이를 시리얼 통신으로 구현한 예제
    #define   LED_PIN   3    //  출력으로 쓸 LED 핀 번호 
    #define   ON        '1'  //  숫자1의 아스키 코드값은 49이다.
    #define   OFF       '0'  //  숫자0의 아스키 코드값은 48이다.
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);   
      pinMode(LED_PIN,OUTPUT);  //  LED 출력핀 초기화
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      byte readByte = Serial.read();  //  값을 읽어옴
    
      Serial.println(readByte);
      
      if (readByte == ON)
      {
        digitalWrite(LED_PIN, HIGH);
      }
      else if (readByte == OFF)
      {
        digitalWrite(LED_PIN, LOW);
      }
      delay(100);
    }

     

    위의 내용을 약간 업그레이드를 해보자.

    Serial.available함수를 추가해보자.

    소스 코드

    //  업그레이드 버전
    //  1을 입력하면 LED가 켜지고, 0을 입력하면 LED가 꺼진다.
    //  이를 시리얼 통신으로 구현한 예제
    #define   LED_PIN   3    //  출력으로 쓸 LED 핀 번호 
    #define   ON        '1'  //  숫자1의 아스키 코드값은 49이다.
    #define   OFF       '0'  //  숫자0의 아스키 코드값은 48이다.
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);   
      pinMode(LED_PIN,OUTPUT);  //  LED 출력핀 초기화
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      if (Serial.available())
      {
        //  Serial.println(Serial.read());
    
        byte readByte = Serial.read();  //  값을 읽어옴
    
        Serial.println(readByte);
      
        if (readByte == ON)
        {
          digitalWrite(LED_PIN, HIGH);
        }
        else if (readByte == OFF)
        {
          digitalWrite(LED_PIN, LOW);
        }
      }
    }

     

    서브 예제1. 정수를 각 진법으로 변환

    소스 코드

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      int in = 33;
    
      Serial.write(in); //  ascii code
      Serial.println("\t" + String("이진수 : ") +String(in,BIN));
      Serial.println("\t" + String("8진수 : ") +String(in,OCT));
      Serial.println("\t" + String("10진수 : ") +String(in,DEC));
      Serial.println("\t" + String("16진수 : ") +String(in,HEX));
    
      delay(500);
    }

    시리얼 모니터로 본 결과

     

    서브 예제2. 시리얼 통신으로 정수를 입력받기

    소스 코드

    //  정수로 입력받기
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if (Serial.available())
      {
        int in = Serial.parseInt();
        Serial.println(in);
      }
    }

    시리얼 모니터로 본 결과

     

    서브 예제 1과 2를 통해 입력 받은 정수에 따른 LED를 제어해보자.

    우선 4개의 LED를 연결한다.

    그리고 정수 10을 입력받으면 10은 2진수로 1010이 된다.

    즉, 4개의 LED 중에서 위의 2진수가 1이되는 위치의 LED만 켜도록 한다.

    정수 15는 이진수로 1111이므로 4개의 LED가 모두 켜지도록 구현하면 된다.

    먼저 LED부터 연결해보자.

    소스 코드

    //  LED핀 4개를 달아서 LED 출력
    #define   LED_PIN_3   3
    #define   LED_PIN_4   4
    #define   LED_PIN_5   5
    #define   LED_PIN_6   6
    #define   LED_COUNT   4
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
      for (int i = 0; i < LED_COUNT; i++)
      {
        pinMode(i+LED_PIN_3,OUTPUT);
        digitalWrite(i+LED_PIN_3,LOW);
      }
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if (Serial.available())
      {
        //  1. 정수를 입력받는다.
        int in = Serial.parseInt();
    
        for (int i = 0; i < LED_COUNT; i++)
        {
          //  in이 15이면 0b00001111 
          int state = (((in >> i) & 0b00000001) == 1) ? HIGH : LOW;
    
          digitalWrite(i + LED_PIN_3, state);
    
        }
      }
    }

    시리얼 통신 창에서 하단에 보면

    위와 같은 목록이 보인다. "line ending없음"으로 선택하면 켜진 LED가 계속 켜진상태로 있다.

    그런데, 다른 것으로 선택하면 LED는 바로 꺼져버린다.

    댓글

Designed by Tistory.