자동 팬 조절

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

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

참고 : http://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 에서 사용하던 플러그인과 충돌이 있어서 온도 구하는 부분을 조금 수정하였습니다.
http://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

Notice

  • 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스
  • 저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.
  • 댓글에 대한 답변은 늦을 수도 있습니다.
  • Retroarch 등의 게임 설정에 대한 질문들은 답변이 힘들 수 있습니다.
  • 답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다