temperatura - ¿Cómo puedo controlar un ventilador con GPIO en una Raspberry Pi 3 usando Python?
ventilador gpio raspberry (1)
Estás muy cerca. Estas dos líneas son problemáticas:
temp = os.popen(''vcgencmd measure_temp'').readline()
if temp > 65:
Aquí, la temp
es una cadena. temp
convertir la temp
en un número entero antes de intentar compararla con un número entero. Suponiendo que la línea que está leyendo es solo una cadena decimal correspondiente a alguna temperatura, simplemente llame a int()
, de esta manera:
temp = os.popen(''vcgencmd measure_temp'').readline()
temp = int(temp)
Actualización Puesto que ha publicado la salida que realmente está tratando de analizar, podemos usar expresiones regulares para hacer coincidir la salida, con el módulo re
. También pondremos esto en una función:
def measure_temp():
raw = os.popen(''vcgencmd measure_temp'').readline()
m = re.match("temp=(/d+/.?/d*)''C", raw)
if not m:
raise ValueError("Unexpected temperature string: " + raw)
return float(m.group(1))
temp = measure_temp()
Tenga en cuenta que utilicé un grupo de captura alrededor del decimal de temperatura real en la cadena, y m.group(1)
a él usando m.group(1)
.
Vamos a armarlo ahora. Además, cuando su código no está haciendo lo que espera, es extremadamente útil incluir algunas "impresiones de depuración", como esta:
def measure_temp():
raw = os.popen(''vcgencmd measure_temp'').readline()
m = re.match("temp=(/d+/.?/d*)''C", raw)
if not m:
raise ValueError("Unexpected temperature string: " + raw)
return float(m.group(1))
temp = measure_temp()
print ''Temperature from vcgencmd: {}''.format(temp)
if temp > 65:
print ''Turning on GPIO 4''
GPIO.output(4, True)
else:
print ''Turning off GPIO 4''
GPIO.output(4, False)
Una vez que tenga los conceptos básicos funcionando, hay algunas otras cosas con las que se encontrará:
Su secuencia de comandos comprueba la temperatura y alterna GPIO una vez . Si quieres que esto funcione como un termostato, vas a necesitar seguir haciendo estas acciones, usando un ciclo while.
Si su bucle while funciona muy rápido, y la temperatura fluctúa justo alrededor de su punto de ajuste (65), encontrará su código rápidamente encendiendo / apagando el ventilador. Puede ayudar agregar un poco de histéresis al sistema. Por ejemplo, si configura su termostato de hogar (calefacción) a 70 grados, puede encenderse a 69, pero apagarse a 71. O simplemente puede no cambiar los estados si ya ha cambiado los estados en los últimos X segundos.
La solución más simple sería sleep()
durante un corto período de tiempo entre chequeos:
while True: # Loop forever
# Read the current temperature
temp = os.popen(''vcgencmd measure_temp'').readline()
temp = int(temp)
print ''Temperature from vcgencmd: {}''.format(temp)
# Control the fan
if temp > 65:
print ''Turning on GPIO 4''
GPIO.output(4, True)
else:
print ''Turning off GPIO 4''
GPIO.output(4, False)
# Wait before the next iteration
time.sleep(5)
Intento básicamente escribir un script simple que le diga al ventilador (enchufado en el pin 4 en el GPIO) que se encienda a una cierta temperatura, y en todo caso, apague el ventilador. Estoy empezando con algo simple solo para ver si puedo controlar el ventilador según la temperatura. Esto es lo que tengo hasta ahora:
import os
from time import sleep
import signal
import sys
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
temp = os.popen(''vcgencmd measure_temp'').readline()
if temp > 65:
GPIO.output(4, True)
else:
GPIO.output(4, False)
Cuando ejecuto esto, o parece que se ejecuta pero el ventilador no se apaga a pesar de que la temperatura no ha alcanzado casi el nivel que escribí, o me dirá que el pin ya está en uso, pero continuará de todos modos. De cualquier manera, el ventilador sigue funcionando independientemente de la temperatura actual.
vgencmd regresa como: temp-37.0''C
¿Cómo eliminaría los caracteres no numéricos, así que estoy atascado con un int? Cuando lo ejecuto, obtengo esto:
ValueError: invalid literal for int() with base 10: "temp=37.6''C/n"
NOTA: Algunos de los módulos importados aún no están en uso, por eso están ahí.