Задача заключалась в организации обмена информацией между конечными сенсорами, промежуточными узлами, устройствами хранения и отображения пакетами в Json-формате
где MCU — Имя микроконтроллера, к которому подключены сенсоры
ValueX — название поля, состоящее из двух частей: Имя сенсора+Смысловое определение, например,
‘Home_T’ или ‘DHT_H’ или ‘DS_T5’
Промежуточный узел — локальный микроконтроллер, коллекционирующий текущие показания с группы сенсоров, расположенных поблизости и, возможно, обладающих повышенной дальностью соединения, например, промежуточный узел ‘Пасека’, собирающий информацию (температура, влажность, уровень звука, вес) с ульев, или промежуточный узел ‘Домик’, собирающий информацию из гостевого домика (температура, влажность, задымленность), хранит только текущие значения сенсоров и периодически отправляет их выше по иерархии пакетами в Json-формате. Может отправлять информацию в IFTTT, иные облачные сервисы, в том случае, если качество связи достаточное для выхода в интернет в месте, где расположен это промежуточный узел.
Устройства хранения и отображения предназначены для визуализации сгруппированной информации, в том числе накопленной за определенный период, при наличии соответствующих запросов. Простейшее подобное устройство — локальная метеостанция с функциональностью,
Языком реализации изначально предполагался C++, но потом я передумал и решил писать на Micropython, убив этим двух зайцев — познать новый для меня язык и облегчить процесс кодирования и тестирования.
При исследовании библиотек работы с сенсорами, в частности, Adafruit и более чем скромной библиотеки Micripython возникло сильное желание унифицировать получения данных от разных по типу назначению сенсоров, что очень удачно пересекалось с задачей обмена информацией пакетами в Json-формате. Для этого, применив технологию ООП, дописал к каждому используемому сенсору свой класс, который унифицировал как получение информации, так и ее обработку
Например, для сенсора DS18X20:
или BME280:
Для обмена данными решил использовать Socket — библиотеку c TCP-протоколом, простейший Client, а на приеме — небольшой асинхронный сервер с одновременно открытыми несколькими Socket, исходники выложу на GitHub.
Кстати, обнаружил при тестировании, что в большинстве примеров с библиотекой Socket не устанавливается WiFi, на чем потерял немало времени, полагая, что в этой библиотеке WiFi устанавливается автоматически, в результате чего неоднократно получал error[103], для чего написал свою микробиблиотечку с модулем подключения WiFi в режиме AP (точка доступа) или STA (станции).
И в завершении краткого описания своих наработок написал класс Timer(time), установив который периодически проверяя Timer.stop(), можем в бесконечном цикле стартовать с заданным интервалом нужные модули, например, SensorRead() и SendData(). Подозреваю, что библиотеки параллельных процессов и очередей круты и неоднократно прописаны, но я на коленке собрал упрощенную версию, чтобы не терять время на изучение и применение таких библиотек, хотя, возможно, с ростом знаний, я применю и их.
{ ‘MCU’:’name’, ‘Value0’:99.9, …, ‘ValueN’:99.9}</b>
где MCU — Имя микроконтроллера, к которому подключены сенсоры
ValueX — название поля, состоящее из двух частей: Имя сенсора+Смысловое определение, например,
‘Home_T’ или ‘DHT_H’ или ‘DS_T5’
Промежуточный узел — локальный микроконтроллер, коллекционирующий текущие показания с группы сенсоров, расположенных поблизости и, возможно, обладающих повышенной дальностью соединения, например, промежуточный узел ‘Пасека’, собирающий информацию (температура, влажность, уровень звука, вес) с ульев, или промежуточный узел ‘Домик’, собирающий информацию из гостевого домика (температура, влажность, задымленность), хранит только текущие значения сенсоров и периодически отправляет их выше по иерархии пакетами в Json-формате. Может отправлять информацию в IFTTT, иные облачные сервисы, в том случае, если качество связи достаточное для выхода в интернет в месте, где расположен это промежуточный узел.
Устройства хранения и отображения предназначены для визуализации сгруппированной информации, в том числе накопленной за определенный период, при наличии соответствующих запросов. Простейшее подобное устройство — локальная метеостанция с функциональностью,
Языком реализации изначально предполагался C++, но потом я передумал и решил писать на Micropython, убив этим двух зайцев — познать новый для меня язык и облегчить процесс кодирования и тестирования.
При исследовании библиотек работы с сенсорами, в частности, Adafruit и более чем скромной библиотеки Micripython возникло сильное желание унифицировать получения данных от разных по типу назначению сенсоров, что очень удачно пересекалось с задачей обмена информацией пакетами в Json-формате. Для этого, применив технологию ООП, дописал к каждому используемому сенсору свой класс, который унифицировал как получение информации, так и ее обработку
Например, для сенсора DS18X20:
sensor = DRV_Ds18x20('Boil',13)
print('Temperatures:')
for i in range(5): # make 5 mesurements for test
print(sensor.data)
или BME280:
sensor = DRV_BME280('Hom',4,5)
print('BME280 measurements:')
for i in range(5): # make 5 mesurements for test
print(sensor.data)
Для обмена данными решил использовать Socket — библиотеку c TCP-протоколом, простейший Client, а на приеме — небольшой асинхронный сервер с одновременно открытыми несколькими Socket, исходники выложу на GitHub.
Кстати, обнаружил при тестировании, что в большинстве примеров с библиотекой Socket не устанавливается WiFi, на чем потерял немало времени, полагая, что в этой библиотеке WiFi устанавливается автоматически, в результате чего неоднократно получал error[103], для чего написал свою микробиблиотечку с модулем подключения WiFi в режиме AP (точка доступа) или STA (станции).
def connect_to_WiFi( ssid, pwrd, mode='STA'):
И в завершении краткого описания своих наработок написал класс Timer(time), установив который периодически проверяя Timer.stop(), можем в бесконечном цикле стартовать с заданным интервалом нужные модули, например, SensorRead() и SendData(). Подозреваю, что библиотеки параллельных процессов и очередей круты и неоднократно прописаны, но я на коленке собрал упрощенную версию, чтобы не терять время на изучение и применение таких библиотек, хотя, возможно, с ростом знаний, я применю и их.