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

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

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

Сообщение pasha413 » 03 мар 2020, 13:14

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

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

#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 КБ) 155 просмотров
Rele_v2.rar
(24.4 КБ) 11 скачиваний
2020-03-03 16-03-44.JPG
2020-03-03 16-03-44.JPG (630.78 КБ) 236 просмотров
2020-03-03 16-03-54.JPG
2020-03-03 16-03-54.JPG (406.71 КБ) 236 просмотров
Последний раз редактировалось pasha413 07 мар 2020, 07:45, всего редактировалось 2 раза.

vad
Сообщения: 1
Зарегистрирован: 06 мар 2020, 11:38

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

Сообщение vad » 06 мар 2020, 11:46

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

Ответить