NodeMCU connects to Hotspot, but not to Router

Hi!

Using this tutorial and the code below, I've been able to connect my NodeMCU with a hotspot of my phone (and have been able to control the LED).

However, when I try to connect to my router, it keeps printing '............'. Any idea what I'm doing wrong? And how to solve?

Edit, the answer: I turned out to have a dual band router transmitting both 5GHz and 2.4GHz. The NodeMCU can only connect to 2.4GHz. The solution for me was logging into my router and changing the SSID (name) of the 5GHz version to ORIGINALNAME-5GHz. All my devices now connect to the 2.4GHz option. And NodeMCU works.

#include <ESP8266WiFi.h>

const char* ssid = "***";
const char* password = "***";


int ledPin = 13; // GPIO13
WiFiServer server(80);
 
void setup() {
  Serial.begin(115200);
  delay(10);
 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}
 
void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
 
  int value = LOW;
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(ledPin, HIGH);
    value = HIGH;
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(ledPin, LOW);
    value = LOW;
  }
 
// Set ledPin according to the request
//digitalWrite(ledPin, value);
 
  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print("Led pin is now: ");
 
  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("

");
  client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a>
");  
  client.println("</html>");
 
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
 
}

Thanks in advance!

Edit: Red herring, no longer relevant

Ok.. Not a solution, but I found the cause. Kind of talking to myself here, but sharing for everybody with the same issue :slight_smile:

My router appears to be 5GHz, and the NodeMCU apparently only connects to 2.4GHz. [Edit, correction: using a scan with WiFi analyzer, I found out it is a dual band router. Transmitting both 2.4GHz and 5GHz under the same SSID. Why the NodeMCU doesn't simply connect to the 2.4GHz remains a mystery. The search continues.]

You can easily check the frequency of your network with your (Android) phone. Go to Settings > WiFi > Click the network of your choice. See frequency there.

You can also check if your NodeMCU 'sees' your network with the following code. (My 5GHz network is registered by the NodeMCU, so apparently connecting is an issue, but scanning is not):

/*
    This sketch demonstrates how to scan WiFi networks.
    The API is almost the same as with the WiFi Shield library,
    the most obvious difference being the different file you need to include:
*/
#include "ESP8266WiFi.h"

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(5000);
}

(I found the code here)

When I try to connect with the code in my first post and add Serial.println(WiFi.status()) I keep getting 6. Which means 'WL_DISCONNECTED'

    WL_IDLE_STATUS      = 0,
    WL_NO_SSID_AVAIL    = 1,
    WL_SCAN_COMPLETED   = 2,
    WL_CONNECTED        = 3,
    WL_CONNECT_FAILED   = 4,
    WL_CONNECTION_LOST  = 5,
    WL_DISCONNECTED     = 6

So far... Still no solution for me. Why is the NodeMCU not connecting to the 2.4GHZ option?
And how can I get it to?