Модули

Скетч Arduino Mega Server разделён на структурно-логические блоки, называемые модулями. Каждый такой модуль выполняет какую-либо одну, чётко выраженную функцию, например, обслуживание контактных датчиков (contacts), работа со временем (rtc) или управление силовыми ключами (keys) и т. д. В папке скетча каждому модулю соответствует свой .ino файл.

Все модули делятся на системные, т. е. неотключаемые и необходимые для функционирования Arduino Mega Server и пользовательские, которые можно отключать, если их функциональность не нужна.

Существует два варианта отключения модулей.

Отключение компиляции модуля

В этом варианте отключение происходит комментированием соответствующей строки в скетче Arduino Mega Server на этапе компиляции и код модуля не попадает в микроконтроллер, что позволяет сэкономить его память.

//#define PING_FEATURE

Динамическое включение и отключение модулей

В этом варианте вы можете включать и выключать модули прямо во время работы системы. Это позволяет освободить процессорное время, затрачиваемое на работу модуля, но не освобождает память, занимаемую им.

Этот вариант управления работой модулей осуществляется в коде скетча и индивидуален для каждого модуля. В качестве примера вы можете посмотреть, как организовано управление модулем «Электро», который можно включать и отключать прямо с веб-страницы.

Браузерная часть

Браузерная часть интерфейса Arduino Mega Server автоматически распознаёт состояние модуля и корректно обрабатывает это событие. В шапке сайта AMS находится приборная панель на которой отображается текущее состояние всех модулей системы.

Индикаторы работы модулей

Возможны три состояния:

  • Включён (синий)
  • Выключен (коричневый)
  • Неоткомпилирован (тёмно-серый)

Модули системы

Модуль Назначение Отключаемый
Doc Файл документации
Generic Общие функции Нет
Strings Функции работы со строками Нет
Timers Работа с таймерами Нет
SD Функции работы с microSD Частично
RTC Функции работы с временем Частично
Upload Загрузка файлов на сервер по Serial Да
Ethernet Поддержка работы с сетью В разработке
Send Посылка GET запросов Да
Ping Доступность сетевых устройств Не работает
Server Модуль сервера В разработке
Server Ajax Парсинг запросов и ответы сервераВ разработке
Server Maker Сборка страниц В разработке
Server Commands Парсинг сетевых команд В разработке
Temperature Работа с температурными датчиками Да
Contacts Работа с контактными датчикамиДа
PIR's Работа с PIR датчиками Да
Electro Работа с Power Monitor Да
Keys Работа с силовыми ключами Да
LED's Работа со светодиодными лентамиДа
MajorDoMo Работа с системой MajorDoMo Да
Laurent Работа с модулями Laurent Да
nooLite Работа с оборудованием nooLite Да

Программирование модулей

Включение и отключение модулей осуществляется при помощи т. н. макросов и директив условной компиляции. Например, в модуле «contacts» весь код заключён между двух директив условной компиляции

#ifdef CONTACTS_FEATURE

...

#endif

и от того, будет ли закомментирован макрос

#define CONTACTS_FEATURE

зависит будет ли откомпилирован это код и попадёт ли он в микроконтроллер.

Здесь есть один тонкий момент, который нужно понимать. Если вы выключили модуль из компиляции, а в других модулях встретиться код, зависимый от выключенного, то произойдёт ошибка на этапе компиляции. Поэтому, нужно обрамлять в такие же директивы и весь зависимый код в других модулях, чтобы всё, относящееся к выключаемому модулю, выключалось синхронно.

Именно так спроектирована система Arduino Mega Server и отключение, например, модуля «contacts» приводит и к выключению из компиляции зависимого кода в модуле «server_ajax». При разработке нужно предусматривать, чтобы «исчезновение» модуля из системы, вместе со всем зависимым кодом, не приводило к каким-либо проблемам.

Определение макросов модулей

В главном файле скетча Arduino Mega Server определяются макросы при помощи которых осуществляется включение или отключение модулей системы.

// modules
#define ETHERNET_FEATURE
#define SERVER_FEATURE
#define RTC_FEATURE
#define SEND_FEATURE
//#define MAJORDOMO_FEATURE
#define UPLOAD_FEATURE
#define SD_INFO_FEATURE
//#define SD_FILES_FEATURE
//#define PING_FEATURE
//#define LAURENT_FEATURE
#define PIRS_FEATURE
#define CONTACTS_FEATURE
#define TEMP_FEATURE
#define ELECTRO_FEATURE
#define LEDS_FEATURE
//#define KEYS_FEATURE
#define NOO_FEATURE

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

Динамическое состояние модулей

В главном файле переменным модулей присваивается статус MODUL_NOT_COMPILLED, который означает, что модуль не откомпилирован. Затем, в процессе инициализации, модулям присваивается статус MODUL_ENABLED (но только после успешной инициализации).

// modules
byte const MODUL_DISABLE = 0;
byte const MODUL_ENABLE = 1;
byte const MODUL_NOT_COMPILLED = 2;
byte modulEthernet = MODUL_NOT_COMPILLED;
byte modulRtc =      MODUL_NOT_COMPILLED;
byte modulSdCard =   MODUL_NOT_COMPILLED;
byte modulId =       MODUL_NOT_COMPILLED;
byte modulServer =   MODUL_NOT_COMPILLED;
byte modulSend =     MODUL_NOT_COMPILLED;
byte modulMajor =    MODUL_NOT_COMPILLED;
byte modulLaurent =  MODUL_NOT_COMPILLED;
byte modulPing =     MODUL_NOT_COMPILLED;
byte modulUpload =   MODUL_NOT_COMPILLED;
byte modulPirs =     MODUL_NOT_COMPILLED;
byte modulContacts = MODUL_NOT_COMPILLED;
byte modulTemp =     MODUL_NOT_COMPILLED;
byte modulElectro =  MODUL_NOT_COMPILLED;
byte modulLeds =     MODUL_NOT_COMPILLED; 
byte modulKeys =     MODUL_NOT_COMPILLED;
byte modulNoo =      MODUL_NOT_COMPILLED;

Во время работы программы статусы MODUL_ENABLE и MODUL_DISABLE можно менять, тем самым управляя включением и отключением модулей. Если модуль имеет статус MODUL_NOT_COMPILLED, то работать с ним нельзя — его код отсутствует в системе.

Обратите внимание. Система Arduino Mega Server непрерывно развивается и в код проекта постоянно вносятся изменения и улучшения, поэтому, описание и документация может не соответствовать вашей конкретной версии системы. Последняя правка этой страницы относится к 0.14 версии системы.