아무래도 LOLIN 보드에서 조도센서의 저항 값 변화를 시리얼 플로터로 관찰해 본 결과 뭔가 문제가 있다는 진단을 한다. 1KΩ 저항과 일종의 빛의 밝기에 다른 가변 저항인 조도센서와 직렬 연결된 간단한 회로임에도 불구하고 출력이 불안정한 이유는 무엇일까?
혹시 노이즈 문제가 아닐까 의심해 본다. 일단 간단하게 문제를 진단해 보기 위해서 저항값 변수 cdsR 변수 값 시리얼 플로터 출력 후 delay(100)을 delay(10)으로 조절하여 빠른 파형을 관찰하자. LOLIN 보드는 아두이노 우노에 비해 충분히 빠른 듯하다. 역시 생각지도 않았던 노이즈가 숨어 있는 사실이 발견되었다.
일차적인 조치로 1KΩ 저항과 직렬로 콘덴서를 사용하는 임시 저주파 필터를 적용해 보기로 한다. 콘덴서 용량은 그냥 주변에 비슷하게 생긴게 있으면 주로 47, 100, 220uF 인데 아무생각 없이 그냥 극성만 맞춰 조도센서 양단에 배선하도록 한다.
파형을 관찰해 본 결과 조금은 나아진 듯 하지만 이 정도론 아무래도 안되겠다는 결론이다.
극약 처방으로 소프트웨어 방식의 디지털 저주파 필터를 코딩해서 적용해 보기로 한다.
헤더 영역에 아래 두 줄을 입력하자.
float alpha = 0.98;
float previous =0.0;
loop에서는 다음의 3줄만 수정하면 된다.
물론 디지털 필터링에서 alpha 값을 높게 주면 대단히 낮은 저주파만 통과시키는데 만약 시리얼 플로터로 보면 거북이처럼 서서히 올라가는 곡선을 볼 수 있으며 몇분이 소요 될 수도 있다.
alpha 값 0.98을 주고 시간 지연을 정상적으로 100msec를 주면 아래 그래프처럼 시리얼 플로터가 0에서부터 상승하여 6500 수준까지 올라오게 된다. 이 정도면 조도센서가 제대로 작동하는 괜찮은 데이터가 얻어진 듯하다. 시간이 더 흐르고 데이타 흔들리는 폭이 좁아지면 파형이 지나가면서 결국은 시리얼 플로터에 삐죽 삐죽한 부분이 많이 나타나게 되는데 이는 시리얼 플로터의 출력 방식에 따른 문제이다.
조도 센서는 의외로 노이즈를 많이 타는듯하다. 따라서 RC 회로를 사용한 저주파 필터보다는 소프트웨어 방식의 디지털 필터를 쓰도록 하자.
//WeMos_lolin_Cds_filter_01
float Volt = 3.3; //LOLIN 전압
float r = 987.0; //1K옴 실측치
int ledPin = 27;
float alpha = 0.98;
float previous =0.0;
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
}
void loop() {
int analogV = analogRead(36);//0-4095
//Serial.println(analogV);
float V = VoltanalogV/(4095);//Cds 전압 환산
float R_V = Volt-V;//1K저항 전압 계산
float i = R_V/r;//1K옴 저항 전류 계산, 암페어
float cdsR = V/i;//조도센서 저항 계산
float filter_cdsR = alphaprevious + (1.0-alpha)*cdsR;
Serial.println(filter_cdsR);//시리얼 모니터 출력
if( cdsR<6000) {// 6000옴 이하면 ON
digitalWrite(ledPin,LOW);//밝으면 끄기
}
else {
digitalWrite(ledPin,HIGH);//어두우면 켜기
}
previous = filter_cdsR;
delay(100);
}//프로그램 끝