Разделяя время. Спи для разных действий

Здесь довольно плохо знакомы с python и пытается выделить функцию time.sleep для нескольких чтений.

while True:
#read from a analog sensor on input 1
d= grovepi.analogRead(1)
#read from an analog sensor on input 2
a= grovepi.analogRead(2)
#read from an digital sensor on input 3
(t,h)=grovepi.dht(3,0)


#output the data
#print (datetime,time)
print('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now()))
print ("Noise:",d,"dB")
print ("Light:",a,"lux")
print ("Temperature:",t,"C")
print ("Humidity:",h,"rH")
grovelcd.setText("T:" + str(t) + " H:" + str(h) + " N:" + str(d)+ " L:" + str(a))

time.sleep(5)

Я хотел бы, чтобы показания печатались на разных частотах, но при этом выполнялись одновременно.

например

print ("Noise:",d,"dB")
time.sleep(3)

а также

print ("Light:",a,"lux")
time.sleep(5)

Я понимаю, что это может быть простой синтаксической проблемой, но я не нашел простого решения.

Большое спасибо

1 ответ

Решение

Вот частичное решение с использованием потоков:

import threading
import time
import grovepi

def take_analog_measurement(stop, lock, name, pin, units, period):
    while not stop.is_set():
        with lock:
            val = grovepi.analogRead(pin)
        print(name, ': ', val, units, sep='')
        time.sleep(period)

def take_dht_measurement(stop, lock, pin, mtype, period):
    while not stop.is_set():
        with lock:
            temp, hum = grovepi.dht(pin, mtype)
        print('Temperature: ', temp, ' C\nHumidity: ', hum, ' rH', sep='')
        time.sleep(period)

stop = threading.Event()
grovepilock = threading.Lock()
threads = []
threads.append(threading.Thread(target=take_analog_measurement, args=(stop, grovepilock, 'Noise', 1, 'dB', 3)))
threads.append(threading.Thread(target=take_analog_measurement, args=(stop, grovepilock, 'Light', 2, 'lux', 5)))
threads.append(threading.Thread(target=take_dht_measurement, args=(stop, grovepilock, 3, 0, 7)))
for thread in threads:
    thread.start()

for thread in threads:
    try:
        thread.join()
    except KeyboardInterrupt:
        stop.set()
        thread.join()

print('done')

У меня нет GrovePi, поэтому я не могу проверить его на оборудовании, но я провел несколько смоделированных тестов.

Это будет считывать каждый датчик с заданной частотой и выводить значение. Замок используется для защиты grovepi так как я не уверен, что это потокобезопасно. Событие используется для подачи сигнала на остановку всех потоков (хотя им придется ждать, пока они не проснутся, прежде чем они действительно смогут остановиться).

Я не знаю, как вы хотите справиться с grovelcd.setText когда каждая переменная изменяется с разной частотой. Одним из возможных решений может быть другой поток, который использует словарь (и блокировку), общий для всех потоков датчиков. Затем ЖК-дисплей будет обновлять период и использовать данные из словаря.

Другие вопросы по тегам