MSMDPower-node

Показывайте и делитесь своими замечательными проектами здесь! Мы любим картинки!
Ответить
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

MSMDPower-node

Сообщение Sergey2055 »

Данное устройство предназначено для установки в скрытом варианте в подрозетник или потолком. Устройство питается от сети переменного тока напряжением 80-270в (верхний порог с запасом и в реальности гораздо выше) и предназначено для коммутации токов до 16А. Так же данный модуль имеет функции защиты нагрузки от низкого и повышенного напряжения (порог устанавливается пользователем), а также функции защиты по току (порог устанавливается пользователем) и по температуре (порог устанавливается пользователем). Имеет возможность работы на 2х частотах 2,4ГГц и 433 мГц, ну и есть множество доп функций для пользователя (частично в доработке софтовая часть).

Ниже представлена урезанная схема устройства и код для первого старта. Также на фото представлено само устройство в облегченном варианте для простой коммутации ламп освещения. Также схема и платы могут отличаться в зависимости от версии. Ниже во вложении представлена стартовая верси.

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

/*
 * Filename: Relay for lamp
 * .ino
 * Created Date: Sunday, september 22 2019, 2:16:34 pm
 * Author: Sergey Lekarev
 * 
 * Copyright (c) 2019 Sergey Lekarev
 * 
 * 
 */
//========  ПОДПРОГРАММА КОТОРАЯ ВЫДЕРГИВАЕТ ТИП ПЕРЕМЕННОЙ  ============//
//Urms=K*sqrt(1/N*sum(Uadc*Uadc)),
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
template <typename T_ty> struct TypeInfo {
  static const char * name;
};
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name
#define MAKE_TYPE_INFO(type)  template <> const char * TypeInfo<type>::name = #type;
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( bool )
MAKE_TYPE_INFO( byte )
MAKE_TYPE_INFO( String )
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
 
#define MY_NODE_ID AUTO
#define MY_PARENT_NODE_ID AUTO
#define MY_RADIO_RF24
#define MY_RF24_PA_LEVEL RF24_PA_MAX

#include <MySensors.h>
#include <avr/wdt.h>
#include <EEPROM.h>

#define SKETCH_NAME "MSMDRelay light"
#define SKETCH_MAJOR_VER "1"
#define SKETCH_MINOR_VER "0"

#define SID_RELAY         1
#define SID_MSMD          210
#define SID_NodeID        211
#define SID_FREQ          212
#define SID_PARENT_SELECT 213

#define MaxByte  0xFF
#define MaxWord  0xFFFF

#define mFreq     8

#define RELAY     6

#define cGateAdr 0
#define DEF_FREQUENCY 1 // min
#define DEB_SWITCH_PIN  3
#define MAXTRY 5 //Количество попыток отправки пакета.
#define PAUSETX 100

unsigned long Freq = DEF_FREQUENCY*60*1000ul, oldFreq = 0;
bool Relay = 0, Relay_Old = 0;

int value_int;
float value_float;
bool value_bool;
byte value_byte;
String value_String;
String Flag_type;

void(* resetFunc) (void) = 0;

// String  var = getValue( StringVar, ',', 2); // if  a,4,D,r  would return D        
String getValue(String data, char separator, int index){
    int found = 0;
    int strIndex[] = { 0, -1 };
    int maxIndex = data.length();

    for (int i = 0; i <= maxIndex && found <= index; i++) {
        if (data.charAt(i) == separator || i == maxIndex) {
            found++;
            strIndex[0] = strIndex[1] + 1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }
    }
    return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}  // END

void before(){  
  wdt_disable();

  pinMode(DEB_SWITCH_PIN, INPUT_PULLUP);  
  if (digitalRead(DEB_SWITCH_PIN) == LOW){    
    
    for (int i=0;i<512;i++)
      EEPROM.write(i, 0xFF);   
  }

  // RELAY
  pinMode(RELAY, OUTPUT);

  //=== Read from memory
  // Freq
  uint8_t fBVal = loadState(mFreq);
  if (fBVal != MaxByte) {    
    Freq = int(fBVal)*60*1000ul;
  }
  
}

void setup(){
  wdt_enable(WDTO_8S);
} 

void presentation() { 
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);
  
  present(SID_RELAY     ,    S_LIGHT,    "Relay ON/OFF");
  wait(100);
  present(SID_MSMD,          S_CUSTOM, "a00678cb4bc49c5e");
  wait(100);
  present(SID_NodeID,        S_CUSTOM, "Node ID");
  wait(100);
  present(SID_FREQ,          S_CUSTOM, "NODE FREQ MINUTE");
  wait(100);
  present(SID_PARENT_SELECT, S_CUSTOM, "NODE_PARENT_SELECT");
} 

void loop() {
  wdt_reset();
 
  Relay_status();
  
  if(millis() - oldFreq > Freq){
    oldFreq = millis();
    
    value_bool = Relay;
    Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
    int z = TX(cGateAdr, SID_RELAY, V_STATUS); 

  }
 
}

void receive(const MyMessage &message) {

  if (message.isAck()) {
    return;
  }
 
  String Str = ""; bool z;
  uint8_t Dest = message.sender;

  // Request
  if (mGetCommand(message) == C_REQ) {

    switch (message.sensor) {

    case SID_FREQ:

       value_byte = Freq / (60*1000ul);
       Flag_type = TYPE_NAME(value_byte);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
       z = TX(Dest, SID_FREQ, V_VAR1); 
       break;

    case SID_RELAY:
       value_bool = Relay;
       Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
       z = TX(Dest, SID_RELAY, V_STATUS); 
       break;
       
    }
    return;
  }

  // Set NULL date (if empty sensors)
  if (strlen(message.getString()) == 0) {
    return;
  }

  switch (message.sensor) {
    
  case SID_RELAY:
    Relay = message.getBool();  
    break;    
  
  case SID_FREQ:
    Freq = message.getByte() * 60*1000ul;
    saveState(mFreq, message.getByte());    
    break;

  // NODE_NEW_ID; type == V_VAR1
  case SID_NodeID:
    byte Node_ID = message.getByte();
      hwWriteConfig(EEPROM_NODE_ID_ADDRESS, Node_ID);
      resetFunc();
      break;

    // NODE_NEW_PARENT; type == V_VAR1
  case SID_PARENT_SELECT:
    byte Node_Parent = message.getByte();
      hwWriteConfig(EEPROM_PARENT_NODE_ID_ADDRESS, Node_Parent);
      resetFunc();
      break;
  }  
}

void Relay_status(){
  if(Relay != Relay_Old){
    Relay_Old = Relay;
    digitalWrite(RELAY, Relay_Old);
    value_bool = Relay;
    Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
    int z = TX(cGateAdr, SID_RELAY, V_STATUS);
  }
}

//==============================================================================================
//////////<< SEND >>////////////////////////////////////////////////////////////////////////////
//==============================================================================================
int TX(byte Master_id, byte ID_sensors, byte Type_variable)   //bool variable
{  
  wdt_reset();
  byte count;
  bool send_data;
  MyMessage msg(ID_sensors, Type_variable);
  if (Flag_type == "int") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "float") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "bool") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "byte") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "String") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true);  //setDestination(Master_ID).setSensor(1).set(State1)  
  
wait(PAUSETX, ID_sensors, Type_variable);
 if (send_data == 0)
     {
       Serial.print("failed: ");
       Serial.println(send_data);
       while (send_data == 0 && count < MAXTRY)
         {         
            wdt_reset(); 
            count++;  
            Serial.print("Sending a message try No.");      
            Serial.println(count);
            if (Flag_type == "int") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "float") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "bool") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "byte") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true);  //setDestination(Master_ID).setSensor(1).set(State1)  
            if (Flag_type == "String") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true);  //setDestination(Master_ID).setSensor(1).set(State1)  

            wait(PAUSETX, ID_sensors, Type_variable);   
         }  
     }       
   else
     { 
       Serial.print("send_data: ");
       Serial.println(send_data);   
     }
       count = 0;
       return send_data;
}
Вложения
20191210_074545.jpg
20191210_074545.jpg (619.76 КБ) 14058 просмотров
20191210_074533.jpg
20191210_074533.jpg (304.79 КБ) 14058 просмотров
20191210_074522.jpg
20191210_074522.jpg (623.26 КБ) 14058 просмотров
20190505_145422.jpg
20190505_145422.jpg (549.04 КБ) 14161 просмотр
20190505_145428.jpg
20190505_145428.jpg (544.13 КБ) 14161 просмотр
document.jpg
document.jpg (120.54 КБ) 14163 просмотра
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

Re: MSMDPower-node

Сообщение Sergey2055 »

Еще вариант реализации умной розетки с полным функционалом и рабочим током до 16А
Вложения
20191214_185112.jpg
20191214_185112.jpg (132.32 КБ) 14039 просмотров
20191214_185100.jpg
20191214_185100.jpg (110.88 КБ) 14039 просмотров
20191214_185105.jpg
20191214_185105.jpg (104.72 КБ) 14039 просмотров
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

Re: MSMDPower-node

Сообщение Sergey2055 »

На этом этапе проект полностью закончен отработан и имеет несколько вариантов прошивки, также проведены испытания в течении 1,5 лет.
Ниже будет представлен архив в котором находятся 2 версии для процессора с частотой 8мгц и бутом для прошивки по радио и вторая версия для ардуино про мини с частотой 16мгц и родным бутом. А теперь немного описания принципа работы по прошивкам.
После подачи питания нода презентуется и начинает свою работу. В нормальном простом режиме: c кнопки подключенной на PD4 можно осуществить включение или отключение нагрузки. Также если воткнуть устройство с зажатой кнопкой то произойдет очистка памяти и всех настроек устройства. После того как устройство презентовалось его можно также включить с majordomo. Если в разделе сенсоров нет каких то сенсоров то их придется добавить в ручную. Ниже будет представлена информация с типом сенсора и за что он отвечает.

1. Сентор 1, тип V_STATUS отвечает за управление нагрузкой ON_OFF.
2. Сентор 2, тип V_CURRENT отвечает за измеренные показания тока которые присылает нода.
3. Сенсор 2, тип V_VAR5 отвечает за установку нижнего и верхнего пределов тока если нужно будет задействовать функцию отключения по току.
Чтоб установить эти параметры надо отправить 2 значения нижнего и верхнего предела записанные через запятую, пример (0.40,5.00). Как видно тут установлен нижний предел на уровне 0,4 А.
4. Сенсор 2, тип V_STATUS отвечает за включение функции отключения нагрузки по току если он выйдет за параметры min и max.
5. Сенсор 2, тип V_VAR1 отвечает за коррекцию показаний значений тока которые приходят с ноды. Для их калибровки нужно включить ноду без нагрузки посмотреть в какую сторону надо откалибровать значения и отправить с этого сенсора значение с соответствующим знаком. При условии что к старым значениям будет прибавляться новая константа с соответствующим знаком.
6. Сенсор 3, тип V_VAR1 отвечает за значение времени паузы перед отключением нагрузки. Если вам нужна пауза перед отключением нагрузки по току то этим сенсором устанавливается задержка в минутах. Также если установлено данное значение то при включении нагрузки если значение тока за пределами min и max также выдерживается эта пауза. Это сделано для того чтоб вы могли включить саму нагрузку и значения тока вышли на нужное нормальное значение. Это функция реализована для того, что бы если у вас нет функции отключения нагрузки по завершению работы, ее можно было отключить по току. Таймер реализован для задержки отключения например чтоб остыло сопло 3Д принтера или что то подобное.
7. Сенсор 211, тип V_VAR1 отвечает за смену ID ноды если требуется.
8. Сенсор 212, тип V_VAR1 отвечает за установку времени в минутах. Это время отвечает за период с которым нода присылает данные статуса реле и значение измеренного тока.
9. Сенсор 213, тип V_VAR1 отвечает за смену или установку нужного парента для ноды, если требуется.

На этом все. У кого возникнут вопросы задаем здесь, по возможности буду отвечать.
Ну и еще одна фоточка и архив с прошивками готового устройства которое сейчас в работе.
Планируются только разные вариации самого корпуса.
Вложения
Current_power.zip
(98.43 КБ) 1348 скачиваний
20200111_120556.jpg
20200111_120556.jpg (308.2 КБ) 13845 просмотров
20200111_112152.jpg
20200111_112152.jpg (686.1 КБ) 13845 просмотров
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

Re: MSMDPower-node

Сообщение Sergey2055 »

Всем привет. За это время было проведено много различных тестов и как не крути но по мимо горы плюсов (отсутствие протяжки проводов, моментальная интеграция в желаемое место, компактность итд) у радио канала есть 1 существенный недостаток это потеря пакетов при забитости эфира. Т.к. в моих устройствах применены модули на частоту 2,4 ггц, а это очень зашумленная частота на сегодня, то отсюда и вылезает эта слабая сторона. Но чтоб компенсировать этот пробел я стараюсь делать устройства не зависимые от управляещей программы. Каждое устройство имеет свою резервную программу со своими сценариями. Ниже будет представлена тестовая версия программы для управления уличным фонарем. В массиве ClockMem хранится таблица времени рассвета и сумерек для нужного региона. Для каждого региона придется забить свою таблицу либо применить сложную формулу расчета этого времени в зависимости от местоположения что будет реализовано в следующей моей прошивке.

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

/*
 * Filename: Relay for lamp
 * .ino
 * Created Date: Sunday, september 22 2019, 2:16:34 pm
 * Author: Sergey Lekarev
 * 
 * Copyright (c) 2019 Sergey Lekarev
 * 
 * 
 */
//========  ПОДПРОГРАММА КОТОРАЯ ВЫДЕРГИВАЕТ ТИП ПЕРЕМЕННОЙ  ============//
//Urms=K*sqrt(1/N*sum(Uadc*Uadc)),
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
template <typename T_ty> struct TypeInfo {
  static const char * name;
};
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name
#define MAKE_TYPE_INFO(type)  template <> const char * TypeInfo<type>::name = #type;
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( bool )
MAKE_TYPE_INFO( byte )
MAKE_TYPE_INFO( String )
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
#include <Time.h>
#include <TimeLib.h>

//#define MY_DEBUG
#define MY_NODE_ID AUTO
#define MY_PARENT_NODE_ID AUTO
#define MY_RADIO_RF24
#define MY_RF24_PA_LEVEL RF24_PA_MAX

#include <MySensors.h>
#include <avr/wdt.h>
#include <EEPROM.h>
const int timeZone = 3;     // мск

#define SKETCH_NAME "MSMDRelay light of time"
#define SKETCH_MAJOR_VER "1"
#define SKETCH_MINOR_VER "0"

#define SID_RELAY         1
#define SID_MSMD          210
#define SID_NodeID        211
#define SID_FREQ          212
#define SID_PARENT_SELECT 213

#define MaxByte  0xFF
#define MaxWord  0xFFFF

#define mFreq     8

#define RELAY     6

#define cGateAdr 0
#define DEF_FREQUENCY 1 // min
#define DEB_SWITCH_PIN  3
#define MAXTRY 5 //Количество попыток отправки пакета.
#define PAUSETX 100

unsigned long Freq = DEF_FREQUENCY*60*1000ul, oldFreq = 0;
bool Relay = 0, Relay_Old = 0;

int value_int;
float value_float;
bool value_bool;
byte value_byte;
String value_String;
String Flag_type;
bool flagstart;

void(* resetFunc) (void) = 0;

// String  var = getValue( StringVar, ',', 2); // if  a,4,D,r  would return D        
String getValue(String data, char separator, int index){
    int found = 0;
    int strIndex[] = { 0, -1 };
    int maxIndex = data.length();

    for (int i = 0; i <= maxIndex && found <= index; i++) {
        if (data.charAt(i) == separator || i == maxIndex) {
            found++;
            strIndex[0] = strIndex[1] + 1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }
    }
    return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}  // END

void before(){  
  wdt_disable();

  pinMode(DEB_SWITCH_PIN, INPUT_PULLUP);  
  if (digitalRead(DEB_SWITCH_PIN) == LOW){    
    
    for (int i=0;i<512;i++)
      EEPROM.write(i, 0xFF);   
  }

  // RELAY
  pinMode(RELAY, OUTPUT);

  //=== Read from memory
  // Freq
  uint8_t fBVal = loadState(mFreq);
  if (fBVal != MaxByte) {    
    Freq = int(fBVal)*60*1000ul;
  }
  
}


byte ClockMem[12][4][4] = {
    {
        {8, 12, 16, 55},
        {8,  9, 17,  4},
        {8,  3, 17, 15},
        {7, 55, 17, 27}       
        //{17, 54, 17, 56} 
    },
    {
        {7, 40, 17, 47},
        {7, 27, 18,  1},
        {7, 12, 18, 15},
        {6, 57, 18, 29}
    },
    {
        {6, 37, 18, 45},
        {6, 20, 19,  0},
        {6,  2, 19, 14},
        {5, 43, 19, 29}
    },
    {
        {5, 16, 19, 50},
        {4, 57, 20,  5},
        {4, 38, 20, 21},
        {4, 19, 20, 36}
    },
    {
        {3, 56, 20, 57},
        {3, 39, 21, 13},
        {3, 23, 21, 29},
        {3,  9, 21, 44}
    },
    {
        {2, 52, 22,  3},
        {2, 45, 22, 12},
        {2, 42, 22, 18},
        {2, 44, 22, 19}
    },
    {
        {2, 53, 22, 14},
        {3,  2, 22,  6},
        {3, 15, 21, 54},
        {3, 29, 21, 40}
    },
    {
        {3, 51, 21, 17},
        {4,  7, 21,  0},
        {4, 23, 20, 42},
        {4, 38, 20, 23}
    },
    {
        {4, 59, 19, 56},
        {5, 14, 19, 37},
        {5, 28, 19, 18},
        {5, 42, 18, 59}
    }, 
    {
        {5, 59, 18, 35},
        {6, 13, 18, 18},
        {6, 27, 18,  1},
        {6, 41, 17, 45}
    }, 
    {
        {7,  0, 17, 24},
        {7, 14, 17, 12},
        {7, 27, 17,  1},
        {7, 39, 16, 52}
    },
    {
        {7, 53, 16, 45},
        {8,  1, 16, 42},
        {8,  8, 16, 43},
        {8, 11, 16, 46}
    }                                  
};


void setup(){
  wdt_enable(WDTO_8S);
  int old_h = hour();
  int old_m = minute();

  for(int i = 0; i < 10; i++){
    requestTime();
    wait(2000);
    if(hour() != old_h || minute() != old_m) {flagstart = 1; i = 11;}
  }
  /*
  Serial.print("flagstart: ");
  Serial.println(flagstart);
  Serial.print("Hour: ");
  Serial.println(hour());
  Serial.print("Minute: ");
  Serial.println(minute());*/
}  

void presentation() { 
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);
  
  present(SID_RELAY     ,    S_LIGHT,    "Relay ON/OFF");
  wait(300);
  present(SID_MSMD,          S_CUSTOM, "a00678cb4bc49c5e");
  wait(300);
  present(SID_NodeID,        S_CUSTOM, "Node ID");
  wait(300);
  present(SID_FREQ,          S_CUSTOM, "NODE FREQ MINUTE");
  wait(300);
  present(SID_PARENT_SELECT, S_CUSTOM, "NODE_PARENT_SELECT");
} 

void loop() {
  wdt_reset();
 
  Relay_status();
  
  if(millis() - oldFreq > Freq){
    oldFreq = millis();
    
    value_bool = Relay;
    Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
    int z = TX(cGateAdr, SID_RELAY, V_STATUS); 

  }
  
  int h = hour();
  int m = minute();
  int M = month()-1;
  bool FlagPower = digitalRead(RELAY);
  int dayM = day();
  int week = 0;


 if(flagstart == 1){
   
  if(0 < dayM < 8) week = 0;     
   if(7 < dayM < 15) week = 1;  
    if(14 < dayM < 22) week = 2;  
     if(21 < dayM < 32) week = 3;
     
 /*    
    Serial.print("Hour: ");
  Serial.println(h);
  Serial.print("Minute: ");
  Serial.println(m);
  Serial.print("Week: ");
  Serial.println(dayM);
  Serial.print("Memory1: ");
  Serial.println(ClockMem[M][week][0]);
    Serial.print("Memory2: ");
  Serial.println(ClockMem[M][week][1]); */
  
  if(FlagPower == 1){             
    if(ClockMem[M][week][0] == h){
      if(ClockMem[M][week][1] == m){
         Relay = 0;                          
      }
    }
  }

  if(FlagPower == 0){             
    if(ClockMem[M][week][2] == h){
      if(ClockMem[M][week][3] == m){
         Relay = 1;                          
      }
    }
  }
} 
  if(weekday() == 1 && hour() == 0 && minute() == 10){
    requestTime();
    wait(2000);
    flagstart = 1;
 }
 
}

void receive(const MyMessage &message) {

  if (message.isAck()) {
    return;
  }
 
  String Str = ""; bool z;
  uint8_t Dest = message.sender;

  // Request
  if (mGetCommand(message) == C_REQ) {

    switch (message.sensor) {

    case SID_FREQ:

       value_byte = Freq / (60*1000ul);
       Flag_type = TYPE_NAME(value_byte);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
       z = TX(Dest, SID_FREQ, V_VAR1); 
       break;

    case SID_RELAY:
       value_bool = Relay;
       Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
       z = TX(Dest, SID_RELAY, V_STATUS); 
       break;
       
    }
    return;
  }

  // Set NULL date (if empty sensors)
  if (strlen(message.getString()) == 0) {
    return;
  }

  switch (message.sensor) {
    
  case SID_RELAY:
    Relay = message.getBool();  
    break;    
  
  case SID_FREQ:
    Freq = message.getByte() * 60*1000ul;
    saveState(mFreq, message.getByte());    
    break;

  // NODE_NEW_ID; type == V_VAR1
  case SID_NodeID:
    byte Node_ID = message.getByte();
      hwWriteConfig(EEPROM_NODE_ID_ADDRESS, Node_ID);
      resetFunc();
      break;

    // NODE_NEW_PARENT; type == V_VAR1
  case SID_PARENT_SELECT:
    byte Node_Parent = message.getByte();
      hwWriteConfig(EEPROM_PARENT_NODE_ID_ADDRESS, Node_Parent);
      resetFunc();
      break;
  }  
}

void Relay_status(){
  if(Relay != Relay_Old){
    Relay_Old = Relay;
    digitalWrite(RELAY, Relay_Old);
    value_bool = Relay;
    Flag_type = TYPE_NAME(value_bool);         // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
    int z = TX(cGateAdr, SID_RELAY, V_STATUS);
  }
}

//==============================================================================================
//////////<< SEND >>////////////////////////////////////////////////////////////////////////////
//==============================================================================================
int TX(byte Master_id, byte ID_sensors, byte Type_variable)   //bool variable
{  
  wdt_reset();
  byte count;
  bool send_data;
  MyMessage msg(ID_sensors, Type_variable);
  if (Flag_type == "int") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "float") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "bool") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "byte") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true);  //setDestination(Master_ID).setSensor(1).set(State1)
  if (Flag_type == "String") 
    send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true);  //setDestination(Master_ID).setSensor(1).set(State1)  
  
wait(PAUSETX, ID_sensors, Type_variable);
 if (send_data == 0)
     {
       Serial.print("failed: ");
       Serial.println(send_data);
       while (send_data == 0 && count < MAXTRY)
         {         
            wdt_reset(); 
            count++;  
            Serial.print("Sending a message try No.");      
            Serial.println(count);
            if (Flag_type == "int") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "float") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "bool") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true);  //setDestination(Master_ID).setSensor(1).set(State1)
            if (Flag_type == "byte") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true);  //setDestination(Master_ID).setSensor(1).set(State1)  
            if (Flag_type == "String") 
              send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true);  //setDestination(Master_ID).setSensor(1).set(State1)  

            wait(PAUSETX, ID_sensors, Type_variable);   
         }  
     }       
   else
     { 
       Serial.print("send_data: ");
       Serial.println(send_data);   
     }
       count = 0;
       return send_data;
}

//==============================================================================================
//////////<< GET TIME >>////////////////////////////////////////////////////////////////////////
//==============================================================================================
void receiveTime(unsigned long controllerTime) {
  controllerTime = controllerTime + timeZone * SECS_PER_HOUR;
  setTime(controllerTime);

}
pasha413
Сообщения: 20
Зарегистрирован: 29 ноя 2019, 16:52

Re: MSMDPower-node

Сообщение pasha413 »

Здравствуйте. А не могли бы вы выложить печатную плату?
Ответить