얼마전부터 취미생활을 위해 Ender-5 3D 프린터를 사용중인데요.
라즈베리파이에 옥토프린트를 설치하여 꽤 편리하게 3D 출력작업을 진행하고 있습니다.
재택근무중 방에서 출력을 하게되면 챔버의 팬 소음이 시끄러워서, 평소에는 팬을 끄고 사용하게 되는데요.
PLA를 주로 사용하기는 하지만, 뭔가 찝찝하여 특정 온도(35도) 이상이 되면 자동으로 팬이 동작하도록 설정해 보았습니다.
기존에 포스팅한것처럼, 제 라즈베리파이에는 릴레이 스위치와 DHT22 온습도계가 연결되어 있습니다.
온도를 측정하여 특정온도 이상/이하가 되면, 릴레이 스위치를 통해 On/Off하는 구조입니다.

import sys
import board
import adafruit_dht
import RPi.GPIO as GPIO
from time import sleep
DHT_DEVICE = adafruit_dht.DHT22(board.D4)
FAN_GPIO = 23
PREV_FAN = 'off'
CURRENT_FAN = 'off'
TARGET_TEMP = 35.0
CURRENT_TEMP = 0.0
def setup():
print('Target Temp : ' + str(TARGET_TEMP))
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_GPIO,GPIO.OUT)
def fanOff():
CURRENT_FAN = 'off'
GPIO.output(FAN_GPIO,True)
def fanOn():
CURRENT_FAN = 'on'
GPIO.output(FAN_GPIO,False)
if __name__ == "__main__":
setup()
while 1:
try:
CURRENT_TEMP = DHT_DEVICE.temperature
if (CURRENT_TEMP > TARGET_TEMP) :
fanOn()
else :
fanOff()
if PREV_FAN != CURRENT_FAN :
print('currentTemp:' + str(CURRENT_TEMP) + ', targetTemp:' + str(TARGET_TEMP) + ', PREV_FAN:' + PREV_FAN + ', CURRENT_FAN:' + CURRENT_FAN)
PREV_FAN = CURRENT_FAN
sleep(60)
except KeyboardInterrupt:
print('\nTerminate !!')
GPIO.cleanup()
except:
print("Unexpected error:", sys.exc_info())
pass시스템 시작시 자동으로 실행되게 하기 위해 rc.local에 등록하였습니다.
sudo vi /etc/rc.local
sudo python3 /home/pi/kimstar/autoFanControl.py &
2021-05-22 수정사항
기존에 octoprint 에서 사용하던 플러그인과 충돌이 있어서 온도 구하는 부분을 조금 수정하였습니다.
https://kimstar.kr/9284/ 에서 설명한 인클로져 플러그인의 온도 구하는 부분을 호출하는 방식입니다.
import sys
#import board
#import adafruit_dht
import time
import RPi.GPIO as GPIO
from subprocess import Popen, PIPE
FAN_GPIO = 23
PREV_FAN = 'off'
CURRENT_FAN = 'off'
TARGET_TEMP = 35.0
CURRENT_TEMP = 0.0
SLEEP_TIME_SEC = 60
def setup():
print('Target Temp : ' + str(TARGET_TEMP))
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_GPIO, GPIO.OUT)
def fanOff():
CURRENT_FAN = 'off'
GPIO.output(FAN_GPIO,True)
def fanOn():
CURRENT_FAN = 'on'
GPIO.output(FAN_GPIO,False)
def getTemperature():
#dhtDevice = adafruit_dht.DHT22(board.D4)
#temp = dhtDevice.temperature
#dhtDevice.exit()
#return temp
cmd = "python3 /home/pi/oprint/lib/python3.7/site-packages/octoprint_enclosure/getDHTTemp.py 22 4"
stdout = (Popen(cmd, shell=True, stdout=PIPE).stdout).read()
temp = stdout.decode("utf-8").split("|")[0].strip()
if (temp == "-1") :
raise Exception('Unable to measure temperature.')
return float(temp)
if __name__ == "__main__":
setup()
while 1:
try:
CURRENT_TEMP = getTemperature()
print('currentTemp:' + str(CURRENT_TEMP) + ', targetTemp:' + str(TARGET_TEMP) + ', PREV_FAN:' + PREV_FAN + ', CURRENT_FAN:' + CURRENT_FAN)
if (CURRENT_TEMP > TARGET_TEMP) :
fanOn()
else :
fanOff()
if PREV_FAN != CURRENT_FAN :
print('currentTemp:' + str(CURRENT_TEMP) + ', targetTemp:' + str(TARGET_TEMP) + ', PREV_FAN:' + PREV_FAN + ', CURRENT_FAN:' + CURRENT_FAN + ', FAN:' + CURRENT_FAN)
PREV_FAN = CURRENT_FAN
time.sleep(SLEEP_TIME_SEC)
except KeyboardInterrupt:
print('\nTerminate !!')
GPIO.cleanup()
sys.exit(1)
except Exception as e:
print("Unexpected error:", e)
time.sleep(SLEEP_TIME_SEC)
pass
2022-03-13 수정사항
계절에 따라 온도 편차가 있다 보니, 온도에 따라 팬 동작이 안될때가 있네요.
그냥 간단하게 타이머로 주기적으로 팬이 동작하도록 수정하였습니다.
아래 코드는 600초마다 30초씩 팬이 가동하는 코드입니다.
import sys
import RPi.GPIO as GPIO
import threading
import time
FAN_GPIO = 23
FAN_CYCLE_SEC = 600
FAN_ON_SEC = 30
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_GPIO, GPIO.OUT)
def fanOff():
GPIO.output(FAN_GPIO,True)
threading.Timer(FAN_CYCLE_SEC, fanOff).start()
def fanOn():
GPIO.output(FAN_GPIO,False)
threading.Timer(FAN_CYCLE_SEC, fanOn).start()
if __name__ == "__main__":
try:
setup()
fanOn()
time.sleep(FAN_ON_SEC)
fanOff()
except KeyboardInterrupt:
print('\nKeyboardInterrupt !!')
GPIO.cleanup()
sys.exit(1)
except Exception as e:
print("\nUnexpected error:", e)
GPIO.cleanup()
sys.exit(1)


