Static IP

Hi all, I hope I am posting in the right place.

I have an ESP32VROOM dev board which I'm using as an IR sender/receiver (also is used on an ESP8266 nodemcu board)

My main problem is the ever changing IP address of the board, whether due to a power cut or simply another devices IP seems to force it to change, I really need the IP address to be static.

I have tried numerous times to make the IP static, but have failed every step of the way, I need some guidance please, what to remove and what to keep?, thanks.

Here's my working code;

#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#endif  // ESP8266
#if defined(ESP32)
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#endif  // ESP32
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <WiFiClient.h>

const char* kSsid = "my_network";
const char* kPassword = "my_password";
MDNSResponder mdns;

#if defined(ESP8266)
ESP8266WebServer server(80);
#undef HOSTNAME
#define HOSTNAME "esp8266"
#endif  // ESP8266
#if defined(ESP32)
WebServer server(80);
#undef HOSTNAME
#define HOSTNAME "esp32"
#endif  // ESP32

const uint16_t kIrLed = 14;  // ESP GPIO pin to use. Recommended: 14 (D2).

IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

void handleRoot() {
  server.send(200, "text/html",
              "<html>" \
                "<head><title>Command sent</title></head>" \
                "<body>" \
                // more content . . . . 
                "</body>" \
              "</html>");
}

void handleIr() {
  for (uint8_t i = 0; i < server.args(); i++) {
    if (server.argName(i) == "code") {
      uint32_t code = strtoul(server.arg(i).c_str(), NULL, 10);
#if SEND_NEC
      irsend.sendNEC(code, 32);
#endif  // SEND_NEC
    }
  }
  handleRoot();
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++)
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  server.send(404, "text/plain", message);
}

void setup(void) {
  irsend.begin();

  Serial.begin(115200);
  WiFi.begin(kSsid, kPassword);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(kSsid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP().toString());

#if defined(ESP8266)
  if (mdns.begin(HOSTNAME, WiFi.localIP())) {
#else  // ESP8266
  if (mdns.begin(HOSTNAME)) {
#endif  // ESP8266
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  server.on("/ir", handleIr);

  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}

Log in to your router as Admin and set this device to static there.

Thanks @MorganS

I was struggling to find my question, although I thought I would be notified of any replies.

Anyway, you hit the nail on the head, I found the same answer while trawling other sites.

Thanks for replying

Regards,

Can't you just do it with WiFi.config, as I do with my ESP8266 boards.
Leo..

const char* WiFi_SSID = "ABCDEFGH";
const char* WiFi_PW = "12345678";
IPAddress ip(192, 168, 1, 50), gateway(192, 168, 1, 1), subnet(255, 255, 255, 0);

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(WiFi_SSID, WiFi_PW);
}

void loop() {
}

Static IP in the device is a bad practice. I used to be a static IP at the device believer but then, I ran out of IP addresses reserved for DHCP because I defined too small of a DHCP range (0-100). I couldn't make the DHCP range larger because I had already coded some devices in addresses 101 and up. The only solution was to retrieve the devices and reprogram them with a new static IP or make them DHCP. I just did an IP scan and I have 76 IP devices in my home. If most of them were on static IP, then just discovering which IP I could use on a new device would be clear to use. Unless I pick an IP for a device currently offline- which would be an IP conflict if it ever came back online.

In other words, static IP was becoming more work than it's worth.

So, I bit the bullet and set my DHCP pool in the Router to 1-255 and changed what devices I could to DHCP. Then went into my Router and changed the NAS, camera and other devices that I really don't want the router to change the IP, to be static. (I insisted that my router wouldn't let me set a static IP on my network because the term "static" only showed up in discussing the WAN side. Someone here set me right. The term I was looking for was "fixed lease").

The bottom line is that I am happy that I made everything get it's IP from DHCP. Life has been a lot less complicated since then.

I set the DHCP range in my router from 32-255, so I have the lower range for (mostly wired) static devices (PC, NAS, etc).
Static at both ends makes my ESP devices also connect much faster (about 140ms IIRC).
I don't have the problems you have, with only about 10 devices.
Leo..