Светодиодный индикатор управления Raspberry Pi основан на температуре процессора с помощью Python

Мне нужна помощь, чтобы этот код Python работал с моим Raspberry Pi. Цель состоит в том, чтобы включить 1 из 3 светодиодов одновременно (зеленый, желтый и красный) в зависимости от температурного диапазона процессора.

Это означает:

  • Зеленый светодиод должен загораться, когда диапазон температур ниже 32ºC.
  • Красный светодиод горит, если температура выше 37ºC.
  • Затем загорается желтый светодиод, если температура выше 31ºC или ниже 37ºC.

Я новичок в программировании, пока что я могу получить температуру для печати, и только красный светодиод включается и остается включенным независимо от температуры процессора.

import os
import time
import RPi.GPIO as GPIO


#GREEN=11
#YELLOW=10
#RED=9

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(10,GPIO.OUT)
GPIO.setup(9,GPIO.OUT)


def measure_temp():
        temp = os.popen("vcgencmd measure_temp").readline()
        return (temp.replace("temp=","").replace("'C",""))

while True:
        measure_temp()
        if measure_temp<32:
            GPIO.output(11,GPIO.HIGH)
            GPIO.output(10,GPIO.LOW)
            GPIO.output(9,GPIO.LOW)
        if measure_temp>37:
            GPIO.output(9,GPIO.HIGH)
            GPIO.output(10,GPIO.LOW)
            GPIO.output(11,GPIO.LOW)
        if measure_temp>32 or <37
            GPIO.output(10,GPIO.HIGH)
            GPIO.output(11,GPIO.LOW)
            GPIO.output(9,GPIO.LOW)
            print(measure_temp())

#cleanup
c.close()
GPIO.cleanup()

person Merkava    schedule 02.03.2021    source источник


Ответы (1)


Классный проект и твой код рядом.

Я думаю, основная проблема в том, что вы получаете string из vcgencmd и пытаетесь сравнить это с числом. Я бы пошел с чем-то вроде этого (непроверенный):

#!/usr/bin/env python3

import os
import re
import time
import RPi.GPIO as GPIO

RED, YELLOW, GREEN = 9, 10, 11

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(RED,GPIO.OUT)
GPIO.setup(YELLOW,GPIO.OUT)
GPIO.setup(GREEN,GPIO.OUT)


def measure_temp():
        output = os.popen("vcgencmd measure_temp").readline()
        # Remove anything not like a digit or a decimal point
        result = re.sub('[^0-9.]','', output)
        return float(result)

while True:
        temp = measure_temp()
        if temp<32:
            GPIO.output(GREEN,GPIO.HIGH)
            GPIO.output(YELLOW,GPIO.LOW)
            GPIO.output(RED,GPIO.LOW)
        elif temp>37:
            GPIO.output(RED,GPIO.HIGH)
            GPIO.output(GREEN,GPIO.LOW)
            GPIO.output(YELLOW,GPIO.LOW)
        else:
            GPIO.output(YELLOW,GPIO.HIGH)
            GPIO.output(GREEN,GPIO.LOW)
            GPIO.output(RED,GPIO.LOW)
        print(temp)
        # Let's not affect our temperature by running flat-out full-speed :-)
        time.sleep(1)

#cleanup
c.close()
GPIO.cleanup()

Обратите также внимание на использование elif, что упрощает тестирование последнего из трех случаев.

Я также выбрал regex, чтобы извлечь число из строки vcgencmd, потому что текст может меняться в зависимости от интернационализации — здесь YMMV.

person Mark Setchell    schedule 03.03.2021
comment
Большое спасибо, что нашли время, чтобы исправить мой код. Все работает ОТЛИЧНО, как я и хотел. Будьте здоровы!! - person Merkava; 03.03.2021