디지털 라이프 電子的生活 My Digital Life/아두이노 (Arduino)

팬 컨트롤 + 온습도 센싱 + LCD 디스플레이 = ??

미친도사 2021. 4. 15. 22:04

요새 뭔가 하나 만들 구상을 하면서, 팬도 속도 조절하면서 돌리고, 온도 센싱도 해서 화면에 보여주면 좋겠다 생각을 했습니다. 그럼 만들면 되지요.

필요한 것들을 생각해 봅니다.

LCD 디스플레이, 팬, 온도 센서, 가변저항, 아두이노...

 

그럼 메인 컨트롤러는 제일 많이 갖고 있고, 크기도 적당히 작은 아두이노 프로 미니 3.3V 8MHz짜리를 쓰기로 합니다.

자, 일단 LCD는 여러 개 갖고 있는 제일 평범한 16x2 캐릭터 LCD를 쓰기로 하고, 온도 센서는 검색했더니 온습도 센서가 저렴한 게 있어서 구입. 팬 속도 조절할 거니까 4핀짜리 팬 하나 구하고, 속도 조절을 위해서는 가변 저항 하나 쓰기로 합니다.

제일 흔해 빠진 16x2 캐릭터 LCD
2천원짜리 온습도 센서 DHT11

전원은 외부에서 24V를 받아서 12V로 변환해서 이걸로 장치들에 공급하기로 해서 제일 만만한 7812를 쓰기로 했습니다.

L7812CV

컨셉은 잡았으니, 어떤 형태가 될 지 스케치업으로 그려보았습니다. 3D 프린터가 있으니 케이스 제작까지 쉽게  할 수 있어 DIY로 뭔가 만들기가 한결 편해졌습니다.

 

 

납땜하고 테스트 중 ...

 

조립에 꼭 필요한 기구 부품만 출력해서 조립까지 완료. 아직 케이스 부품 큰 거 하나 더 필요한데, 일단 이 정도만 해도 확인하는 데엔 충분합니다.

 

최종적으로 프로그램까지 마무리하고 시험 구동 화면 한 컷.

기능 설명을 하자면 ...

  1. (LCD) 현재의 팬 속도(RPM)을 읽어서 디스플레이
  2. (LCD) 팬속도 조절을 PWM duty cycle (%)로 표현
  3. (LCD) 온도값
  4. (LCD) 습도값
  5. (슬라이드 스위치) LCD의 백라이트 on/off
  6. (가변저항) 팬속도 조절
  7. (록커스위치) 별도로 연결할 12V LED바 on/off

  회로도도 첨부해 봅니다.

(누르면 좀 크게 보일 겁니다)

처음부터 완성형은 아니고, 테스트해가면서 핀 배치 좀 바꾸면서 최종적으로 마무리한 버전입니다.

LCD 디스플레이는 데이터 입출력을 위한 8핀 중에 D4~D7까지 4핀만 있어도 쓸 수 있고, 컨트롤을 위한 EN, RS 신호를 적당히 디지털 I/O에 연결하면 됩니다. (합계 6핀)
LCD 디스플레이의 컨트라스트를 조절을 위한 작은 가변 저항 하나 썼고요.

온습도 센서가 아날로그 입력인 줄 알고, 아날로그 핀에 연결했는데 실제 동작은 디지털 I/O에서 동작하더군요. 아두이노 사양을 보면 아날로그 입력 단자를 아날로그로만 써야 할 것처럼 쓰여 있는데, 실제로 디지털 I/O로도 동작합니다.

팬속도 조절하기 위한 가변저항은 0V와 아두이노의 VCC 출력단을 연결하고, 가변값을 아날로그 입력에 연결했습니다.

팬의 4핀중에 12V, GND를 제외하고 RPM핀 (3번)은 D2, PWM핀 (4번)은 PWN 출력이 가능한 D3에 연결하였습니다. 그냥 별 생각없이 연결했는데, RPM핀은 D2 연결했어야 하더라고요. 이건 소스 부분에서 설명하겠습니다.

아두이노 전원은 외부 24V 받아서 L7812CV로 변환한 12V를 입력으로 삼았습니다.

이 정도 회로 구성하고 각 구성품 별로 테스트를 했습니다. 작업한 순서는 다음과 같았습니다.

  1. LCD 디스플레이 예제 불러다가 테스트
  2. 온습도 센서 예제 불러다가 LCD에 표시
  3. 가변저항 변경하면서 그 값을 팬의 속도 조절하는 PWM 출력으로 변경하고 화면 표시
  4. 팬 RPM 값 읽어서 표시하기
  5. 위의 값들을 보기 좋게 배치하기

이 중에 3번이 설명할 게 좀 있는데, 그냥 말로 풀어보면...

아날로그 입력에 연결된 가변저항의 값을 읽어서 (0~1023) 최대값인 1023으로 나누어서 100을 곱하면 PWM duty cycle이 %로 표현될 겁니다. 해당값들을 int로 정의한 변수에 적당히 배치하고 곱하고 나누면 된다. 쉽지요? 그런데, 이게 원하는 동작을 안 합니다. 시리얼 콘솔이나 LCD에 나타난 duty cycle 값이 음수(-)가 나오는 겁니다. 헐. 이게 뭐지?

일단, 아날로그 입력 0~1023값을 1023으로 나누는 데서 말썽이 시작입니다. 정수이기 때문에 0~1023을 1023으로 나누면 그 결과는 대부분 0으로 변환이 되어 버립니다. 그나마 입력값이 1023이 되어야 1이 간신히 됩니다.

그럼, 입력값에 먼저 100을 곱하면 될 것 같지요? 그렇게 100을 먼저 곱하고 1023으로 나누면 음수(-)가 나오는 걸 목결할 겁니다. 헐! 1023 * 100이 얼마 안 큰 수 같지만, 이게 정수의 범위를 벗어나 버립니다. 정수는 기껏해야 -32768~32767까지 밖에 안 됩니다. 그래서, 이 부분을 다 해결하기 위해서는 변수를 unsigned long으로 해야 우리가 원하는 계산값이 나옵니다. 이걸 생각 안 하고 팬 PWM에 넣다 보면, 0%에서 차근차근 올리다 보면 갑자기 팬이 윙~ 속도가 높아지고 어느 정도 더 올리면 다시 정상 동작합니다. 이것만 해결하면 PWM 출력은 쉽고요.

RPM 읽는 것은 아두이노의 인터럽트 기능을 써야 합니다. 전에 적외선 센서를 이용한 모터 RPM 카운터를 만들어 본 적이 있어서 어렵지 않게 응용할 수 있었습니다.

2016.08.25 - [디지털 라이프 電子的生活 My Digital Life/아두이노 (Arduino)] - 아두이노로 RPM 카운터를 만들었습니다.

 

아두이노로 RPM 카운터를 만들었습니다.

굴러가는 모형에 관심을 갖고 모터를 다루다 보니, 모터의 회전수에 대한 감을 좀 잡을 필요가 있을 것 같습니다. 대략 이 정도 회전수면 얼마나 빠른 건지 말이죠. 그래서, RPM 카운터에 대해 검

crazydoc.tistory.com

사실 회로 구성할 때, 아무 생각 없이 디지털 I/O에 연결한 건데, 마침 2번 핀에 연결이 되었네요. 아두이노의 여러 디지털 I/O 핀 중에 인터럽트로 쓸 수 있는 핀 중 하나죠. ㅋㅋ

예전에 이것저것 만들어 본 적이 있는 지라 이번 프로그래밍은 두어시간 만에 마무리할 수 있었습니다. 이번에 만든 소스도 첨부하지요.

chamber_controller.ino
0.00MB

 

아, LCD 백라이트 on/off 스위치는 이 장치를 켜놓고 잠이 들 때 너무 환하지 말라고 슬라이드 스위치 하나 달았습니다. 이게 꺼져도 적당히 볼 수 있어서 이 기능 넣기를 잘 한 것 같아요.

 

이 정도로 해서 컨트롤러 부분을 완성한 것 같습니다. 케이스 일부를 하나 더 출력해야 하는데, 이번 주말에 출력해 볼까 합니다. 그리고 이제 이 프로젝트의 몸통을 시작해야겠지요.

일단 뭔지는 아직 공개되지 않은 프로젝트의 일부를 준비했습니다.

다음 작업을 이번 주말에 시작할 수 있으면 좋겠네요.

그럼 이번 글은 여기까지~!

반응형