Un piccolo programma per il controllo della ventola dal mio raspberry:

#!/usr/bin/env python# FAN control with transistor for Raspberry Pi 3 B+
# Author: Alberto Munarin
# Telegram : @wardialing
# Website: www.munari

# Moduli utilizzati
import time, subprocess, string, datetime
import os
import psutil
import sys

pid = str(os.getpid())
pidfile = “/tmp/fanControl.pid”
outTmpFile=”/tmp/outState.log”

if os.path.isfile(pidfile):
print “%s file esistente” % pidfile
pidRead = int( open(pidfile).read().split()[0])
if psutil.pid_exists( pidRead):
print “Pid %s esistente, esco.” % pidRead
sys.exit()
else:
print “%s file esistente ma pid inesistente” % pidfile
os.unlink(pidfile)

file(pidfile, ‘w’).write(pid)

# Imposto il pin del Raspberry utilizzato
fanPin = 11
# Soglia massima dalla quale attivare la ventola
maxUpTemp = 50
# Soglia minima sopra la quale non si sidattiva la ventola una volta partita,
# questo valore puo’ essere impostato come la soglia massima maxUpTemp es.
# maxLowTemp = maxUpTemp
maxLowTemp = 39
# Tempo minimo di attivazione della ventola in secondi
tempRunningFan = 1200
# Orario dell’ultimo spegnimento della ventola
lastSleepTime = time.time()
# Orario dell’ultima accensione della ventola
lastRunTime = time.time()
# Soglia di tempo massima per mantenere la ventola spenta anche se con temperatura bassa
# 0 per illimitato
maxOffTimeFan = 1200
# Flag di stato ventola
spinOn=False
# Tempo di sleep per la successiva verifica della temperatura in secondi
sleepTime=1
# Attivo il test
#testScriptOn=True
testScriptOn=False

# Import dei moduli GPIO
if testScriptOn == False :
import RPi.GPIO as GPIO

if testScriptOn == False :
# imposto la lettura dello schema della GPIO a BOARD
GPIO.setmode(GPIO.BOARD)
# dico al pin della ventola, quindi 11, che deve lavorare in input
GPIO.setup(fanPin, GPIO.IN)
pinStatus = GPIO.input(fanPin) # leggo lo stato, utile in caso di kill
print “Stato letto all’avvio: “+str( pinStatus)
if ( pinStatus is True):
spinOn=True
else:
spinOn=False

GPIO.setup(fanPin, GPIO.OUT)
# Riga da terminare per simulare il test
# echo -n “temp=39.4’C” >/tmp/temp

try:
while True: # loop
# Leggo la temperatura della CPU e se in test simulo la lettura della temperatura
out = subprocess.check_output([‘/opt/vc/bin/vcgencmd’,’measure_temp’]) if testScriptOn == False else subprocess.check_output([‘/bin/cat’,’/tmp/temp’])
outx = string.split(out, ‘=’)
outy = string.split(outx[1], “‘”)
temp = float(outy[0])
timeNow=time.time()
powerOnTime=lastRunTime+maxOffTimeFan if maxOffTimeFan>0 else timeNow+10
if ( (temp >= maxUpTemp) or ( timeNow > powerOnTime)) and ( spinOn == False) :
if testScriptOn == False :
GPIO.output(fanPin, 1) #chiudo il circuito attivando il transistor
lastRunTime = timeNow
spinOn=True
print “Attivo per temp “+outy[0]
elif ( temp <= maxLowTemp) and ( spinOn == True) and ( timeNow>(lastRunTime+tempRunningFan)) :
if testScriptOn == False :
GPIO.output(fanPin, 0) #riapro il circuito disattivando il transistor
lastRunTime=timeNow
spinOn=False
print “Chiudo per temp “+outy[0]

time.sleep( sleepTime)
out_file = open( outTmpFile,”w”)
out_file.write(time.asctime()+”: Tempo dall’ultimo spin ” + str(round( timeNow-lastRunTime))+”sec Temperatura attuale “+str(temp)+” Ventola attiva = “+str( spinOn))
out_file.close()

print “Tempo dall’ultimo spin ” + str(round( timeNow-lastRunTime))+”sec Temperatura attuale “+str(temp)+” Ventola attiva = “+str( spinOn)

except KeyboardInterrupt:
print “Interruzione keyboard.”
finally:
# Pulisco la cache della GPIO
if testScriptOn == False :
GPIO.cleanup()
print “Cache pulita.”