Как включить / выключить светодиод на основании показаний температуры? - PullRequest
1 голос
/ 25 октября 2019

У меня есть следующий макет DS18B20, подключенный к Arduino, который является рабом Raspberrypi. Я пытаюсь повернуть светодиод 13 на Arduino, когда температура превышает 29 градусов. Единственный способ, которым мне удается это сделать, - это цикл while. Есть ли способ сделать это вне цикла while, но чтобы показания продолжались? Мой код выглядит так:

def led on()
def led off()
def function():
   while True:
       "Get Temp readings from arduino and display them"
       If Temp > 29:
           "Led on"
function()

Потому что внутри цикла while мне это не помогает. Я хотел бы, чтобы что-то вроде, когда светодиод включался, чтобы функция выполнялась один раз, а затем цикл while, чтобы продолжать игнорировать светодиод и просто искать временные показания. Возможно, это не имеет смысла, но, скажем, вместо одного светодиода у меня есть функция, которая будет запускать множество светодиодов по порядку.

1 Ответ

0 голосов
/ 25 октября 2019

Вы пробовали использовать конечные автоматы ?. Это действительно легко и эффективно, используя Python. Просто создайте глобальную переменную состояния и определите состояния, такие как «READING_TEMP», «CHECKING_LED_STATES» и т. Д. Внутри вашего бесконечного времени вы можете включить несколько условий if-then для проверки.

И если вы хотите игнорировать ledВы можете создать другую функцию, например current_led_sate() или is_led_on(). Если у вас несколько светодиодов, возможно, используйте битовую маскировку. Я люблю битовую маскировку, потому что состояние (состояния) светодиодов может быть представлено только с использованием 1 бита.

Или, возможно, использование потоков будет проще для вас. Проверьте это: время импорта импорт потоков

def get_temp():
    #return temperature

def is_led_on():
    #return led state, true or false

#Temperature threshold in celsius degrees
TEMP_THD = 29

def temp_thread():
    while(True):
        Temp = get_temp()
        if( Temp>TEMP_THD):
            if(is_led_on()==False):
                led_on()
        time.sleep(2)

t = threading.Thread(target=temp_thread)
t.start()

while (True):
    time.sleep(0.1)
...