Использование DDNS в модуле WiFi ESP8266 на Arduino

Что-бы привязать ESP8266 к сервису динамических адресов, вам нужно узнать MAC адрес модуля. Для этого прошиваете в него пример скетча и в мониторе порта получите MAC адрес устройства, 

либо можно получить MAC в WiFi роутере (используя другой скетч).

Добавьте новое доменное имя, укажите имя, укажите домен, укажите TTL, введите логин и пароль, снимите галочки "Возможность обновлять IP по протоколу HTTP,HTTPS", установите галочку "Возможность обновлять IP по протоколу UDP", укажите MAC адрес модуля и введите PIN код. PIN код желательно установить отличный от нуля, что-бы не было конфликта обновления IP адреса с другим устройством имеющим такой-же MAC адрес. Сохраните.

 

Если нужно, что-бы сервис сам определял внешний IP, то строку

  Udp.write((char *)&WiFi.localIP()[0],4);//IP
 

нужно заменить на

txt[0]=0;txt[1]=0;txt[2]=0;txt[3]=0;

Udp.write(txt,4);

Пример скетча

#include <Arduino.h>
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>

WiFiUDP Udp;

struct config_t
{
  const char* ssid = "WIFI AP SSID";
  const char* password = "PASSWORD";
  unsigned int myipPort = 200;   
} configuration;

uint8_t mac[6];
uint32_t rid=23243;//RID
uint32_t pin=1235;//PIN code
char txt[30];

void setup() {

  Serial.begin(115200);
    
  WiFi.mode(WIFI_STA);
  WiFi.begin(configuration.ssid, configuration.password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
  }

  ArduinoOTA.onStart([]() {
  });
  ArduinoOTA.onEnd([]() {
    ESP.restart();
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("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();
  WiFi.macAddress(mac);
  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("MAC address: ");
  sprintf(txt,"%02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
  Serial.println(txt);

  //Send DDNS update packet
    Udp.beginPacket(IPAddress(146, 0, 40, 250), configuration.myipPort);
    txt[0]=(rid>>24)&0xff;
    txt[1]=(rid>>16)&0xff;
    txt[2]=(rid>>8)&0xff;
    txt[3]=rid&0xff;
    Udp.write(txt,4);//RID
    Udp.write(mac, 6);//MAC
    Udp.write((char *)&WiFi.localIP()[0],4);//IP
    txt[0]=(pin>>24)&0xff;
    txt[1]=(pin>>16)&0xff;
    txt[2]=(pin>>8)&0xff;
    txt[3]=pin&0xff;
    Udp.write(txt,4);//PIN
    Udp.endPacket();
}

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