Мониторинг датчиков с помощью Python на Rapsberry - PullRequest
0 голосов
/ 06 июля 2018

Мне нужна помощь, чтобы найти лучший способ кодирования программы на Raspberry Python.

В этой программе мне нужно отслеживать несколько значений, поступающих от различных датчиков, подключенных к малине, и взаимодействовать с этими значениями из pyqt GUI. Графический интерфейс и драйверы датчиков должны быть полностью разделены.

Для этого я собирался создать и использовать объект «Диспетчер переменных» между графическим интерфейсом и датчиками в качестве «буфера» или чего-то в этом роде. При использовании потоков и блокировок датчики будут постоянно обновлять диспетчер переменных (с циклами while в соответствующих драйверах), а графический интерфейс будет запрашивать определенные значения всякий раз, когда мне потребуется.

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

Как вы думаете, это может работать правильно? Есть ли другой способ более эффективный / более приспособленный для этого?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Я бы сделал это так:

[Физические датчики] -> [Python Sensor Monitor] -> [PubNub / аналогичные]

# Not tested, probably not good
from threading import Thread
from pubnub import PubNub

class SensorMonitor(threading.Thread):
  def __init__(self):
    self.pubnub = PubNub("demo", "demo")
    self.switch = True

  def _on_receive(self, sensor_data):
    # can also do async() with a callback - https://www.pubnub.com/docs/python/data-streams-publish-and-subscribe
    self.pubnub.publish().channel('raw_data').message(sensor_data).sync()

  @staticmethod
  def _poll_sensor(address):
    data = get_sensor_data(address)
    return data

  def run(self):
    while self.switch:
      _data = poll_sensor('my_address')
      self._on_receive(_data)
      time.sleep(1)

  def terminate(self):
    self.switch = False

monitor = SensorMonitor()
monitor.start()

Тогда ваш графический пользовательский интерфейс может использовать потребителя PubNub для получения данных во время их потоковой передачи и проверки / выполнения каких-либо действий. Вы можете использовать JS или Python здесь!

...