Умный выключатель 2

Ответить
ahelper
Сообщения: 106
Зарегистрирован: Ср фев 08, 2017 5:04 pm
Благодарил (а): 34 раза
Поблагодарили: 66 раз

Умный выключатель 2

Сообщение ahelper » Вт янв 09, 2018 9:58 am

Сильное желание разобраться с "Умным выключателем" подтолкнуло к решению готового "Умного выключателя 2".

Что он может?
1 - Может жить своей автономной жизнью.
2 - Управляет тремя нагрузками, как с шлюза, так и с кнопки (выключателя).
3 - При старте отправляет последнее состояние выходов и временные задержки шлюзу.
4 - Автоматическое выключение выходов по заданным временным задержкам.
5 - Если включили первый выход, то через установленное время включается второй.
6 - Определяет длительность нажатия кнопки и выполняет различные команды.
7 - Установка временных задержек дистанционно, без перепрошивки.

Для чего это все нужно?
"Неожиданно" в квартире затеялся ремонт. Для того, чтобы не ограничивать себя размерами коробок под выключатели, для установки "нод". Были заменены круглые распределительные коробки на большие прямоугольные. Так как все провода приходят в них, пришло решение "ноды" установить в распред. коробку.
Прихожая у меня граничит с ванной комнатой, и выключатели находятся в прихожей. Два выключателя относящихся к ванной в начале прихожей, а выключатель прихожей в конце, у выхода с квартиры.

Алгоритм работы.
По короткому нажатию кнопок, включение и выключение соответствующей нагрузки.
Канал 0 - свет в ванной.
Канал 1 - вытяжка в ванной.
Канал 2 - свет в прихожей.
По длинному нажатию кнопок, более 2 секунд включается свет в прихожей.
Если включили только свет в ванной, то через 2 минуты автоматически включается вытяжка.
Если был включен свет в ванной и вытяжка, а выключили только свет, то через 5 минут выключается вытяжка.
В случае, если любую нагрузку включили, но забыли выключить. Автовыключение произойдет через 60 минут.

Временные параметры.
Все временные параметры придется подстраивать под свои нужды. Для этого реализовано удаленное изменение временных параметров.

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

Так определяются типы данных ноды, и выглядят мои связанные объекты и свойства:
СпойлерПоказать
Датчик MYS.jpg
Вот так определяются типы данных ноды модулем MySensor
Датчик MYS.jpg (134.78 КБ) 4717 просмотров
Для возможности быстрой смены и отображения временных параметров добавил в меню "текстовые поля" с привязкой к свойствам объектов.
СпойлерПоказать
Меню уст времени.jpg
Меню установки временных параметров
Меню уст времени.jpg (23.01 КБ) 4717 просмотров
Скетч максимально расписал, чтобы новичкам (таким как я) было меньше головной боли, что от куда и куда.
Идея реализации не моя, подглядел и поправил под свои нужды.
Спасибо Алексею Степанову @avstepanov https://geektimes.ru/post/258430/

Скетч под библиотеку MySensors 1.5.4
Multy_Switch_Relay_1_5_4.zip
Скетч под библиотеку MySensors 1.5.4
(4.87 КБ) 330 скачиваний
Скетч под библиотеку MySensors 2.2.0
Multy_Switch_Relay_Vannaya_2_2_0.zip
Скетч под библиотеку MySensors 2.2.0
(4.73 КБ) 268 скачиваний
После первой прошивки скетча в ноду, нода работает не правильно, т.к. в памяти EEPROM не те значения, что нам нужно. Установите нужные значения через модуль MySensor и все будет предсказуемо. Удачи.
ahelper
Сообщения: 106
Зарегистрирован: Ср фев 08, 2017 5:04 pm
Благодарил (а): 34 раза
Поблагодарили: 66 раз

Re: Умный выключатель 2

Сообщение ahelper » Вт фев 13, 2018 4:42 pm

Данный выключатель немного преобразился, добавилось:
8 - Смена канала дистанционно. По умолчанию 76.
9 - Смена номера ноды (ID node) дистанционно.
10 - Если при первой передаче не было связи с гейтом, пытается 2 раза повторно отправить.
11 - Если отправка не удалась, сохраняет количество недоставленных сообщений как ошибку.

Желательно перед первой прошивкой стереть все данные в EEPROM стандартным скетчем "eeprom_clear", прописать 255 (можно и нули).
Смена канала возможна как с самой ноды так и с гейта (общее сообщение для всех нод), не проверял со спящими нодами. Собирал в библиотеке MySensors 2.2.0. Посмотреть количество недоставленных сообщений (ошибок), запросить презентацию.

т.к. У меня прошивка происходит по воздуху MYSBootloader, то мероприятия происходят так. Перевожу ноду на канал 76 (у меня канал основной работы выше 90), она автоматически перезагружается. Перевожу гейт на канал 76, он тоже автоматически перезагружается. Прошиваю новой прошивкой ноду, и так же перевожу на нужный канал ноду и гейт.
Если в сети появляется новая нода (гейт в этот момент должен быть на канале 76), то в настройках модуля MySensors (MajorDoMo) стоит присваивать ей номер 1. Далее меняю на нужный ID, и все.
Скетч для гейта
СпойлерПоказать

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

int channelid;
byte fflag_ch = 0;
int all_ch = 0;

// Enable debug prints to serial monitor
//#define MY_DEBUG
//#define SERIAL_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24

#define MY_RF24_CHANNEL channelid

// Enable gateway ethernet module type
#define MY_GATEWAY_W5100

// W5100 Ethernet module SPI enable (optional if using a shield/module that manages SPI_EN signal)
//#define MY_W5100_SPI_EN 4

// Enable Soft SPI for NRF radio (note different radio wiring is required)
// The W5100 ethernet module seems to have a hard time co-operate with
// radio on the same spi bus.
#if !defined(MY_W5100_SPI_EN) && !defined(ARDUINO_ARCH_SAMD)
#define MY_SOFTSPI
#define MY_SOFT_SPI_SCK_PIN 14
#define MY_SOFT_SPI_MISO_PIN 16
#define MY_SOFT_SPI_MOSI_PIN 15
#endif

// When W5100 is connected we have to move CE/CSN pins for NRF radio
#ifndef MY_RF24_CE_PIN
#define MY_RF24_CE_PIN 5
#endif
#ifndef MY_RF24_CS_PIN
#define MY_RF24_CS_PIN 6
#endif

// Enable to UDP
//#define MY_USE_UDP

#define MY_IP_ADDRESS 192,168,1,20   // * Установите свой желаемый IP
// Renewal period if using DHCP
//#define MY_IP_RENEWAL_INTERVAL 60000
// The port to keep open on node server mode / or port to contact in client mode
#define MY_PORT 5003

// Controller ip address. Enables client mode (default is "server" mode).
// Also enable this if MY_USE_UDP is used and you want sensor data sent somewhere.
//#define MY_CONTROLLER_IP_ADDRESS 192, 168, 178, 254

// The MAC address can be anything you want but should be unique on your network.
// Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use.
// Note that most of the Ardunio examples use  "DEAD BEEF FEED" for the MAC address.
#define MY_MAC_ADDRESS 0x00, 0x2A, 0xF5, 0x12, 0x67, 0xFA

/*
// Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway
//#define MY_INCLUSION_BUTTON_FEATURE
// Set inclusion mode duration (in seconds)
#define MY_INCLUSION_MODE_DURATION 60
// Digital pin used for inclusion mode button
//#define MY_INCLUSION_MODE_BUTTON_PIN  3

// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300

// Flash leds on rx/tx/err
// Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 7  // Error led pin
//#define MY_DEFAULT_RX_LED_PIN  8  // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN  9  // Transmit led pin
*/

#if defined(MY_USE_UDP)
#include <EthernetUdp.h>
#endif

#include <Ethernet.h>
#include <SPI.h>
#include <MySensors.h>

#define SKETCH_NAME "Gateway_W5100"
#define SKETCH_MAJOR_VER "10.02"
#define SKETCH_MINOR_VER "18"

#define CHANNEL_ID 200
#define ALL_CH_ID 250

MyMessage msgCH(CHANNEL_ID, V_STATUS);
MyMessage msgALL(ALL_CH_ID, V_VAR1);

//*********************************************************************

void before()
{
  channelid = loadState(200);
  all_ch = loadState(250);
  if ((channelid > 125) || (all_ch > 125))
  {
    channelid = 76;
    all_ch = 76;
    saveState(200, channelid);
    saveState(250, all_ch);
  }
}

//*********************************************************************

void presentation() {
  // Отправить информацию эскиза версии для шлюза и контроллера
  sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);

  present(CHANNEL_ID, S_BINARY, "Gate channel ID");
  present(ALL_CH_ID, S_BINARY, "All channel ID");
}

//*********************************************************************

void setup() {
  #ifdef SERIAL_DEBUG
  Serial.begin(115200);
  Serial.println("####################################");
  Serial.print("################### --- >  CHANNEL = ");
  Serial.println(channelid);
  Serial.println("####################################");
  Serial.println("####################################");
  Serial.print("################### --- >  ALL CHANNEL = ");
  Serial.println(all_ch);
  Serial.println("####################################");
  Serial.println("Init done...");
  #endif
}

//*********************************************************************

void loop()
{
  if (fflag_ch == 0) {
    wait(10000);
    send(msgCH.set(channelid));
    wait(200);
    send(msgALL.set(all_ch));
    wait(200);
    fflag_ch = 1;
  }
}

//*********************************************************************

void receive(const MyMessage &message)
{
    if (message.type == V_STATUS) {
    if (message.sensor == CHANNEL_ID)
    {
      channelid = message.getInt();
      if (channelid > 125) {
        channelid = 76;
        saveState(200, channelid);
        wait(500);
        send(msgCH.set(channelid));
        wait(3000);
        softReset();
      }
      else
      {
        saveState(200, channelid);
        wait(500);
        send(msgCH.set(channelid), 1);
        wait(3000);
        softReset();
      }
    }
  }

  if (message.type == V_VAR1) {
    if (message.sensor == ALL_CH_ID)
    {
      all_ch = message.getInt();
      send(msgALL.set(all_ch));
      wait(500);
      send(msgALL.setDestination(255).set(all_ch));
      wait(5000);
      send(msgALL.setDestination(255).set(all_ch));
      wait(5000);
      send(msgALL.setDestination(255).set(all_ch));
      wait(500);
      saveState(250, all_ch);
    }
  }
}

//*********************************************************************

void softReset() {
  asm volatile ("  jmp 0");
}
Скетч для ноды
Vannaya_2_2_0_new.zip
(6.74 КБ) 267 скачиваний
Ответить