커뮤니티

  • 제 목 [ 기초 ] 아두이노 실습 - 디지털 온도계 만들기
  • 작성자 주피터 조회 : 10,270 좋아요 : 0 댓글 : 0
  • 작성일 2019-10-28 오전 10:22:29
  • ① 온도를 측정하려면 온도계가 필요 합니다.

     

    그런데 온도계는 사람의 눈으로만 측정값을 확인할 수가 있습니다.

    온도를 측정해서 전기 신호로 바꿔주는 장치가있으면 손바닥 컴퓨터를 이용해서 처리하기가 쉽습니다. 그런 역할을 해주는 전자부품을 온도센서라고 합니다. 온도센서에 대해서 알아 보겠습니다.

     

     

    온도센서 모양, 밑에서 본 모습, 기호 이미지 온도 센서는 세 개의 다리가 달려 있어서, 첫번째 다리에 5V의 전압, 세 번째 다리에 0V를 연결해주면, 두번째 다리로 측정된 온도값을 전압의 변화로 알려 줍니다.

     

    우리가 생활할 때 일상적으로 경험할 수 있는 평균 정도되는 25도씨를 상온이라고 하는데 상온에서 온도 센서는 750mV를 출력합니다.

    그리고 1 도씨 온도가 올라가거나 내려갈 때 마다 10mV가 따라서 올라가거나 내려갑니다.

     

                                                  ⓞ 아두이노 보드의 아날로그 입력 단자를 나타내는 이미지

     

    온도센서의 출력을 아두이노에서 디지털 입력으로 읽으면 디지털 입력은 입력값이 0 볼트이면 로우, 5 볼트이면 하이, 두가지 밖에 인식하지 못합니다. 그래서 온도센서에서 측정한 온도는 디지털 입력이 아닌, 아날로그 전압을 읽을 수 있는 아날로그 입력을 사용해야 합니다.

    아두이노 보드에는 A0 ~ A5까지 6개의 아날로그 입력단자가 있습니다.

    아날로그 입력단자에 0V ~ 5V의 전압이 가해지면 그에 따라 0 ~ 1023 까지의 값을 출력합니다. 0 이 입력되면 입력 전압이 0 볼트, 1023이 입력되면 입력 전압이 5볼트라는 뜻으로 중간값인 512가 입력되면 입력 전압이 2.5 볼트라는 뜻이기도 합니다.

    아두이노에서 알 수 있는 전압의 최소 단위는 5볼트를 1024로 나누어 보면 아두이노의 아날로그 입력이 구분할 수 있는 최소의 전압은 4.88mV입니다. 이것을 용어로는 “분해능”이라고 하고요. 1024는 이진수를 사용하면 10비트를 사용해서 표현 할 수 있기 때문에 “10비트의 분해능을 가진다”고 말합니다.

     

                                                      ⓞ 아날로그 입력단자가 표시되어 있는 아두이노 보드 스크린샷

     

    아날로그 단자에서 입력값을 읽으려면 실제 스케치에서는 아날로그 입력을 받는 방법은 analogRead()함수를 호출하면서 괄호 안에 읽고자 하는 단자 번호를 써주면 됩니다.

    analogRead()함수는 주어진 단자의 전압을 읽은 후 전압에 따른 결과값을 정수로 돌려줍니다.

     

                                                   ⓞ 섭씨 온도로 변환하는 과정 설명

     

    온도 센서를 통해서 입력된 값을 섭씨 온도로 변환하려면 온도 센서의 특성을 살펴볼 때 알게 된 사실들을 생각해보면 온도센서는 25도씨 일 때 750mV가 출력되고, 1 도씨 올라가거나 내려갈 때 마다 10mV가 따라서 올라가거나 내려가므로 0도씨 일 때는 500mV가 출력이 되고 입력 전압 10mV의 변화는 온도 1도씨의 변화에 해당되므로, 입력전압에서 500mV를 뺀 값을 10으로 나누어 주면 입력 온도를 구할 수 있습니다.

    입력전압은, 아날로그 입력을 통해 들어오는 값은 0~5볼트에 따라 0~1023의 값이므로 입력값에 5를 곱한 후 1024로 나누어 주고, 밀리볼트 단위로 바꿔주기 위해서 1000을 곱해주면 구할 수 있습니다.

     

     

    알아낸 온도를 컴퓨터로 전송하려면 여러가지 방법이 있을 수 있겠지만 가장 손쉬운 방법은 직렬 통신을 이용하는 것입니다. 아두이노 보드와 컴퓨터가 직렬 통신 하는 이미지와 같이 작성한 스케치를 아두이노 보드에 업로드할 때 USB케이블을 통해서 전송한 것처럼 아두이노 보드상에 실행되고 있는 스케치와 컴퓨터의 아두이노 개발환경 사이에도 USB 케이블을 통해 데이터를 주고 받을 수 있습니다.

     

    USB케이블을 통해 전송되는 데이터는 일렬로 차례차례 전달되기 때문에 직렬통신 또는 시리얼 통신이라고 합니다. 직렬통신을 하기 위해서는 서로 데이터를 주고 받는 속도를 똑같이 지정해 주어야 합니다. 스케치에서는 Serial.begin() 함수를 사용해서 통신속도를 지정할 수 있다.

     

     

    아두이노 개발 환경에서는 시리얼 모니터 창의 오른쪽 아래에서 속도를 지정할 수 있습니다. 속도를 나타내는 숫자 뒤에 B. A. U. D라고 쓰여있는 것은 데이터 전송 속도를 나타내는 단위인데요. 초당 몇 비트로 데이터를 전송 하는지를 나타내는 것입니다. 

     

                                                           ⓞ 필요한 재료들의 목록

     

    온도센스를 이용한 디지털 온도계를 구성하기 위해서는 온도 센서가 1개, 부품들을 꽃을 브레드 보드 1개, 부품들을 연결할 점퍼선 1 세트, 아두이노 보드 1개, 아두이노 보드와 컴퓨터를 연결할 USB 케이블 한 개, 그리고 개인용 컴퓨터가 1 세트 필요합니다.

     

                                                               ⓞ 회로구성과 회로도

     

                             ⓞ 스케치 순서도

     

     

                                                         ⓞ 온도센스 스케치

     

    setup() 함수에서는 Serial.begin()함수를 호출하여 직렬 포트를 9600보오로 초기화 합니다.

     

    그 다음 loop()함수에서는 우선, 정수형 변수 value 를 선언하고 analogRead()함수를 호출하여 A0 단자로 부터 측정값을 입력받습니다. 입력된 값을 확인해보기 위해서 Serial.print() 함수를 호출하여 입력값을 전송합니다. Seral.println() 함수는 Serial.print()함수와 같이 괄호안의 값을 직렬 통신으로 전송하지만, 맨 마지막에 한 행을 넘기라는 개행문자가 더해지는 점이 다릅니다. 그 다음 입력값을 밀리볼트 단위의 전압으로 변환을 해줍니다. 역시 변환된 값을 확인해보기 위해서 직렬 통신으로 전송을 합니다. 그 다음 전압을 온도로 변환을 해줍니다. 마찬가지로 변환된 값을 직렬 통신으로 전송을 합니다. 다시 delay(5000)함수를 호출하여 5초간 대기하도록 합니다. 이 과정을 무한 반복합니다.

     

                                                                ⓞ 완성된 사진

     

    아두이노보드에 올려서 실행을 하면 이제 5초마다 한 번씩 온도센서에서 입력된 값,전압으로 변환된 값, 온도가 시리얼 모니터 창에 표시됩니다. 온도 센서를 손으로 잡으면 온도가 올라가는 것을 알 수 있습니다. 온도 센서에서 손을 떼면 이렇게 다시 온도가 내려갑니다.

     

                                                           ⓞ 오류 사례 

     

    아두이노 보드에는 아무런 변화가 없는 경우 결과를 보기 위해서는 컴퓨터의 아두이노 개발 환경 에서 시리얼 모니터 창을 띄워 보아야 합니다. 결과가 깨져서 나올 땐 스케치에서 설정한 통신속도와 시리얼 모니터 창의 설정속도가 다를 때 글자가 깨져서 나오게 됩니다.

    시리얼 모니터 창의 통신 속도를 스케치에서 지정한 속도와 일치하도록 설정합니다.

     

    void setup(void)
    {
      Serial.begin(9600);
    }
    
    void loop(void)
    {
      int value = analogRead(0);
      Serial.print("Value(0-1023): ");
      Serial.println(value);
    
      float milliVolts = (value/1024.0) *5000;
      Serial.print("Volts(mV): ");
      Serial.println(milliVolts);
    
      float celsius = (milliVolts = 500)/10;
      Serial.print("Temperature(Celsius): ");
      Serial.println(celsius);
    
      Serial.println("");
      delay(5000);
    }