Pregunta:
¿Cómo controlo el ventilador conectado a GPIO mediante código a una determinada temperatura de CPU?
Peter Swiggs
2017-02-20 17:20:00 UTC
view on stackexchange narkive permalink

Acabo de comprar un ventilador Pi de 5v para mi Pi3. Estoy usando Retropie 4.1 para el sistema operativo. He conectado los cables rojo y negro del ventilador a tierra y GPIO 18 respectivamente.

¿Cómo puedo hacer que el ventilador se encienda cuando la temperatura de la CPU alcanza una cierta temperatura?

I He leído un tutorial sobre thepihut, pero hay una resistencia involucrada (entiendo cómo funciona y puedo averiguar la parte del código). Quiero usar la temperatura de la CPU del Pi3 para controlar el encendido o apagado del ventilador (si el sistema operativo puede leer la temperatura de la CPU, por supuesto). No me preocupa la velocidad del ventilador todavía, solo quiero que el ventilador se encienda cuando la CPU esté a 45 ° C o más.

El siguiente sitio web ( hackernoon) utiliza un relé para crear el controlador temporal y eso está en el código.

Sé que necesito cambiar la forma el ventilador está conectado al Pi; lo que me desconcierta es el código.

Dudo que exista algo así como un "ventilador Pi de 5v 0.2ma", pero si hubiera una cantidad de aire que podría moverse con 1mW de potencia es insignificante. Esto no importaría, ya que el Pi no necesita ventilador.
¿Has probado google? Debe haber cientos, si no miles, de artículos que cubran este tema.
Sí, probé Google. Todo el día, de hecho, busqué soluciones en Google. Los 2 sitios web que proporcioné tenían ambas partes del código de mi solución, pero no tengo conocimiento de cómo combinarlas para usar el código para mi fan. También gracias a @sir_ian y su respuesta. Puedo comenzar a probar el código y progresar en mi conocimiento y utilizar mejor la información que encuentro en google.better.
Cinco respuestas:
sir_ian
2017-02-20 20:16:08 UTC
view on stackexchange narkive permalink
  from gpiozero import LED # estamos usando el submódulo LED solo como un outputfan = LED (18) genérico # para el positivo, ponga el negativo en uno de la definición de terreno cputemp (): f = open ("/ sys / class / Thermal / Thermal_zone0 / temp") CPUTemp = f.read () f.close () StringToOutput = str (int (CPUTemp) / 1000) while True: cputemp () if StringToOutput > = 45: fan.on () elif StringToOutput < 45: fan.off  

Este es un código bastante simple que obtiene la temperatura de / sys / class / Thermal / Thermal_zone0 / temp en milésimas Celsius divide por 1000 para Celsius y comprueba si es más de 45. Si lo es, enciende el "ventilador" y si no, permanece apagado. Pero es casi seguro que nunca necesitará un fan siempre y cuando no esté haciendo nada estúpido.

Este código fue adaptado de una pregunta SE pero no estoy seguro de cuál.

Muchas gracias por esto, el código es brillante y es un comienzo perfecto para mi propio crecimiento dentro del área pi. Actualmente estoy a punto de comenzar mi retropie desde cero debido a que la configuración en el arco retro es confusa. más fácil de empezar por defecto. Probaré el código una vez que haya escrito la imagen en la tarjeta SD y haya actualizado todo. Informaré de mi éxito o problemas.
No he tenido la oportunidad de probar este script, pero ¿no se ejecutará el bucle muchas veces por segundo? ¿No debería haber algo como `sleep (x)` (importado por supuesto `de time import sleep`) para que solo se verifique una vez cada x segundos?
ben_nuttall
2017-03-19 03:51:39 UTC
view on stackexchange narkive permalink

gpiozero tiene una clase CPUTemperature que le permite controlar fácilmente los dispositivos en función de la temperatura de funcionamiento de la Pi. Y debería usar OutputDevice para controlar el ventilador:

  from gpiozero import OutputDevice, CPUTemperaturefan = OutputDevice (18) cpu = CPUTemperature () while True: if cpu. temperatura > 45: fan.on () else: fan.off ()  
b_laoshi
2017-08-05 15:34:27 UTC
view on stackexchange narkive permalink

Uso de PWM y un transistor NPN
Permítanme comenzar diciendo que no soy ingeniero eléctrico. Si alguien que sabe más ve un problema con lo que presento, ¡por favor comente !

Encontré un excelente artículo para hacer esto con un Arduino aquí. Yo también, sin embargo, estoy usando una RaspberryPi (RPi3). Una preocupación que he visto señalada es que extraer energía de GPIO18 para hacer funcionar el ventilador puede tener consecuencias adversas. En cambio, lo que propongo a continuación es sacar el 5v de un pin RPi de 5v. Luego use PWM y cambie para controlar el paso del 5v al ventilador.

Esto es lo que usé: resulta que vivo en China, y el costo total, con envío, para estas partes (múltiplo de cada una) fue menos de $ 2 (USD). Tal vez busque en Alibaba.

  • 1x ventilador de 5v
  • 1x resistencia de 330 ohmios
  • 1x transistor NPN (2N4401)
  • 1x diodo (1N4001)
  • 1x Raspberry Pi

Conecta el ventilador a la Raspberry Pi usando el siguiente circuito:
Prepárate para soldar. Pude soldar todos los componentes juntos, envolverlos alrededor del ventilador y aún así poner el ventilador dentro de mi carcasa RPi. La descripción del caso dice que el ventilador está silencioso. ¡Eso es mentira y por eso lo ejecuto a 65% de velocidad!

schematic

simular este circuito - Esquema creado usando CircuitLab

  • 5v se conecta al pin 2 o 4
  • tierra se conecta al pin 6
  • PWM se conecta al pin 12 (GPIO 18)

Lea el enlace a las instrucciones de Arduino anteriores para obtener información más detallada de lo que está sucediendo.

Instalación de software:
Para ejecutar el ventilador, instalé la biblioteca pigpio. Puede instalar esta biblioteca desde la terminal de la siguiente manera:

  • Dependencias: sudo apt-get install build-essential
  • Descargar pigpio: wget abyz.me.uk/rpi/pigpio/pigpio.zip
  • Descomprimir: descomprimir pigpio.zip && cd PIGPIO
  • Construir e instalar: make && sudo make install

Ahora tenemos el programa que usaremos para controlar el ventilador a través de PWM.

Ejecutando el ventilador:
puede crear un nuevo script de bash con el siguiente contenido. Y configúrelo para ejecutar @reboot en el crontab de root. Modifica las variables al principio del script a tu gusto. Si desea ver lo que está sucediendo, configure DEBUG = 1 y la información se escribirá en / tmp / debug . Sin embargo, no dejaría esto encendido una vez que haya confirmado que todo está funcionando, ya que esto realizaría escrituras innecesarias en su tarjeta SD. Esta secuencia de comandos asume que tienes Python instalado.

Descargo de responsabilidad: he estado ejecutando mi RPi3 con esta secuencia de comandos durante más de 17 meses a partir de enero de 2019. Si estas configuraciones o cualquier configuración que utilices, quema tu ventilador o causar daño a su Raspberry Pi, no me hago responsable. ¡Utilice y realice cambios bajo su propio riesgo!

  #! / Bin / bashfanSpeed ​​= 65 # haga funcionar el ventilador al 65% de velocidad; el mío era demasiado ruidoso al 100%. ¡Tenga cuidado de no configurar esto demasiado bajo, o su ventilador puede no girar! UmbralF = 135 # Encienda el ventilador cuando estemos por encima de este umbral de temperaturaC = $ (/ usr / bin / python -c "print ($ umbralF-32) /1.8")DEBUG=0function debug {[$ DEBUG -eq 1] && echo "[$ (fecha +% m% d.% H% M% S)] $ 0: $ @" >> / tmp / debug} función set_fan {porcentaje = $ 1 # valor entero GPIO = 18 # número de pin GPIO; 18 es frecuencia PWM de hardware = 25000 # Esta es la frecuencia de la señal PWM; aumenta si escuchas un quejido de depuración "configurando PWM en GPIO $ GPIO en $ {percent}%" [$ percent -gt 0] && / usr / local / bin / pigs hp $ GPIO $ freq 1000000 # enciende el ventilador antes de arrancar dormir atrás 1 / usr / local / bin / pigs hp $ GPIO $ freq $ (/ usr / bin / python -c "imprimir 10000 * $ percent")} función get_temp {echo "$ (/ opt / vc / bin / vcgencmd medir_temp | grep -oP "\ d +. \ d") "}
# devuelve 1 si estamos por encima de nuestro umbral o 0 si no tenemos la función is_too_hot {echo $ (/ usr / bin / python -c "print 1 if $resholdC< $ (get_temp) else 0")} debug "iniciado el script del ventilador "# iniciar el demonio pigpiod si aún no se está ejecutando [$ (pidof pigpiod | wc -l) -eq 0] && / usr / local / bin / pigpiod && debug" el servicio pigpiod inició "debug" umbral F: $ umbralF "debug C: $ umbralC "# inicia un ciclo para continuar verificando la temperatura de la CPU y cambiando el ventilador según sea necesariostate = off while: do while [$ (is_too_hot) -eq 1] do if [" $ state "==" off "]; luego depurar "encender el ventilador: $ (get_temp) (temperatura de la CPU) > $ umbralC (umbral)" set_fan $ fanSpeed ​​&& state = "on" # encender el ventilador fi sleep 300 # hacer funcionar el ventilador durante 5 minutos antes de verificar la temperatura de nuevo hecho si ["$ state" == "on"]; luego depura "apagando el ventilador: $ (get_temp) (temperatura de la CPU) < = $ umbralC (umbral)" set_fan 0 && state = "off" fi sleep 60 # espera un minuto antes de volver a comprobar la temperatura  

No es difícil imaginar cómo se podría modificar este script para hacer funcionar el ventilador a diferentes velocidades para diferentes temperaturas.

Hola y bienvenido. Tenga en cuenta que el circuito tiene un gran inconveniente: el transistor en el * lado alto * (cerca de + voltaje con respecto a la carga) no es un circuito útil con un transistor NPN. Desafortunadamente, es algo viral y se publica con frecuencia, pero sigue siendo incorrecto. Conecte el emisor (la flecha) a tierra y coloque la carga (ventilador) entre el colector y + 5V. Ver https://raspberrypi.stackexchange.com/a/28201/19949
¡@Ghanima era correcto! ¡No tenía el circuito dibujado correctamente! El circuito corregido ahora se muestra arriba. No sé qué estaba mirando cuando lo dibujé inicialmente, ¡pero no es posible que haya estado mirando el circuito que había armado!
¿Por qué usas 330 ohmios? ¿Cuánta corriente considera con cuánto hFE?
Esto fue simplemente una adaptación de una [guía de Arduino] (https://static.sparkfun.com/learn/materials/44/DC_motor_circuits_notes_2up.pdf) para lograr lo mismo. Solo usé la misma resistencia que mostraban en sus diagramas. Su artículo decía que usaba una resistencia de 220 o 330 ohmios. Seré el primero en admitir que tengo un conocimiento limitado sobre los circuitos. Si puede sugerir mejoras en otro comentario con una explicación (para que pueda aprender algo nuevo). Con mucho gusto actualizaré mi respuesta.
@b_laoshi Gracias por tu comentario. En cuanto a los circuitos, estoy estudiando ahora. Cuando entienda la ecuación, escribiré el comentario sobre el valor de resistencia.
Hossein RM
2017-12-27 14:17:06 UTC
view on stackexchange narkive permalink

También vi ese tutorial, no funcionó correctamente, así que lo arreglé y ahora ha pasado aproximadamente un mes y está funcionando bien. Hice un video de youtube al respecto, para consulte las conexiones y el tutorial paso a paso haga clic en >> este enlace. de hecho, en ese video, te mostraré cómo hacer que se inicie automáticamente al iniciarse.

En este método, usa un transistor S8050 , y esto es código fijo:

  #! / usr / bin / env python3 # coding: utf-8import osimport timeimport signalimport sysimport RPi.GPIO as GPIOpin = 36 # El pin ID, edítelo aquí para cambiarlomaxTMP = 50 # La temperatura máxima en grados Celsius después de la cual activamos fanGPIO.setmode (GPIO.BOARD) def setup (): GPIO.setmode (GPIO.BOARD) GPIO.setup (pin, GPIO.OUT) GPIO.setwarnings (False) return () def getCPUtemperature (): res = os.popen ('vcgencmd measure_temp'). readline () temp = (res.replace ("temp =", ""). replace ("'C \ n", "") ) print ("temp is {0}". format (temp)) #comment here for stop testing return tempdef fanON (): setPin (True) return () def fanOFF (): setPin (False) return () def getTEMP ( ): CPU_temp = float (getCPUtemperature ()) if CPU_temp>maxTMP: fanON () else: fanOFF () return () def setPin (modo): # Una pequeña función redundante pero útil si desea agregar registro de GPIO.output (pin, mode) return () try: setup () while True: getTEMP () time. sleep (8) # Lea la temperatura cada 8 segundos, aumente o disminuya este límite si lo desea, excepto KeyboardInterrupt: # atrapar una interrupción de teclado CTRL + C GPIO.cleanup ()  

¡Buena suerte!

Milliways
2020-07-27 05:18:34 UTC
view on stackexchange narkive permalink

Muchas de las otras respuestas eran correctas en ese momento, PERO el kernel ahora incluye capacidades de control de temperatura.
Solo se necesita agregar una línea a cmdline.txt

dtoverlay=gpio-fan,temp=60000

para encender el ventilador a 60 ℃ - 60000 milicelcius (el valor predeterminado es 55 ℃ pero puede seleccionar cualquier temperatura) . El ventilador se apaga cuando la temperatura desciende 10 ℃.

Esto usa la superposición gpio-fan (que ha estado disponible en el kernel desde finales de 2018) y debería incluirse en versiones recientes de Raspbian. (Lea / boot / overlays / README para obtener una descripción de esta y otras superposiciones del árbol de dispositivos).

Consulte https://raspberrypi.stackexchange.com/a/105820 / 8697



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...