본문 바로가기
아두이노

[Do it! 아두이노] 7. 아날로그 입력으로 아두이노 작동하기

by Lizardee 2023. 8. 19.
1. 가변저항으로 LED 제어하기

▶ 가변저항(potentiometer)이란?

: 값을 바꿀 수 있는 저항

  • 가변저항은 노브(kmob)를 돌려 사용자가 값을 변경할 수 있다.그래서 오디오 볼륨을 제어하거나, LED 조명의 밝기를 제어하는 등 아날로그값을 조절할 때 반드시 필요하다.

 

가변저항의 구조와 작동 원리

가변저항의 구조

가변저항은 세 개의 단자로 구성된다. 양 끝의 두 단자는 전원(5V)과 접지(GND)에 연결한다. 가운데 단자는 와이퍼(wiper)라고 하는데, 가변저항의 변경된 저항값을 읽을 수 있는 특별한 단자이다.

고정저항과 가변저항은 모두 극성이 없는 전자부품이어서, 전원과 접지의 연결 단자가 서로 바뀌어도 잘 작동한다. 하지만 가변저항의 경우, 전원과 접지의 방향을 변경하면 와이퍼에서 측정되는 값의 범위가 뒤바뀐다. 예를 들어, 가변저항의 왼쪽 단자를 전원(5V)에 연결하고 오른쪽 단자를 접지(GND)에 연결할 때 가운데 입력 단자를 통해 읽은 값이 최댓값이라면, 왼쪽 단자를 접지(GND)에 연결하고 오른쪽 단자를 전원(5V)에 연결할 때 가운데 입력 단자를 통해 읽은 값은 최솟값이다.

 

아날로그 신호의 입력 범위

가변저항의 가운데 2번 단자를 아두이노의 아날로그 입력 핀에 연결해 입력받는 값의 범위는 최솟값이 0이고, 최댓값이 1,023이 된다.

 

Do it! 실습 7-1. 가변저항값 측정하기

가변저항값 측정하기

// C++ code
//
void setup()
{
  Serial.begin(9600);  //직렬 통신 초기화
}

void loop()
{
  int readValue = analogRead(A0); //A0 단자에서 측정되는 아날로그 신홋값을 저장
  Serial.println(readValue);     //아날로그값 출력
}

 

Do it! 실습 7-2. 가변저항으로 LED 켜고 끄기

가변저항 값이 500보다 작을 때와 클 때로 나누기

// C++ code
//
void setup()
{
  Serial.begin(9600);  
  
  pinMode(13, OUTPUT);  //디지털 13번 핀을 출력 모드로 설정
}

void loop()
{
  int readValue = analogRead(A0); //A0 핀에서 읽은 값을 readValue에 저장
  Serial.println(readValue); 
  
  if(readValue < 500)            //readValue값이 500 미만이라면 LOW
    digitalWrite(13, LOW);
  else
    digitalWrite(13, HIGH);      //readValue값이 500 이상이라면 HIGH
}

 

Do it! 실습 7-3. 가변저항으로 LED 깜빡임 속도 조절하기

가변저항으로 LED 깜빡임 속도 조절하기

// C++ code
//
void setup()
{
  Serial.begin(9600);  
  
  pinMode(13, OUTPUT);  //디지털 13번 핀을 출력 모드로 설정
}

void loop()
{
  int readValue = analogRead(A0); //A0 핀에서 읽은 값을 readValue에 저장
  Serial.println(readValue); 
  
  digitalWrite(13, LOW);
  delay(readValue);   //readValue값만큼 코드 실행을 기다린다.
  digitalWrite(13, HIGH);
  delay(readValue);   //readValue값만큼 코드 실행을 기다린다.
}
  • delay(readValue): readValue값만큼 코드 실행을 기다린다.

 

Do it! 7-3(2). LED 깜빡임 지연 속도 놀리기

LED 깜빡임 지연 속도 늘리기

// LED 깜빡임 지연 속도 늘리기
//
void setup()
{
  Serial.begin(9600);  
  
  pinMode(13, OUTPUT);            
}

void loop()
{
  int input = analogRead(A0);          //아날로그 신호 측정
  int output = (float)input/1023*2000; //출력값 변환식 적용(형 변환)
  
  Serial.print(input);          //아날로그 입력값 출력
  Serial.print('\t');           //공백 출력
  Serial.println(output);       //변환된 출력값 출력
  
  digitalWrite(13, LOW);
  delay(output);                //지연 시간을 변수로 제어
  digitalWrite(13, HIGH);
  delay(output);   
}
  • int output = (float)input/1023*2000; 출력값 변환식 적용

 


2. 조도 센서로 스마트 가로등 만들기

▶ 조도 센서(photoresistor)란?

: 빛의 세기에 따라 저항값이 변하는 전자 부품

  • 빛이 많이 들어오면 저항이 작아지고, 적게 들어오면 저항이 커지는 황화 카드뮴이라는 화합물을 사용한다.
  • 조도 센서의 모습을 보면 동그란 부분이 빛을 감지하는 부분이며, 전류가 흐르는 길인 두 개의 단자로 구성된다. 
    저항처럼 극성이 없어서 전원(5V)와 접지(GND)의 방향에 상관없이 연결할 수 있다.

 

Do it! 실습 7-4. 조도 센서값 측정하기

조도 센서값 측정하기

// C++ code
//
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int photoresistor = analogRead(A0); //조도 센서값 측정
  Serial.println(photoresistor);      //조도 센서값 출력
}

슬라이드 바를 위로 올리면 빛의 밝기가 세지고, 아래로 내리면 빛의 밝기가 약해진다. 밝기 조절에 따라 바뀌는 출력값은 직렬 모니터로 확인할 수 있다. 빛이 가장 밝을 때는 49, 가장 어두울 때는 969이다.

 

Do it! 실습 7-5. 조도 센서로 스마트 가로등 회로 만들기

어두울 때 가로등을 켜고, 밝을 떄 가로등을 끈다.

// C++ code
//
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  int photoresistor = analogRead(A0); //조도 센서값 측정
  Serial.println(photoresistor);      //조도 센서값 출력
  
  if(photoresistor>100)
    digitalWrite(13, HIGH); //어두울 때 가로등을 켬
  else
    digitalWrite(13, LOW);  //밝을 때 가로등을 끔
}

 


 

3. 온도 센서로 온도계 만들기

▶ 온도 센서란?

: 온도를 감지해 전기 신호로 바꿔주는 전자 부품

  • 서킷은 세 개의 단자로 구성된 TMP36이라는 온도 센서를 지원한다. 왼쪽부터 전원, 출력, 접지 단자이다.

온도 센서

 

Do it! 실습 7-6. 온도 센서로 온도계 회로 만들기

온도 센서로 온도계 회로 만들기

// C++ code
//
void setup()
{
  Serial.begin(9600); //직렬 통신 초기화
}

void loop()
{
  int analogInput = analogRead(A0);       //온도 센서(TMP36)값 측정
  float voltage = analogInput*5.0/1023.0; //전압값 변환
  float temparature = voltage*100-50;     //온도값 변환
  
  Serial.print("Temperature : ");
  Serial.println(temparature);            //온도값 출력
}

 


도전: 화재경보기를 만들어 봐요!

: 온도가 120도를 넘으면 LED를 깜빡이는 화재경보기를 만든다.

// C++ code
//
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  int analogInput = analogRead(A0);         //온도 센서(TMEP36)값 측정
  float voltage = analogInput*5.0/1023.0;
  float temperature = voltage*100-50;
  
  Serial.println(temperature);             //온도값 출력
  
  if(temperature>120){                     //120도 이상일 때
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000);
  }
  else
    digitalWrite(13, LOW);
}