Создание ноды реле с кнопками или курс молодого бойца

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Ответить
Mikhail72
Сообщения: 18
Зарегистрирован: 04 окт 2017, 06:02
Откуда: Тюмень
Контактная информация:

Создание ноды реле с кнопками или курс молодого бойца

Сообщение Mikhail72 »

Для того чтобы создать ноду реле с кнопками, необходимо создать устройство работающее без радио, а потом прикрутить к нему протокол передачи данных MySensors. Устройство должно работать по следующему алгоритму: при нажатии на кнопку включается реле, при повторном выключается. На человеческом языке это звучит так: Считываем состояние кнопки, если кнопка нажата, то меняем состояние булевой переменной, например, статус1 на противоположное и записываем его на выход к которому подключено реле, тоже самое со второй кнопкой и переменной статус2.
Надеюсь молодой боец переведёт человеческий язык на язык Си и мы допишем к этому устройству протокол MySensors. Если нет придётся самому написать :) .
Mikhail72
Сообщения: 18
Зарегистрирован: 04 окт 2017, 06:02
Откуда: Тюмень
Контактная информация:

Re: Создание ноды реле с кнопками или курс молодого бойца

Сообщение Mikhail72 »

Для того чтобы устройство стало MySensors нодой, в скетч необходимо добавить немного кода, описанного здесь.
В начале скетча должны быть прописаны флаги конфигурации MySensors которые начинаются с #define, ознакомится с ними можно в таблице по ссылке выше, там же описано какие значения присвоятся тем или иным флагам при компиляции, если их не прописать в скетче. Например, мы создаём ноду, которая будет работать по радио nRF24 и автономно на случай если отвалился гейт для этого нам необходимо добавить следующий код в шапку перед подключением библиотеки MySensors.h

Код: Выделить всё

#define MY_TRANSPORT_WAIT_READY_MS 1000
#define MY_RADIO_RF24
#include <MySensors.h>
Если необходимо подключить дебаг или присвоить ноде номер по своему усмотрению, необходимо добавить соответствующие дефайны из таблицы перед подключением библиотеки.

Далее необходимо создать контейнеры для хранения и передачи информации, в данном случае необходимо два контейнера с типом V_STATUS, таких контейнеров может быть от 0-254, по ссылке выше это так называемые child-sensor-id, список поддерживаемых типов датчиков, а соответственно и контейнеров можно посмотреть здесь.

Код: Выделить всё

MyMessage msg1(0, V_STATUS);
MyMessage msg2(1, V_STATUS);
msg, это переменная и может быть названа как вам угодно хоть msg_light1, главное чтобы она была уникальной, в нашем случае msg1 и msg2.
Далее ноде необходимо представиться контроллеру и для этого необходимо создать функцию презентации.

Код: Выделить всё

void presentation()
{
sendSketchInfo("Relay+Button", "1.0");

present(0, S_BINARY,"Relay1");
present(1, S_BINARY,"Relay2");
}
Текст в кавычках пишите по своему усмотрению, он будет отображаться на контроллере, для информативности при настройке последнего.

Далее идёт секция void setup(), в ней можно запросить или передать информацию о текущем состоянии релюшек при загрузке или перезагрузке. Для того чтобы после отключения электроэнергии реле либо обнулялись, либо запрашивали у контролера какое должно быть их состояние или загружали из памяти последнее сохранённое состояние.

Следующая секция void loop(), здесь в данном случае необходимо добавить отправку на контроллер переменных статус1 и статус2 после их изменения. Про отправку и приём сообщений можно почитать здесь.

Код: Выделить всё

void loop(){
ваш код;
send(msg1.set(статус1));
...;
send(msg2.set(статус2));
Ну и в конце нам необходимо создать функцию обработки входящих сообщений void receive(const MyMessage &message), для возможности управления реле с контроллера и подтверждения доставки сообщения до получателя.

Код: Выделить всё

void receive(const MyMessage &message){
if ((message.type ==  V_STATUS)&&(message.sensor == 0)) статус1 = message.getBool();
if ((message.type ==  V_STATUS)&&(message.sensor == 1)) статус2 = message.getBool();
}
Про подтверждение описано в теме по ссылке выше.
Mikhail72
Сообщения: 18
Зарегистрирован: 04 окт 2017, 06:02
Откуда: Тюмень
Контактная информация:

Re: Создание ноды реле с кнопками или курс молодого бойца

Сообщение Mikhail72 »

Боец где-то пропал придётся дописывать гайд самому.
Mikhail72 писал(а): 30 янв 2018, 05:53 На человеческом языке это звучит так: Считываем состояние кнопки, если кнопка нажата, то меняем состояние булевой переменной, например, статус1 на противоположное и записываем его на выход к которому подключено реле, тоже самое со второй кнопкой и переменной статус2.
На языке Си это выглядит следующим образом:

Код: Выделить всё

bool state1 = 0;      // Объявляем переменные
bool state2 = 0;      // статус1 и статус2

void setup()
{
pinMode(2, INPUT_PULLUP); // Пин2 вход с подтяжкой (Кнопка1)
pinMode(3, INPUT_PULLUP); // Пин3 вход с подтяжкой (Кнопка2)
pinMode(4, OUTPUT);       // Пин4 выход (Реле1)
pinMode(5, OUTPUT);       // Пин5 выход (Реле2)
}

void loop()
{
if ((digitalRead (2)) == 0) { // Если нажата кнопка1
state1 = !(state1);           // Инвертируем переменную
}
if ((digitalRead (3)) == 0) { // Если нажата кнопка2
state2 = !(state2);           // Инвертируем переменную
}
digitalWrite(4, state1);      // Записываем значение переменных
digitalWrite(5, state2);      // статус1 и статус2 на выходы
}
На языке FBD это выглядит так:
KMB.jpg
KMB.jpg (18.82 КБ) 17404 просмотра
Mikhail72
Сообщения: 18
Зарегистрирован: 04 окт 2017, 06:02
Откуда: Тюмень
Контактная информация:

Re: Создание ноды реле с кнопками или курс молодого бойца

Сообщение Mikhail72 »

Сейчас добавим в получившийся скетч кода MySensors и получим ноду-реле с кнопками.

Код: Выделить всё

// Флаги конфигурации
#define MY_TRANSPORT_WAIT_READY_MS 1000 // Запуск без сети MyS
#define MY_RADIO_RF24                   // Радио
//#define MY_DEBUG                      // Дебаг
//#define MY_NODE_ID 1                  // Номер ноды

#include <MySensors.h>       // Подключаем библиотеку

bool state1 = 0;             // Объявляем переменные
bool state2 = 0;             // статус1 и статус2

MyMessage msg1(0, V_STATUS); // Создаём контейнеры
MyMessage msg2(1, V_STATUS);

void presentation()
{
sendSketchInfo("Relay+Button", "1.0");
present(0, S_BINARY,"Relay1");
present(1, S_BINARY,"Relay2");
}

void setup()
{
pinMode(2, INPUT_PULLUP); // Пин2 вход с подтяжкой (Кнопка1)
pinMode(3, INPUT_PULLUP); // Пин3 вход с подтяжкой (Кнопка2)
pinMode(4, OUTPUT);       // Пин4 выход (Реле1)
pinMode(5, OUTPUT);       // Пин5 выход (Реле2)
}

void loop()
{
if ((digitalRead (2)) == 0) { // Если нажата кнопка1
state1 = !(state1);           // Инвертируем переменную
send(msg1.set(state1));       // Отправляем состояние реле1 на контроллер
}
if ((digitalRead (3)) == 0) { // Если нажата кнопка2
state2 = !(state2);           // Инвертируем переменную
send(msg1.set(state2));       // Отправляем состояние реле1 на контроллер
}
digitalWrite(4, state1);      // Записываем значение переменных
digitalWrite(5, state2);      // статус1 и статус2 на выходы
}

void receive(const MyMessage &message){
// Если пришло сообщение для сенсора 0, записываем его в переменную статус1
if ((message.type ==  V_STATUS)&&(message.sensor == 0)) state1 = message.getBool();
// Если пришло сообщение для сенсора 1, записываем его в переменную статус2
if ((message.type ==  V_STATUS)&&(message.sensor == 1)) state2 = message.getBool();
}
KMB2.jpg
KMB2.jpg (45.94 КБ) 17403 просмотра
Теперь нода создана и по желанию скетч можно "причёсывать" и обвешивать "жирком", т.е. бороться с дребезгом контактов, подтверждать доставку сообщений, сохранять и загружать состояния в/из еепром и т.д. кто во что горазд :)
Ostoja
Сообщения: 1
Зарегистрирован: 20 фев 2018, 18:44

Re: Создание ноды реле с кнопками или курс молодого бойца

Сообщение Ostoja »

Премного благодарен за толковое разъяснение на родном языке! :)
Сделал красивые часики, а потом нашёл Domoticz. Теперь постараюсь "скрестить ужа с ежом" :)
Ответить