Pull to refresh

Умная Усадьба

Задача заключалась в организации обмена информацией между конечными сенсорами, промежуточными узлами, устройствами хранения и отображения пакетами в 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(). Подозреваю, что библиотеки параллельных процессов и очередей круты и неоднократно прописаны, но я на коленке собрал упрощенную версию, чтобы не терять время на изучение и применение таких библиотек, хотя, возможно, с ростом знаний, я применю и их.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.