problem with modemcu and mode AP

Hi guys,

the first, I’m sorry my English.

I am trying to do a small personal project that I hope will help me learn. I’m a bit of a rookie with arduino and ESP8266 but with Arduino I’ve already made some small things.

My project at the moment I am mounting it with a nodemcu, I have used this example as a base (SINAPTEC: Tutorial #7 ESP8266 - Guardar Ssid y Password en la Eeprom) , the example works for me correctly.

The base code has been modified for my requirements, at the moment I compile it and upload it correctly to the nodemcu, but when I put it in AP mode, the Wi-Fi network appears but I can not connect and sometimes I am connected but I do not have access to 192.168.4.1.

My code:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>

//-------------------VARIABLES GLOBALES--------------------------
struct configuracion_t {
  char hostName[11]="h";
  char ssidName[11]="srrrr";
  char ssid_password[16]="123456789";
  char ap_password[17]="ap";
  boolean dhcp = true; 
  char ip_lan[16]="i";
  char mask_lan[16]="255.255.255.0";
  char gateway_lan[16]="g";
  char api_user[101]="au";
  char api_password[51]="app";
  char api_device_id[33]="S";
  } cfg;


int contconexion = 0;
unsigned long previousMillis = 0;

/*
char ssid[50];      
char pass[50];
*/
char *ssid="ssid";
char *pass="pass";

const char *ssidConf = "SB_";
const char *hostConf = "SBH_";
const char *passConf = "123456789";
const char pVez='1';

String hostName="";
String ssidName="";

String mensaje = "";

char primeraVez;

//-----------CODIGO HTML PAGINA DE CONFIGURACION---------------
String pagina = "<codigo de la página html, esta en el fichero>";

String paginafin = "</body></html>";


//------------------------SETUP WIFI-----------------------------
void setup_wifi() {
// Conexión WIFI
  WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal

      Serial.println("* Nombre:");
      Serial.println(ssid);
      Serial.println("* Password");
      Serial.println(pass);
  
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { //Cuenta hasta 50 si no se puede conectar lo cancela
    ++contconexion;
    delay(250);
    Serial.print(".");
    //digitalWrite(13, HIGH);
    //delay(250);
    //digitalWrite(13, LOW);
  }
  if (contconexion <50) {   
      Serial.println("");
      Serial.println("WiFi conectado");
      Serial.println(WiFi.localIP());
      digitalWrite(13, HIGH);  
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
      digitalWrite(13, LOW);
  }
}

//--------------------------------------------------------------
WiFiClient espClient;
ESP8266WebServer server(80);
//--------------------------------------------------------------

//-------------------PAGINA DE CONFIGURACION--------------------
void paginaconf() {
  server.send(200, "text/html", pagina + paginafin); 
}

//--------------------MODO_CONFIGURACION------------------------
void modoconf() {
   
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  
  WiFi.softAP(ssidConf, passConf);
  IPAddress myIP = WiFi.softAPIP(); 
  Serial.print("IP del acces point: ");
  Serial.println(myIP);
  Serial.print("Ssid: " );
  Serial.println(ssidConf);
  Serial.print("Password: " );
  Serial.println(passConf);
  Serial.println("WebServer iniciado...");

  server.on("/", paginaconf); //esta es la pagina de configuracion

  server.on("/guardar_conf", guardar_conf); //Graba en la eeprom la configuracion

  server.on("/escanear", escanear); //Escanean las redes wifi disponibles
  
  server.begin();

  while (true) {
      server.handleClient();
  }
}

//---------------------GUARDAR CONFIGURACION-------------------------
void guardar_conf() {
  
  Serial.println(server.arg("ssid"));//Recibimos los valores que envia por GET el formulario web
  grabar(0,server.arg("name_ssid"));
  Serial.println(server.arg("pass_wifi1"));
  grabar(50,server.arg("pass_wifi1"));

  mensaje = "Configuracion Guardada...";
  paginaconf();
}

void leerConfiguracion(){
  primeraVez = (char)EEPROM.read(0);;
  Serial.print("primeraVez: ");
  Serial.println(primeraVez);

  if (primeraVez != pVez){
       Serial.println("Es la primera vez que se ejecuta, se crea la configuración");
       EEPROM.write(0, pVez);

       //Calculamos el nombre y ssid del dispositivo  
       //y añadimos a la configuración.
       Serial.print("El nombre del ESP es: ");
       Serial.println(WiFi.hostname());
       ssidName=WiFi.hostname().c_str();
       hostName=WiFi.hostname().c_str();

       Serial.print("Lo almacenado en hostname es ");
       Serial.println(hostName);
  
       ssidName.replace("ESP_",ssidConf);
       hostName.replace("ESP_",hostConf);

       Serial.print("El nuevo nombre ssid es");
       Serial.println(ssidName);
       Serial.print("El nuevo nombre del host es");
       Serial.println(hostName);
       
       EEPROM.put(sizeof(pVez)+1,cfg);
       EEPROM.commit();
  } else{
   Serial.println("Ya existe configuración");
  }

  Serial.println(sizeof(pVez));
  EEPROM.get(sizeof(pVez)+1,cfg);  

  Serial.print("ssid Name: ");
  Serial.println(cfg.ssidName);
  Serial.print("Host Name: ");
  Serial.println(cfg.hostName);
  Serial.print("Password ssid: ");
  Serial.println(cfg.ssid_password);
  Serial.print("Mask Network: ");
  Serial.println(cfg.mask_lan);
  Serial.print("DHCP: ");
  Serial.println(cfg.dhcp);

  Serial.println("**HostName: "+WiFi.hostname());
  Serial.println(cfg.ssid_password);
}

void grabarConfiguracion(){
  EEPROM.put(1,cfg);
  EEPROM.commit();  
}

//----------------Función para grabar en la EEPROM-------------------
void grabar(int addr, String a) {
  int tamano = a.length(); 
  char inchar[50]; 
  a.toCharArray(inchar, tamano+1);
  for (int i = 0; i < tamano; i++) {
    EEPROM.write(addr+i, inchar[i]);
  }
  for (int i = tamano; i < 50; i++) {
    EEPROM.write(addr+i, 255);
  }
  EEPROM.commit();
}

//-----------------Función para leer la EEPROM------------------------
String leer(int addr) {
   byte lectura;
   String strlectura;
   for (int i = addr; i < addr+50; i++) {
      lectura = EEPROM.read(i);
      if (lectura != 255) {
        strlectura += (char)lectura;
      }
   }
   return strlectura;
}

//---------------------------ESCANEAR----------------------------
void escanear() {  
  int n = WiFi.scanNetworks(); //devuelve el número de redes encontradas
  Serial.println("escaneo terminado");
  if (n == 0) { //si no encuentra ninguna red
    Serial.println("no se encontraron redes");
    mensaje = "no se encontraron redes";
  }  
  else
  {
    Serial.print(n);
    Serial.println(" redes encontradas");
    mensaje = "";
    for (int i = 0; i < n; ++i)
    {
      // agrega al STRING "mensaje" la información de las redes encontradas 
      mensaje = (mensaje) + "<p>" + String(i + 1) + ": " + WiFi.SSID(i) + " (" + WiFi.RSSI(i) + ") Ch: " + WiFi.channel(i) + " Enc: " + WiFi.encryptionType(i) + " </p>\r\n";
      //WiFi.encryptionType 5:WEP 2:WPA/PSK 4:WPA2/PSK 7:open network 8:WPA/WPA2/PSK
      delay(10);
    }
    Serial.println(mensaje);
    paginaconf();
  }
}

//------------------------SETUP-----------------------------
void setup() {

  pinMode(13, OUTPUT); // D7 
  pinMode(14, INPUT);  //D5
  
  // Inicia Serial
  Serial.begin(115200);
  Serial.println("");

  //Iniciamos la EEPROM para acceso a ella.
  EEPROM.begin(512);

Serial.println(WiFi.hostname());

  //Cargamos la configuración
  leerConfiguracion();
  
  if (digitalRead(14) == 0) {
    Serial.println("boton pulsado");
    modoconf();
  }

  ssid="hola";
  pass="hola";

  setup_wifi();
}

//--------------------------LOOP--------------------------------
void loop() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= 5000) { //envia la temperatura cada 5 segundos
    previousMillis = currentMillis;
    Serial.println("Funcionado...");
  }
}

What am I doing wrong? I have searched the internet but I do not see or find anything concrete to my problem.

P.D .: Forgive if the code is a bit “dirty”. The complete code I have attached to this post.

firmware.ino (14.5 KB)

char ap_password[17]="ap"; // password in AP_mode MUST be atleast 8 chars long

Hi,

I agree with you, but if you can see in the code (line 189) i had used the passConf variable, I did for a test, in the future, the password will be store in ap_password on the struct variable.

Regards.