Вы очень близко. Эти две линии являются проблематичными:
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)
Я не знаю, будет ли это исправить что-либо, но вам нужно преобразовать темп к междунар, прежде чем сравнивать его , Попробуйте: 'if int (temp)> 65:' Кроме того, вы не запускаете что-либо в цикле, поэтому он будет выполняться один раз и заканчивать. Попробуйте выполнить последние 5 строк (включая температуру чтения) внутри цикла while с задержкой .1s – GRAYgoose124
Это не форум, вам не нужно извиняться за недостаток опыта. Я бы рекомендовал упростить свой вопрос и спросить, что вы на самом деле пытаетесь выполнить «как я могу управлять поклонником GPIO на малине Pi 3». – Soviut
См. Мое обновление, где я добавил 'measure_temp()'. –