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

{ ‘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(). Подозреваю, что библиотеки параллельных процессов и очередей круты и неоднократно прописаны, но я на коленке собрал упрощенную версию, чтобы не терять время на изучение и применение таких библиотек, хотя, возможно, с ростом знаний, я применю и их.