С данной проблемой столкнулся когда задумался автоматизировать свой дом. Требования были не сложные и их можно было решить не строя полноценную сеть, но хотелось сделать что то универсальное, а не костыли на изоленте. Сама задача как подружить контроллеры, так чтоб они видели не только свою периферию, но и "соседа". Все эти датчики температуры, влажность, освещенности, протечек, считыватели rfid-карт, да и просто входы/выходы. При этом не мешали друг другу и были децентрализованы, т.е. не имели "главного" контроллера который бы всем управлял.

Долго думал как проще и надежнее построить сеть на базе модулей Arduino и вот решение готово. Статья выходит с большим запозданием и на данный момент уже реализовано два типа интерфейса:
  • WiFi на базе ESP8266.
По подключению этих интерфейсов будут отдельные статьи, здесь я постараюсь описать сам принцип и общий подход к организации и настройки сети между контроллерами Arduino. 

И так приступим.

Для организации сети нам понадобятся:
  1. модули Arduino  Mega и/или Nano;
  2. интерфейсный модуль WiFi (ESP8266);
  3. источники питания;
  4. исполнительные механизмы и датчик (по вкусу).
 Паяем схемы как описано тут.

Далее с помощью программы "Mega&Nano конфигуратора", задаем параметры для работы модулей в сети.

Для этого нам нужно задать только один параметр - сетевой адрес:

Установка сетевого адреса

По умолчанию модуль имеет адрес номер "1". Максимальное количество модулей в сети я ограничил до 16. Для большего числа модулей не хватило памяти, но думаю для дома и 16-ти хватит. Так что в блоке "Настройка устройства", задаем два разный адреса для двух модулей, можно так же задать название устройству. Название устройства ни на что не влияет, служить только для пониманию к какому модулю вы подключились.

Теперь сама настройка соединения:

Во вкладке периферия выбираем адрес модуля, у которого мы запросим данные нужные нам данные. Данные бывают двух видов: бинарные (состояния портов ввода/вывода, состояние пороговых триггеров, статусы счетчиков, ... ) и числовые (значения полученные от датчиков, входов АЦП/ADC).

Установка параметров запрашиваемых данных

Разберем настройки, представленные на данном рисунке. 

Первое поле это адрес устройства у которого мы будем запрашивать данные. Всего мы можем запросить 16 "статусов". Надо только помнить, что числовые значения будут считаться нашими собственными, т.е. будут подменены.  

Пример 1: у нашего контроллера нет подключенного термометра, а у модуля с адресом "3", есть. Мы запрашиваем параметр "DS_1" (значение первого термометра ds18b20) и контроллер воспринимает его как свой собственный термометр. Таким образом, можно значение одного термометра раздать другим контроллерам. 

Пример 2: Мы запрашиваем параметр "An_1" (значение первого АЦП/ADC), его данные также встраиваются в наш контроллер, как будто мы получили значение от собственного модуля АЦП/ADC.

Пример 3: Мы запрашиваем параметры "In_1" и "OUT_1" (In_1 - состояние входа 1, OUT_1 - состояние выхода 1), тут все по-другому. Эти состояние мы будем "видеть" в нашем контроллере, как "EX02" (In_1) и "EX04" (OUT_1). И мы можем их использовать в своей логике:

Использование сигналов внешнего контроллера

Выход 2 изменит состояние при появлении сигналов EX02 или EX04, которые в свою очередь привязаны к состояниям входа In_1 и выхода  OUT_1 контроллера с адресом "3". 

Единственное ограничение это, то что у контроллера есть только 16 внешних статусов EX01-EX16 и не желательно использовать один и тот же статус для получения данных от разных контроллеров.

В заключении приведу перечень доступных данных: 

  1. TxH - верхний пороговый триггер термометра ds18b20; 

  2. TxL - нижний пороговый триггер термометра ds18b20; 

  3. CхTH - верхний пороговый триггер термометра DHT11;

  4. CхTL - нижний пороговый триггер термометра DHT11;

  5. CхHH - верхний пороговый триггер датчика влажности DHT11;  

  6. CхHL - нижний пороговый триггер датчика влажности DHT11;

  7. AnхH  - верхний пороговый триггер аналогового входа; 

  8. AnхL - нижний пороговый триггер аналогового входа;  

  9. Cntх - статус счетчика; 

  10. Tmr1 - программный таймер 0.5 секунды;

  11. Tmr2 - программный таймер 1 секундa

  12. Tmr3 - программный таймер 10 секунд

  13. Tmr4 - программный таймер 1 минута

  14. In_х - состояние входа;

  15. AL_х - статус будильника;

  16. M_хх - статус маркера;

  17. OUTхх - состояние выхода;

  18. SMSх - статус SMS сообщений;

  19. RF_x - статус RFID-ридера; 

  20. DS_x - значение термометра ds18b20;

  21. DT_x - значение термометра DHT11;

  22. DH_x - значение датчика влажности DHT11; 

  23. An_x - значение аналогового входа.

x - номер входа/выхода или устройства. 

Вот вкратце и все что надо чтоб объединить несколько модули Arduino Mega и/или Nano в полноценную сеть.


Авторское право © 2024 cto40.ru Все Права Защищены.