2017-01-24 31 views
3

Я пытаюсь в основном написать простой скрипт, который будет сообщать вентилятору (подключенному к выходу 4 на GPIO), чтобы включить его при определенном темпе, а если что-то еще, выключите вентилятор. Я начинаю с чего-то простого, просто чтобы проверить, могу ли я управлять вентилятором по температуре. Вот то, что я до сих пор:Как я могу управлять вентилятором с GPIO на малине Pi 3 с помощью Python?

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) 

Когда я запускаю это, как представляется, работать, но вентилятор не выключается, даже если температура не почти достигла уровня, который я написал, или это будет скажите, что штырь уже используется, но он будет продолжаться в любом случае. В любом случае, вентилятор по-прежнему работает независимо от текущей температуры.

vgencmd возвращается как: Темп-37.0'C

Как бы удалить нечисловых символов, так что я застрял с межд? Когда я исполняю его я получаю это:

ValueError: invalid literal for int() with base 10: "temp=37.6'C\n" 

ПРИМЕЧАНИЕ: Некоторые из импортируемых модулей не используются еще, вот почему они там.

+2

Я не знаю, будет ли это исправить что-либо, но вам нужно преобразовать темп к междунар, прежде чем сравнивать его , Попробуйте: 'if int (temp)> 65:' Кроме того, вы не запускаете что-либо в цикле, поэтому он будет выполняться один раз и заканчивать. Попробуйте выполнить последние 5 строк (включая температуру чтения) внутри цикла while с задержкой .1s – GRAYgoose124

+1

Это не форум, вам не нужно извиняться за недостаток опыта. Я бы рекомендовал упростить свой вопрос и спросить, что вы на самом деле пытаетесь выполнить «как я могу управлять поклонником GPIO на малине Pi 3». – Soviut

+0

См. Мое обновление, где я добавил 'measure_temp()'. –

ответ

4

Вы очень близко. Эти две линии являются проблематичными:

temp = os.popen('vcgencmd measure_temp').readline() 

if temp > 65: 

Здесь temp строка. Вам необходимо преобразовать temp в целое число, прежде чем пытаться сравнить его с целым числом. Предполагая линию, которую вы сейчас читаете это просто десятичная строка, соответствующая некоторой температуре, вы просто звоните int(), как это:

temp = os.popen('vcgencmd measure_temp').readline() 
temp = int(temp) 

Update Поскольку вы выложили выход вы на самом деле пытаетесь parse, мы можем использовать регулярные выражения для соответствия выводам с re module. Мы также поставить это в функции:

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() 

Обратите внимание, что я использовал захвата группу вокруг фактической температуры десятичного в строке, и доступе к нему с помощью m.group(1).


Давайте перейдем сейчас. Кроме того, если ваш код не делать то, что вы ожидаете, это чрезвычайно полезно включить некоторые «отладочные отпечатки», как это:

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) 

После того, как вы получите основы работает, есть несколько других вещей, на которые вы столкнетесь:

Ваш скрипт проверяет температуру и переключает GPIO раз. Если вы хотите, чтобы эта вещь работала как термостат, вам нужно будет продолжать делать эти действия, используя цикл while.

Если while цикл работает очень быстро, и температура колеблется прямо вокруг заданного значения (65), вы собираетесь найти свой код быстро поворачивая вентилятор вкл/выкл. Это может помочь добавить бит hysteresis в систему.Например, если вы установили домашний термостат (нагрев) на 70 градусов, он может загореться на 69, а выключить на 71. Или он может просто не изменять состояния, если он уже изменил состояния в течение последних X секунд.

Самым простым решением было бы sleep() в течение короткого периода времени между проверками:

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)