MYS_2ReleySwitch - выключатель на 2 реле

Показывайте и делитесь своими замечательными проектами здесь! Мы любим картинки!
Ответить
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

MYS_2ReleySwitch - выключатель на 2 реле

Сообщение pasha413 »

Здравствуйте. Т.к того что я хотел нигде не нашел, решил выложить свое чудо, пока тестирование чисто на столе, работает.
Предполагается установка в подрозетник за двухклавишный выключатель (без фиксации).
Если есть какие-то вопросы, спрашивайте. на фото плата еще не отмыта.
Критика и улучшения приветствуются!

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

#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
#define MY_TRANSPORT_WAIT_READY_MS 1000 // Запуск без сети MyS
#define MY_REPEATER_FEATURE
#define MY_NODE_ID 10                  // Номер ноды
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_MAX)

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

#define BUTTON_1 9
#define BUTTON_2 11
#define RELAY_1 0
#define RELAY_2 1
#define REL1_CHILD_ID 50
#define REL2_CHILD_ID 51
#define TEMP_CHILD_ID 252 //for any tests
#define SIGNAL_Q_ID 253

bool state_1 = 0;             // Объявляем переменные
bool state_2 = 0;             // статус1 и статус2
uint32_t rawTemperature=0;
float celsius=0.0;  //rawTemperature converted to Celsius
uint32_t C_BATT_TIME = 30000; //отправка через час
uint32_t myTimer1;
int16_t linkQuality;
int16_t old_linkQuality;

Bounce bouncer1 = Bounce(BUTTON_1, 5); 
Bounce bouncer2 = Bounce(BUTTON_2, 5); 
MyMessage msg1(REL1_CHILD_ID, V_STATUS); // Создаём контейнеры
MyMessage msg2(REL2_CHILD_ID, V_STATUS);
MyMessage msg3(TEMP_CHILD_ID, V_TEMP);

void presentation() {
  sendSketchInfo("Relay+Button", "1.0");
  present(REL1_CHILD_ID, S_BINARY,"Relay1");
  wait(100);
  present(REL2_CHILD_ID, S_BINARY,"Relay2");
  wait(100);
  present(TEMP_CHILD_ID, S_TEMP, "INTERNAL TEMP", 1);
  wait(100);
  present(SIGNAL_Q_ID, S_CUSTOM, "SIGNAL QUALITY", 1);
  wait(100);
}

void setup() {
  pinMode(BUTTON_1, INPUT_PULLUP); // Пин2 вход с подтяжкой (Кнопка1)
  pinMode(BUTTON_2, INPUT_PULLUP); // Пин3 вход с подтяжкой (Кнопка2)
  pinMode(RELAY_1, OUTPUT);       // Пин4 выход (Реле1)
  pinMode(RELAY_2, OUTPUT);       // Пин5 выход (Реле2)
  NRF_TEMP->TASKS_STOP;
  NRF_TEMP->INTENSET=1;  //enable EVENTS_DATARDY temperature interrupt
  while (!(NRF_TEMP->INTENSET==1)) {} //wait until completed
  send(msg1.set(state_1));       // Отправляем состояние реле1 на контроллер
  wait(100);
  send(msg2.set(state_2));       // Отправляем состояние реле1 на контроллер
  wait(100);
}

void loop() {
  //если сменилось состояние кнопки
  if (bouncer1.update() ) {
    if (bouncer1.read() == LOW) { //если считано значение 1
      if (state_1 == 1 ) { //если свет был выключен, будем его включать
        state_1 = 0; 
      } else { //если свет был включен, будем выключать
        state_1 = 1;
      }
      digitalWrite(RELAY_1, state_1);        // Записываем значение переменных
      send(msg1.set(state_1));       // Отправляем состояние реле1 на контроллер
    }
  }
  if (bouncer2.update() ) {
    if (bouncer2.read() == LOW) { //если считано значение 1
      if (state_2 == 1 ) { //если свет был выключен, будем его включать
        state_2 = 0; 
      } else { //если свет был включен, будем выключать
        state_2 = 1;
      }
      digitalWrite(RELAY_2, state_2);        // Записываем значение переменных
      send(msg2.set(state_2));       // Отправляем состояние реле1 на контроллер
    }
  }
  if (millis() - myTimer1 >= C_BATT_TIME) {   // 
    myTimer1 = millis();              // сброс таймера
    readTemp();
    wait(100);
    linkQuality = calculationRxQuality();
    if (linkQuality != old_linkQuality) {
      wait(10);
      sendSignalStrength(linkQuality);
      wait(50);
      old_linkQuality = linkQuality;
    }
  }
}

void readTemp() {
  NRF_TEMP->TASKS_START=1;
  while (!(NRF_TEMP->EVENTS_DATARDY)) {} //wait until temperature measurement is complete
  rawTemperature=NRF_TEMP->TEMP;
  celsius=((float)rawTemperature)/4.0;
  send(msg3.set(celsius, 1));
  wait(10);
}

bool sendSignalStrength(const int16_t level, const bool ack) {
  return _sendRoute(build(_msgTmp, GATEWAY_ADDRESS, SIGNAL_Q_ID, C_SET, V_VAR1,
                          ack).set(level));
}
int16_t calculationRxQuality() {
  int16_t nRFRSSI_temp = transportGetReceivingRSSI();
  int16_t nRFRSSI = map(nRFRSSI_temp, -85, -40, 0, 100);
  if (nRFRSSI < 0) {
    nRFRSSI = 0;
  }
  if (nRFRSSI > 100) {
    nRFRSSI = 100;
  }
  return nRFRSSI;
}

void receive(const MyMessage &message){
  // Если пришло сообщение для сенсора, записываем его в переменную статус1
  if ((message.type ==  V_STATUS)&&(message.sensor == REL1_CHILD_ID)) {
    state_1 = message.getBool();
    digitalWrite(RELAY_1, state_1);
    send(msg1.set(state_1));       // Отправляем состояние реле1 на контроллер
  }
  // Если пришло сообщение для сенсора, записываем его в переменную статус2
  if ((message.type ==  V_STATUS)&&(message.sensor == REL2_CHILD_ID)) {
    state_2 = message.getBool();
    digitalWrite(RELAY_2, state_2);
    send(msg2.set(state_2));       // Отправляем состояние реле2 на контроллер
  }
  if (mGetCommand(message) == C_REQ) {
    send(msg1.set(state_1));       // Отправляем состояние реле1 на контроллер
    send(msg2.set(state_2));       // Отправляем состояние реле2 на контроллер
  }
}
Вложения
схема.jpg
схема.jpg (35.37 КБ) 11310 просмотров
Rele_v2.rar
(24.4 КБ) 739 скачиваний
2020-03-03 16-03-44.JPG
2020-03-03 16-03-44.JPG (630.78 КБ) 11391 просмотр
2020-03-03 16-03-54.JPG
2020-03-03 16-03-54.JPG (406.71 КБ) 11391 просмотр
Последний раз редактировалось pasha413 07 мар 2020, 07:45, всего редактировалось 2 раза.
vad
Сообщения: 1
Зарегистрирован: 06 мар 2020, 11:38

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение vad »

pasha413 писал(а): 03 мар 2020, 13:14 Критика и улучшения приветствуются!
Как вообще можно что-либо обсуждать, если нет основного для электронного устройства - схемы?
Остальных разработок это тоже касается.
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение pasha413 »

обновил немного код на 2 выключателя и 2 реле.
Вложения
Smart2Switch_nrf51_v2.2.1.rar
(6.28 КБ) 749 скачиваний
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение pasha413 »

А также, наконец-таки :) выкладываю код на клик/двойной клик/долгое нажатие:
код не идеален, доработки приветствуются!
презентация в мажоре прикладываю.
Разработал новую плату под 1 реле с датчиком замера тока на ACS712, еще не распаивал и за код даже не брался...
Вложения
Smart2Switch_nrf51_v2.2.1.rar
(6.28 КБ) 761 скачивание
IMG_20200827_192704.jpg
IMG_20200827_192704.jpg (225.27 КБ) 9891 просмотр
IMG_20200827_192121.jpg
IMG_20200827_192121.jpg (491.25 КБ) 9891 просмотр
clontv
Сообщения: 1
Зарегистрирован: 10 сен 2020, 02:19

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение clontv »

pasha413 писал(а): 03 мар 2020, 13:14

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

  if (bouncer1.update() ) {
    if (bouncer1.read() == LOW) { //если считано значение 1
      if (state_1 == 1 ) { //если свет был выключен, будем его включать
        state_1 = 0; 
      } else { //если свет был включен, будем выключать
        state_1 = 1;
      }
      ...
  if (bouncer2.update() ) {
    if (bouncer2.read() == LOW) { //если считано значение 1
      if (state_2 == 1 ) { //если свет был выключен, будем его включать
        state_2 = 0; 
      } else { //если свет был включен, будем выключать
        state_2 = 1;
      }
      ...
Есть замечательная функция в библиотеке Bounce

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

       bool state[2]{};
       ...
                if (!bouncer[index]->update())
                  continue / return / break;
                if (!bouncer[index]->fell())
                  continue / return / break;
                 
                 state[index] = !state[index];
                 digitalWrite(...);
А вот платки отличные, завидую доброй завистью :)
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение pasha413 »

спасибо, чему завидовать то? все для себя же делаем)
сейчас немного обновил скетчи выключателей, в таком виде работают.

надо будет совместить в один конечно, руки не доходят.
Вложения
Smart2Switch2Rel_nrf51_v2.3.1.rar
(6.11 КБ) 788 скачиваний
Smart1Switch1Rel_nrf51_v2.3.1.rar
(6.12 КБ) 734 скачивания
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

Re: MYS_2ReleySwitch - выключатель на 2 реле

Сообщение pasha413 »

Здравствуйте. Обновил и объединил код для 1 и 2х выключателей. теперь выбор при заливке кода.

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

//#define REL2  // раскомментировать если 2 реле
#define MY_NODE_ID 120                  // Номер ноды
архив с кодом прикрепил.
SmartSwitch_nrf51_v2.3.3.rar
(7.74 КБ) 794 скачивания
код на данный момент тестирую на отвалы из сети и др. проблемы.
задействованы пины для nrf51822_yj14001. если у вас другой, то необходимо исправить на соответствующий.

управление:
- кратковременное нажатие на кнопку - управление встроенным реле. первая кнопка первое реле, вторая кнопка соответственно второе реле.
- двойной клик для своих нужд. можно задействовать для таймера или др...
- долгое нажатие (5сек) отправка презентации.

Для корректного отображения статуса реле необходимо установить галки АСК.
Ответить