Это скетчи для шлюза и ноды (Меняет номер канала для всей сети из модуля в мажордомо, меняет 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");
}