Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодой

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Ответить
Berk
Сообщения: 81
Зарегистрирован: 11 окт 2017, 22:05

Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодой

Сообщение Berk »

Смена номера канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодой.

Это скетчи для шлюза и ноды (Меняет номер канала для всей сети из модуля в мажордомо, меняет node id из модуля в мажордомо, автопоиск сети при добавлении новой ноды). Сделано для шлюза на ESP, но сделать под другой шлюз не проблема. На ноде нужна кнопка(режим поиска сети) для переключения между режимами(удерживате кнопку и нажимаете на рессет, или можно просто псоединить pin с землей). В обычном режиме нода в сети получает номер канала от шлюза через броадкаст сообщение, после получения прописывает номер канала в своей памяти и перезагружается(все ноды в сети), при добавлении новойноды в вашу сеть, нода начинает искать канал (сначала смотрит на номер 76), если на этом канале сети нет, то далее идет перебор каналов, после нахождения канала с сетью, прописывает канал в памяти, регистрируется. Если требуется очистить память(обнулить ноду) с помощью стандартного скетча EEPROM CLEAR из примеров в среде IDE, измените число, которое будет записано в ячейках вместо 0, необходимо указать 255. Я надеюсь, что это подталкнет сообщество к дальнейшему развитию этого функционала.

шлюз

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

int channelid_count;
int channelid;
int last_channelid = 0;
int reed_id200;

#include <ArduinoOTA.h>

#define MY_DEBUG

#define MY_BAUD_RATE 9600

#define MY_RADIO_NRF24

#define MY_RF24_CHANNEL channelid

#define MY_GATEWAY_ESP8266

#define MY_ESP8266_SSID "MySSID"
#define MY_ESP8266_PASSWORD "MyVerySecretPassword"

//#define MY_ESP8266_HOSTNAME "sensor-ota-gateway"

//#define MY_IP_ADDRESS 192,168,178,87

//#define MY_IP_GATEWAY_ADDRESS 192,168,178,1
//#define MY_IP_SUBNET_ADDRESS 255,255,255,0

#define MY_PORT 5003

#define MY_GATEWAY_MAX_CLIENTS 4

#define MY_INCLUSION_MODE_FEATURE

//#define MY_INCLUSION_BUTTON_FEATURE

//#define MY_INCLUSION_MODE_DURATION 120

//#define MY_INCLUSION_MODE_BUTTON_PIN  2

#define MY_DEFAULT_LED_BLINK_PERIOD 500

#define MY_DEFAULT_ERR_LED_PIN 16  // Error led pin
#define MY_DEFAULT_RX_LED_PIN  0  // Receive led pin
#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED

#include <ESP8266WiFi.h>

#include <MySensors.h>

#define CHANNEL_ID 200

MyMessage Msg(CHANNEL_ID, V_STATUS);
MyMessage Msg1(253, V_VAR1);




void before()
{
  channelid_count = loadState(200);
  if (channelid_count > 125)
  {
    channelid = 76;
    last_channelid = 76;
    saveState(200, channelid);
  }
  if (channelid_count <= 125)
  {
    last_channelid = channelid_count;
    channelid = channelid_count;
  }
}




void presentation()
{
  sendSketchInfo("GATE CHANGE CHANNEL ID", "1.0");
  present(CHANNEL_ID, S_BINARY);
}




void setup()
{
  Serial.println("####################################");
  Serial.print("################### --- >  CHANNEL = ");
  Serial.println(channelid);
  Serial.println("####################################");

  ArduinoOTA.onStart([]() {
    Serial.println("ArduinoOTA start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nArduinoOTA end");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("OTA Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}



void loop()
{
  ArduinoOTA.handle();
}




void receive(const MyMessage &message)
{
  if (message.type == V_STATUS) {
    if (message.sensor == CHANNEL_ID)
    {
      int channelid2 = message.getInt();
      if (channelid2 > 125) {
        channelid2 = 76;
        saveState(200, channelid2);
        wait(500);
        send(Msg.set(channelid2));
        wait(1000);
        channelid = channelid2;
        last_channelid = channelid2;
      }
      else
      {
        saveState(200, channelid2);
        wait(500);
        send(Msg.set(channelid2), 1);
        wait(1000);
        send(Msg1.setDestination(255).set(channelid2));
        channelid = channelid2;
        last_channelid = channelid2;
      }
    }
  }
}
 
нода

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

int t_time_run = 9000;
int nodeid;
int channelid_count;
int channelid;
int last_channelid;
byte fflag_ch;
byte first_pwon;
int last_channelid2;
int id253;
int id254;
int tt;


#define MY_DEBUG

#define MY_RADIO_NRF24

#define MY_RF24_CHANNEL channelid_count

#define MY_TRANSPORT_WAIT_READY_MS tt

#include <MySensors.h>

#define NCHANNEL_ID 253
#define SENS_ID 254

MyMessage Msg1(NCHANNEL_ID, V_STATUS);
MyMessage Msg2(SENS_ID, V_STATUS);




void before() {
  channelid_count = loadState(200);
  last_channelid2 = loadState(202);
  fflag_ch = loadState(201);
  first_pwon = loadState(205);
  Serial.begin(115200);
  pinMode(5, INPUT_PULLUP);
  delay(20);
  if ((digitalRead(5) == 0) || (fflag_ch == 255))
  {
    fflag_ch = 0;
    saveState(201, fflag_ch);
  }


  if (fflag_ch == 1)
  {
    tt = 0;
    if (channelid_count > 125)
    {
      channelid = 76;
      last_channelid = 76;
      saveState(200, channelid);
    }
    if ((channelid_count != 0) && (channelid_count <= 125))
    {
      last_channelid = channelid_count;
      channelid = channelid_count;
    }
    if (channelid_count == 0)
    {
      last_channelid = channelid_count;
      channelid = channelid_count;
      saveState(200, channelid);
    }
  }


  if (fflag_ch == 0) {
    tt = t_time_run;
    if (first_pwon != 1)
    {
      channelid_count = 76;
      saveState(200, channelid_count);
      Serial.print("#################### -------------------------------->>> ");
      Serial.println(channelid_count);
      Serial.print(" <<<-------------------------------- ####################");
    }


    if (first_pwon == 1) {
      if (channelid_count == 76) {
        channelid_count = 0;
        last_channelid2 = 0;
        saveState(200, channelid_count);
        saveState(202, last_channelid2);
        Serial.print("#################### -------------------------------->>> ");
        Serial.println(channelid_count);
        Serial.print(" <<<-------------------------------- ####################");
      }
      else
      {
        if ((channelid_count == 0) || ((channelid_count > 0) && (((channelid_count - last_channelid2) - 1) != 0))) {
          channelid_count = 1;
          last_channelid2 = 0;
          saveState(200, channelid_count);
          saveState(202, last_channelid2);
          Serial.print("#################### -------------------------------->>> ");
          Serial.println(channelid_count);
          Serial.print(" <<<-------------------------------- ####################");
        }
        else
        {
          if ((channelid_count > 0) && (((channelid_count - last_channelid2) - 1) == 0))
          {
            channelid_count++;
            last_channelid2++;
            saveState(200, channelid_count);
            saveState(202, last_channelid2);
            Serial.print("#################### -------------------------------->>> ");
            Serial.println(channelid_count);
            Serial.print(" <<<-------------------------------- ####################");
          }
        }
      }
    }
  }
}




void presentation()
{
  sendSketchInfo("CHANGE CHANNEL & NODE ID", "1.0");
  present(NCHANNEL_ID, S_BINARY);
  wait(200);
  present(SENS_ID, S_BINARY);
}




void setup()
{
  if (fflag_ch == 0) {
    if (first_pwon != 0) {
      first_pwon = 1;
      saveState(205, first_pwon);
    }
  }


  if (fflag_ch == 1) {
    id254 = getNodeId();
    id253 = loadState(200);
    send(Msg1.set(id253));
    wait(200);
    send(Msg2.set(id254));
    wait(200);
    //############################# YOUR SCETCH SETUP #################################






    //#################################################################################
  }
}




void receive(const MyMessage &message)
{
  if (message.type == V_STATUS) {

    if (message.sensor == NCHANNEL_ID)
    {
      channelid = message.getInt();
      if (channelid > 125) {
        channelid = 76;
        saveState(200, channelid);
        wait(500);
        send(Msg1.set(channelid));
        wait(3000);
        softReset();
      }
      else
      {
        saveState(200, channelid);
        wait(500);
        send(Msg1.set(channelid));
        wait(3000);
        softReset();
      }
    }

    if (message.sensor == SENS_ID)
    {
      nodeid = message.getInt();
      saveState(0, nodeid);
      send(Msg2.set(nodeid));
      wait(500);
      softReset();
    }
  }


  if (message.type == V_VAR1) {
    if (message.sensor == 253)
    {
      channelid = message.getLong();
      if (channelid > 125) {
        channelid = 76;
        saveState(200, channelid);
        wait(500);
        send(Msg1.set(channelid));
        wait(3000);
        softReset();
      }
      else
      {
        saveState(200, channelid);
        wait(500);
        send(Msg1.set(channelid));
        wait(3000);
        softReset();
      }
    }
  }

}



void loop()
{
  if (fflag_ch == 0) {
    int hd = transportGetDistanceGW();
    wait(100);
    if ((hd == 255) || (hd == 0))
    {
      softReset();
    }
    else
    {
      fflag_ch = 1;
      saveState(201, fflag_ch);
      wait(500);
      softReset();
    }
  }

  if (fflag_ch == 1) {
    //############################## YOUR SCETCH LOOP #################################






    //#################################################################################
  }
}




void softReset() {
  asm volatile ("  jmp 0");
}
 
ahelper
Сообщения: 7
Зарегистрирован: 21 янв 2018, 16:28

Re: Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодо

Сообщение ahelper »

Если в ноде загрузчик MYSBootloader, то если сменить 76 канал на другой, не будет работать прошивка по воздуху? Нужно будет гейт перед заменой прошивки на ноде переводить на 76 ой канал?
lanket
Сообщения: 17
Зарегистрирован: 08 июн 2017, 07:07

Re: Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодо

Сообщение lanket »

А что делать тем у кого шлюз это прямое подключение Нрф к малине?

Отправлено с моего Redmi Note 4 через Tapatalk

Berk
Сообщения: 81
Зарегистрирован: 11 окт 2017, 22:05

Re: Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодо

Сообщение Berk »

Здравствуйте, этот пример точно не для загрузчика бутлоадер. И я ни в коем случае не рекомендую использовать этот пример в готовых устройствах, намучаетесь)) , я только показываю что можно придумать.
Подпрограмма сканера сети уже работает по другому, быстрее, без перезагрузок, со 100% результатом. Принцип реализации рассылки широковещательных команд или оповещений на ноды может пригодится во многих ситуациях, не только для передачи номера канала. Но принцип работы тоже уже немного другой(смотрите мои другие темы), да и их на самом деле вариантов много может быть.
Данные решения на данный момент подходят только для загрузчиков Оптибот(стандартный) и Дуалоптибот(загрузка по воздуху).
Но вы же понимаете что МусБутлоадер(если пользоваться готовыми скомпилированными хексами загрузчика) не будет работать на обновление в любом случае если у вас частота сети просто отличается от стандартной?
Поэтому что бы и на нем могли работать неокторые мои идеи я сейчас учусь компилировать свои хексы Мусбутлоадера, тогда как минимум можно будет прописывать свой канал, а как максимум добавив немного кода с логикой сканера сети искать канал из загрузчика(но там тоже есть проблемы, тк загрузчик работает на куске протокола 1.4, но вроде решаемо)
Последний раз редактировалось Berk 23 янв 2018, 07:40, всего редактировалось 2 раза.
Berk
Сообщения: 81
Зарегистрирован: 11 окт 2017, 22:05

Re: Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодо

Сообщение Berk »

lanket писал(а): 23 янв 2018, 06:37 А что делать тем у кого шлюз это прямое подключение Нрф к малине?

Отправлено с моего Redmi Note 4 через Tapatalk
Учить Си , Баш. Я был бы рад если бы кто нибудь озадачился этим. И еще раз обращу внимание на момент, примеры рабочие, НО это не готовый пример для использования, это экспериментальная программа...
ahelper
Сообщения: 7
Зарегистрирован: 21 янв 2018, 16:28

Re: Смена канала для всей сети из интерфейса мажордомо, смена ID ноды из интерфейса мажордомо, автопоиск сети новой нодо

Сообщение ahelper »

Попробовал данный скетч, и все было бы нормально, если бы строка "saveState(0, nodeid);" запись проводила в нулевую ячейку. Нулевая ячейка в библиотеке MySensors начинается с 413 (вроде так). И для того чтобы прописать ID node в нулевую ячейку нужна строка hwWriteConfig(EEPROM_NODE_ID_ADDRESS, nodeid);.
Ответить