자동 팬 조절


얼마전부터 취미생활을 위해 Ender-5 3D 프린터를 사용중인데요.
라즈베리파이에 옥토프린트를 설치하여 꽤 편리하게 3D 출력작업을 진행하고 있습니다.
재택근무중 방에서 출력을 하게되면 챔버의 팬 소음이 시끄러워서, 평소에는 팬을 끄고 사용하게 되는데요.
PLA를 주로 사용하기는 하지만, 뭔가 찝찝하여 특정 온도(35도) 이상이 되면 자동으로 팬이 동작하도록 설정해 보았습니다.

기존에 포스팅한것처럼, 제 라즈베리파이에는 릴레이 스위치와 DHT22 온습도계가 연결되어 있습니다.
온도를 측정하여 특정온도 이상/이하가 되면, 릴레이 스위치를 통해 On/Off하는 구조입니다.

참고 : https://kimstar.kr/9284/
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)

광고

댓글 남기기