Reposting:아두이노 코딩 문법 및 편집의 모든 기초연재-9: 비오는 날 창가에서 조도센서 저항값 변화에 따른 LED ON OFF
비오는 날 창가에서의 실내 밝기는 아침 먼동이 틀 때와 비슷하다. 창가에서 밝기의 변화는 바깥과 실내의 어두움 사이의 급격한 밝기 변화가 가능하므로 실험하기에 졸은 환경이 된다.
다음은 아두이노 조도센서 회로 배선을 위한 준비물이다.
초보자를 위한 아두이노 코딩-8: “멀티 메타에 의한 아두이노 LED ON 전류 측정”
https://steemit.com/kr/@codingart/8-led-on
조도(Cds) 센서는 빛의 밝기에 따라 저항 값이 변동 되는 민감한 반도체성 가변 저항으로 실제로 도시의 가로등 ON OFF 스위치로 사용되는 센서이다.
비오고 흐린 날 창가나 뜨락에서 가로등이 제대로 꺼지거나 켜질려면 밝기에 따른 조도 센서의 저항 값 임계치를 정확히 설정해야 할 필요가 있다.
멀티메터로 측정해 본 조도 센서의 저항 값은 태양 빛을 정면으로 받을 때 70Ω 수준에서 손가락으로 완전히 가렸을 때 60KΩ의 값을 가진다. 즉 밝을수록 저항 값이 작아지고 어두울수록 저항 값이 급격히 커진다.
아두이노 우노 보드를 사용하여 빛의 밝기가 변하는 환경에서 조도 센서의 저항 값을 알아내기 위해서는 그림과 같이 저항값을 알고 있는 저항과 조도 센서를 직렬로 연결 배선하고 5V 전압을 가한다.
이 값들은 코딩 전에 멀티메터로 실측해서 입력하면 오차 보정에 더욱 좋다.
실측 결과 5V 전원은 4.8V, 1K옴 저항은 815옴으로 측정되었으므로 이 값을 코딩에 사용하기로 한다. 만약 멀티 메타가 없어서 측정이 어렵다면 오차가 있긴 하지만 그대로 사용해도 회로를 동작시키는 데엔 아무런 문제가 없다. 아울러 이 1K옴 저항과 GND 양단에 걸리는 전압을 아두이노가 읽어 들이기 위해 아날로그 입력 핀 A0에 연결 배선한다.
디지털 신호는 “0” 과 “1” 또는 “LOW”와 “HIGH” 2가지 상태만 나타낼 수 있다. 따라서 아두이노 보드의 디지털 핀에서 “LOW” 는 전압 기준으로 1.6V 이하를 “HIGH” 는 1.6∼5.0V 사잉의 전압으로 구별된다. 반면에 아날로그 신호는 5V를 기준으로 0∼1024까지 사이의 정수 값으로 표현된다.
I: 헤더영역에서 전역 변수를 선언하자.
float는 소수점 이하 표현이 가능한 실수형 변수임을 뜻하며, int 는 integer 즉 정수형 변수를 의미한다. 조도 센서가 주변이 어두워지는 것을 감지하면 디지털 핀 2번에 배선된 LED 가 켜질 수 있도록 ledPin = 2를 설정한다.
II: setup() 에서 USB 케이블 통신 속도를 9,600으로 설정하고 어두울 때 LED를
ON 할 수 있도록 디지털 핀 ledPin = 2 를 출력 즉 OUTPUT 상태로 설정해 둔다. 디지털 핀은 반드시 입력인지 출력인지 상태를 사전에 설정해야 하며 이러한 설정이 선행되지 않으면 후행하는 digitalWrite() 명령 단계에서 반드시 컴파일 에러를 받게 된다.
이번 코드에서는 처음 시작 단계에서 어두운 상태에서 시작하는 것으로 가정하고LED를 ON 시켜 둔다. 아울러 5초간 아두이노 보드가 USB 케이블을 통해 통신할 충분한 여유를 주도록 한다.
III: loop() 첫 단계에서 아날로그 값을 읽어서 실제 전압 값으로 환산하는 코드를 살펴보자.
int analogV = analogRead(A0) 에서 int는 로컬(local) 선언이며 loop() 내부에서만 통용된다. 이러한 로컬 선언은 제어문(control statement) 인 if 문에서 사용할 때에는 if 문 내부에서만 유효하게 됨에 유효하자. analogRead(A0)는 아날로그 입력 체널 중 첫 번째인 A0 핀에서 값을 읽어 들이라는 명령이다. 0∼1023까지 범위의 정수 값으로 전압 신호의 샘플링이 이루어진다.
float V = ∙∙∙에서 float 는 로컬 실수형 변수 선언이다. 아두이노에서 실수형 변수는 소수이하 6자리 값까지 처리가 가능하다.
IV: 1K옴 저항(실측 값 815옴)에 가해진 전압 V를 저항 값 r 로 나누면 이 저항에 흐르는 전류가 암페어(A) 단위로 계산된다. 이 전류 값은 대단히 작으므로 소수이하 4자리까지 유효숫자로 처리할 수 있도록 Serial.print( i, 4) 출력 명령을 사용하자. 자리 수 지정 없이 Serial.print(i) 명령을 그대로 사용하면 default 로 소수이하 둘째자리까지 처리하기 때문에 0.0 이 출력됨에 유의하자.
출력 값을 관찰해 보면 0.007∼0.009A (7∼9mA) 정도 의 작은 전류가 흐름을 알 수 있다.
V: 마찬가지로 우리가 알고 있는 아두이노 전압 5V 또는 실측 값 arduVolt에서 1k 옴 저항에 가해진 전압 v를 빼면 조도 센서에 가해지는 전압 cdsV 가 얻어진다. 이 cdsV 전압을 앞서 계산한 전류 값 i 로 나누어 주면 조도센서의 저항 값 cdsR 이 Ω단위로 얻어지고, 다시 1,000으로 나눠주면 KΩ 단위로 값이 얻어진다.
비오거나 흐린 날 창가에서 밝기에 따라 LED 가 ON OFF 되는 값을 관찰해보면 그 임계 값이 6KΩ 임을 알 수 있다. 아래에 첨부한 출력 결과 와 끝 부분의 시리얼 플로터 결과를 참조해 보기 바란다.
VI: 밝기에 따른 임계 저항 값이 6KΩ 또는 6,000Ω 이라면 제어문을 사용하여 6,000Ω 이하에서 충분히 어두운 경우에 해당하므로 digitalWrite(ledPin,HIGH) 명령을 사용하여 LED를 ON 시키도록 한다. 그렇지 않으면(else) digitalWrite(ledPin,LOW) 명령을 사용하여 LED를 OFF 시키도록 한다.
이와 같은 과정을 거쳐 한 주기가 완성되면 2초간 시간지연 즉 delay(2000)을 주어 기다리다가 loop()를 1회 마친 후 다시 loop() 처음으로 돌아가 같은 과정을 되풀이 하게 된다.
VII: 이와 같이 측정에 따른 환산이 이루어졌으면 그 결과를 USB 케이블로 연결된 PC에서 시리얼 모니터에 의해 출력해 보도록 하자.
아두이노 편집기에서 툴 탭의 시리얼 모니터 명령을 선택 클릭하거나 아니면 편집기 우상단의 버튼을 클릭하면 된다.
흰색 시리얼 모니터가 나타나면 반드시 setup()에서 설정했던 Serial.begin(9600)을 상기하고 하단의 9600 보드레이트를 맞춰 주도록 해야 한다. 이 값이 맞지 않으면 사용자가 시리얼 모니터 출력을 받아 볼 수 없게 된다. 한편 아두이노는 입력을 위한 키보드도 없기 때문에 이 시리얼 모니터의 전송 창을 통해서 입력이 가능하며 차후에 그 사용법을 거론하기로 한다.
VIII: 아울러 툴탭의 시리얼 모니터 명령에 연이어 시리얼 플로터 기능이 있는 바 이는 그래프 출력을 지원한다. 이 기능을 가시적으로 보려면 현재의 코드에서 3개의 변수 값을 출력하므로 구분하기가 어렵다. 따라서 3개중의 2개의 출력을 // 처리하여 억제한 후 조도 센서의 저항 값만을 출력해 보기로 하자.
아두이노 조도센서 코딩은 오픈 소스이므로 공유하기로 한다.
CDS_sensor_LED_02
float arduVolt = 4.9; //아두이노 전압 실측치
float r = 815; //1K옴 실측치
int ledPin = 2;
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin, HIGH);
delay(5000);
}
void loop() {
int analogV = analogRead(A0);//0-1023
float V = arduVolt*analogV/(1023.0);//1K옴 저항 전압 환산
Serial.print("Voltage of 1K R = : ");
Serial.print(V);
Serial.println(" V");
float i = V/r;//1K옴 저항 전류 계산, 암페어
Serial.print("electric current I of R = : ");
Serial.print(i,4);
Serial.println(" A");
float cdsV = arduVolt-V;//조도센서 전압 계산
float cdsR = cdsV/i;//옴의 법칙에 의한 조도센서 저항 계산
float cdsRk=cdsR/1000.0; //K옴 단위로 환산
Serial.print("조도센서의 저항값 = : ");
Serial.print(cdsRk,1);//시리얼 모니터 출력
Serial.println(" K Ohm");
Serial.println("");
if( cdsR > 6000) { // 6K옴 이하면 on
digitalWrite(ledPin,HIGH);//어두우면 켜기
}
else {
digitalWrite(ledPin, LOW);//밝으면 끄기
}
delay(2000);
}//프로그램 끝