아두이노 시리얼 통신 led - adu-ino silieol tongsin led

void serialEvent() 함수는 시리얼 통신이 수신되는 경우 실행되는 인터럽트 서비스 루틴 함수입니다. 시리얼 통신으로 데이터가 오게 되면 recString 변수에 문자열을 저장합니다. 캐리지 리턴('\r'), 라인피드('\n')는 무시합니다. 라인피드가 입력되면 string 변수에 지금까지 수신한 문자열을 입력하고 recFlag를 활성화 합니다. recFlag는 새로운 한 문자열이 도착했음을 의미합니다.

void serialEvent(){
    char c = (char)Serial.read();
    if((c != '\n')&&(c != '\r')){
        recString += c;
    }
    if(c == '\n'){
        string = recString;
        recString = "";
        recFlag = true;
    }
}

loop() 문 내의 if(recFlag)

loop() 문 내의 if(recFlag)는 시리얼 통신으로 문자열 수신이 완료되면 실행되는 조건문입니다. recFlag가 TRUE인 경우 reset_StringBuff() 함수를 호출합니다. 이 함수는 stringBuff를 초기화 하고 새로운 데이터로 변경하는 함수입니다.

if(recFlag){
    recFlag = false;
    reset_StringBuff();
}

 

실행 결과

위 코드를 실행하면 아래 영상과 같이 시리얼 모니터 프로그램으로 제어가 가능합니다. 위 코드를 사용하기 위해 사용하는 시리얼 통신 프로그램에서 엔터 입력 시 케리지 리턴과 라인피드('\r\n')가 입력되도록 설정을 하셔야 합니다. Putty에서 엔터 입력 시 케리지 리턴과 라인피드 입력하는 방법은 아래의 링크를 참조해주세요.

시리얼 통신으로 LED 매트릭스 스크롤하기

 

아두이노 코딩 : 엔터 입력시(문장단위) Serial Echo 프로그램, Putty 로 CR+LF 전송

Arduino Uno Echo Behavior When Entering an Enter Key 아두이노에서 엔터 입력시 Echo 동작을 수행하는 프로그램 예제 입니다. 문장 단위로 메세지를 입력, 또는 특정 문자 입력까지 데이터를 받아 처리 하고..

juahnpop.tistory.com


마무리

이번 포스트에서 시리얼 통신으로 LED 매트릭스에 텍스트 스크롤 하는 방법에 대해 소개하였습니다. LED Matrix를 구현하기 위해 이와 같이 코드를 직접 작성할 이유는 전혀 없습니다. 가독성 좋은 폰트로 간단히 구현할 수 있는 라이브러리들이 너무나 많습니다. 단순히, LED Matrix의 동작 원리를 이해하는 차원에서 작성하였습니다. 

반응형

시리얼 통신을 이용하여 아두이노 보드의 LED를 끄고 켜보려고 합니다. 

시리얼 모니터창에 1을 입력하면 아두이노 보드의 LED가 켜지는 동시에 시리얼 모니터에 LED ON 이라고 나타납니다.

시리얼 모니터창에 2을 입력하면 아두이노 보드의 LED가 꺼지는 동시에 시리얼 모니터에 LED OFF 이라고 나타납니다.

영상을 보면서 따라해보세요.

 

시리얼 통신을 이용한 LED 켜고 끄기 설명 영상

https://youtu.be/SPRw-Az97vk

 

시리얼 통신을 이용한 LED 켜고 끄기 설명 자료

아두이노 시리얼 통신 led - adu-ino silieol tongsin led
아두이노 시리얼 통신 led - adu-ino silieol tongsin led
아두이노 시리얼 통신 led - adu-ino silieol tongsin led
아두이노 시리얼 통신 led - adu-ino silieol tongsin led

반응형

공유하기

게시글 관리

구독하기진연자의 실험과학

'테마과학 > 메이커코딩' 카테고리의 다른 글

스위치 작동 원리 아두이노 전기회로 아두이노코딩  (0)2021.08.11시리얼 통신과 시리얼 통신 실습 아두이노스케치 아두이노코딩 아두이노소스코드  (0)2021.08.103개의 LED를 이용하여 신호등 제작하기 아두이노스케치 아두이노코딩 아두이노소스코드  (0)2021.08.09LED 켜고 끄기 & LED 밝기 변화하기 아두이노스케치 아두이노코딩 아두이노소스코드 브레드보드회로  (0)2021.08.09전기회로에서 저항의 크기 계산하기 아두이노 아두이노코딩 전기회로 브레드보드  (0)2021.08.09

시리얼 통신의 활용 - LED와 센서

Arduino/Serial 통신 2020. 10. 19. 19:00

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

연결은 다음과 같이 한다.

아두이노 시리얼 통신 led - adu-ino silieol tongsin led

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

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

소스 코드

//  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가 꺼지도록 시리얼 통신으로 구현

연결은 다음과 같이 한다.

아두이노 시리얼 통신 led - adu-ino silieol tongsin 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);
}

시리얼 모니터로 본 결과

아두이노 시리얼 통신 led - adu-ino silieol tongsin led

 

서브 예제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);
  }
}

시리얼 모니터로 본 결과

아두이노 시리얼 통신 led - adu-ino silieol tongsin led

 

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

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

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

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

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

먼저 LED부터 연결해보자.

아두이노 시리얼 통신 led - adu-ino silieol tongsin 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);

    }
  }
}

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

아두이노 시리얼 통신 led - adu-ino silieol tongsin led

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

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

공유하기

게시글 관리

구독하기Design

'Arduino > Serial 통신' 카테고리의 다른 글

아두이노와 아두이노의 시리얼 통신하기  (0)2020.11.05Serial Rx Tx & SoftwareSerial Rx Tx  (0)2020.10.20시리얼 통신에 사용되는 함수  (0)2020.10.20시리얼 통신과 문자열 활용 - LED  (0)2020.10.20시리얼 통신 기초  (0)2020.10.19

TAG

LED, Serial, 조도 센서

관련글 관련글 더보기

  • Serial Rx Tx & SoftwareSerial Rx Tx
  • 시리얼 통신에 사용되는 함수
  • 시리얼 통신과 문자열 활용 - LED
  • 시리얼 통신 기초

댓글 0

댓글 접기 댓글 펼치기

이전 댓글 더보기

비밀글

등록