Для того чтобы создать ноду реле с кнопками, необходимо создать устройство работающее без радио, а потом прикрутить к нему протокол передачи данных MySensors. Устройство должно работать по следующему алгоритму: при нажатии на кнопку включается реле, при повторном выключается. На человеческом языке это звучит так: Считываем состояние кнопки, если кнопка нажата, то меняем состояние булевой переменной, например, статус1 на противоположное и записываем его на выход к которому подключено реле, тоже самое со второй кнопкой и переменной статус2.
Надеюсь молодой боец переведёт человеческий язык на язык Си и мы допишем к этому устройству протокол MySensors. Если нет придётся самому написать .
Создание ноды реле с кнопками или курс молодого бойца
Re: Создание ноды реле с кнопками или курс молодого бойца
Для того чтобы устройство стало MySensors нодой, в скетч необходимо добавить немного кода, описанного здесь.
В начале скетча должны быть прописаны флаги конфигурации MySensors которые начинаются с #define, ознакомится с ними можно в таблице по ссылке выше, там же описано какие значения присвоятся тем или иным флагам при компиляции, если их не прописать в скетче. Например, мы создаём ноду, которая будет работать по радио nRF24 и автономно на случай если отвалился гейт для этого нам необходимо добавить следующий код в шапку перед подключением библиотеки MySensors.h
Если необходимо подключить дебаг или присвоить ноде номер по своему усмотрению, необходимо добавить соответствующие дефайны из таблицы перед подключением библиотеки.
Далее необходимо создать контейнеры для хранения и передачи информации, в данном случае необходимо два контейнера с типом V_STATUS, таких контейнеров может быть от 0-254, по ссылке выше это так называемые child-sensor-id, список поддерживаемых типов датчиков, а соответственно и контейнеров можно посмотреть здесь.
msg, это переменная и может быть названа как вам угодно хоть msg_light1, главное чтобы она была уникальной, в нашем случае msg1 и msg2.
Далее ноде необходимо представиться контроллеру и для этого необходимо создать функцию презентации.
Текст в кавычках пишите по своему усмотрению, он будет отображаться на контроллере, для информативности при настройке последнего.
Далее идёт секция void setup(), в ней можно запросить или передать информацию о текущем состоянии релюшек при загрузке или перезагрузке. Для того чтобы после отключения электроэнергии реле либо обнулялись, либо запрашивали у контролера какое должно быть их состояние или загружали из памяти последнее сохранённое состояние.
Следующая секция void loop(), здесь в данном случае необходимо добавить отправку на контроллер переменных статус1 и статус2 после их изменения. Про отправку и приём сообщений можно почитать здесь.
Ну и в конце нам необходимо создать функцию обработки входящих сообщений void receive(const MyMessage &message), для возможности управления реле с контроллера и подтверждения доставки сообщения до получателя.
Про подтверждение описано в теме по ссылке выше.
В начале скетча должны быть прописаны флаги конфигурации 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);
Далее ноде необходимо представиться контроллеру и для этого необходимо создать функцию презентации.
Код: Выделить всё
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){
if ((message.type == V_STATUS)&&(message.sensor == 0)) статус1 = message.getBool();
if ((message.type == V_STATUS)&&(message.sensor == 1)) статус2 = message.getBool();
}
Re: Создание ноды реле с кнопками или курс молодого бойца
Боец где-то пропал придётся дописывать гайд самому.
На языке FBD это выглядит так:
На языке Си это выглядит следующим образом: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 на выходы
}
Re: Создание ноды реле с кнопками или курс молодого бойца
Сейчас добавим в получившийся скетч кода 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();
}
Re: Создание ноды реле с кнопками или курс молодого бойца
Премного благодарен за толковое разъяснение на родном языке!
Сделал красивые часики, а потом нашёл Domoticz. Теперь постараюсь "скрестить ужа с ежом"
Сделал красивые часики, а потом нашёл Domoticz. Теперь постараюсь "скрестить ужа с ежом"