본문 바로가기

대학 생활/IoT(RaspberryPi, Arduino)

[Arduino] 온도계만들기

온도계 만들기

온도계 센서도 사용하고 세그먼트도 사용해보았다. 이제 두개를 이용하여 온도계를 만들어보고자 했다. 간단하게 생각하고 있었는데 문제는 브레드보드와 연결하는 중에 생각났다. 아두이노에 두개의 세그먼트를 연결할 핀이 부족했다.

7-세그먼트 2개를 이용해 2자리 숫자 출력하기

먼저 생각한 것은 논리회로 시간에 하던 것 처럼 진리표를 그려서 간략화 시켜서 해야겠다는 생각을 하였다. 하지만 기본키트에는 AND, OR게이트를 도와줄 칩이 없어서 할 수 없었고, 인터넷을 찾아보던중 한 동영상을 찾았다.

아두이노 강좌 - 8강-2 7 세그먼트 컨트롤하기(2자리 컨트롤 하기)

여기서는 두개의 세그먼트 가지고 반복적으로 출력함으로써 눈속임을 이용하였다. 이 코드를 이용해 조금 더 바꾸어서 다음과 같이 작성하였다.

byte seven_seg_digits[10][7] = { 
  { 0,0,0,0,0,0,1 },  // = 0
  { 1,0,0,1,1,1,1 },  // = 1
  { 0,0,1,0,0,1,0 },  // = 2
  { 0,0,0,0,1,1,0 },  // = 3
  { 1,0,0,1,1,0,0 },  // = 4
  { 0,1,0,0,1,0,0 },  // = 5
  { 0,1,0,0,0,0,0 },  // = 6
  { 0,0,0,1,1,1,1 },  // = 7
  { 0,0,0,0,0,0,0 },  // = 8
  { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {
  int pinNum = 2;
  // segment init
  for (pinNum = 2; pinNum < 10; pinNum++) {
    pinMode(pinNum, OUTPUT);
  }

  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);

  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
}

// 세그먼트에 한개의 숫자를 출력하는 함수
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++
    segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

// show number
// 0부터 99까지 출력하는 함수.
// 1번 세그먼트와 2번세그먼트를 반복적으로 
// 보여줌으로써 눈속임을 이용해 2자리 숫자를 나타낸다.
void showDigite(byte pNum) {
  int num1 = pNum / 10;
  int num2 = pNum % 10;
  int cnt = 100;

  if (num1 == 0) {
    while(0 < cnt--) {
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      sevenSegWrite(num2);
    }
  } else {
    while(0 < cnt--) {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      sevenSegWrite(num1);
      delay(10);
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      sevenSegWrite(num2);
      delay(10);
    }
  }
}
void loop() {
  showDigite(80);
}

showDigite() 함수가 2자리 수를 출력하는 함수이다. 원리는 간단하다. 두개의 세그먼트가 같은 숫자를 보여주지만 한번은 왼쪽 세그먼트를 끄고, 또 한번은 오른쪽 세그먼트를 끄고 출력하여 그것을 반복하여 눈속임을 하는 것이다. 그것을 함수로 작성하려고하니 눈속임을 할 수 있을 정도 한번 보여줄때 100번 반복을 통해 두자리인것 마냥 보여준다.

디지털 온도계 만들기


위 사진은 회로도이다. (Fritzing 라는 프로그램으로 편하게 작성할수 있다. 링크)두 개의 세그먼트를  5V에 주지 않고 0번과 1번 핀에 주어진 것을 볼 수있다. 다음으로 온도값을 가져오면 된다. 이것은 센서를 이용하여 간단하게 알 수 있기때문에 어려움은 없었다. 센서를 연결하고 loop()에 다음과 같은 코드만 추가시켰다.

아두이노 온도 센서사용하기


int val = 0;

void loop() {
  int reading = analogRead(0);
  
  val = (reading * 500.0) / 1024.0;
  showDigite(val);
  
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  delay(1000);
}

결과 영상

마지막으로

보완해야할 점이 매우 많았다. 선을 너무 많이 사용해서 복잡한것도 있었고, 눈속임을 통해 보여주는 것이라 반복문을 돌고있는 중에는 다른 작업을 할수 없는것도 문제점이었다. 나중에 제대로 디지털온도계를 만들 때는 세그먼트 두개에 간략화를 해서 사용하던지, 그냥 2digit segment 를 사용해야겠다. 회로 연결하는 것은 어렵지 않았으나 코드를 작성할때 생각처럼 간단하지 않았던 실험이었다.


전체코드

Temperature.c


"본 제품은 아이씨뱅큐 무상체험단 21기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."