[GH-ISSUE #1591] Can not connect to saved AP if i dont open the serial monitor #1358

Closed
opened 2026-02-28 01:29:44 +03:00 by kerem · 0 comments
Owner

Originally created by @gabo4299 on GitHub (Apr 18, 2023).
Original GitHub issue: https://github.com/tzapu/WiFiManager/issues/1591

Basic Infos

Hardware

WiFimanager Branch/Release: Master

Esp32:

Hardware: ESP32 WROOM

Core Version: 2.4.0, staging

Description

the saved ap works fine when i put the usb cable and open the serial monitor, if i don't open the serial monitor throws me an authentication failed, ive tried to power with an switching source ive think that the current wasnt enough, but it still not working.

the connectTimeOut was changed to 60, 20 and 10 secconds and nothing.

Settings in IDE

Module: D1 R3

Additional libraries:

Sketch

#BEGIN
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <WiFiManager.h>
#include <FS.h>
#include <SPIFFS.h>
#include <PubSubClient.h>

#define JSON_CONFIG_FILE  "/config.json"
bool guardarConfig=false;

//  variables guardadas en memoria FlASH
char ipRasp[50]="192.168.1.3:5000";
char broker[50]="192.168.1.3";
int puertoMQTT =1883;
int idEsp =1;
int tipoCaudalimetro = 2; 
int Fact_K=750;



//  Seleccion de tanques 
int tanquesDisponible [3][5]={{1,2,3,4,5},
               {6,7,8,9,10},
               {11,12,13,14,15}};


//  CALIBRACION 

volatile long CalibNumPulsos;

auto logSer = Serial;
WiFiManager wm(logSer);
WiFiClient espClient;
PubSubClient client(espClient);

WiFiManagerParameter custom_text_box;
WiFiManagerParameter custom_text_broker;
WiFiManagerParameter custom_text_box_num;
WiFiManagerParameter custom_field;
WiFiManagerParameter custom_hidden;
WiFiManagerParameter custom_k_factor;

// strings de api

String serverName;
String Contenido;

// definiciones de pines y constantes
#define BAUD_RATE 9600

#define PIN_CAUDALIMETRO 25
#define PIN_LEDR 27
#define PIN_LEDV 14
#define PIN_BOTON 13

#define PIN_RX2 35
#define PIN_TX2 15
#define PIN_RX3 34
#define PIN_TX3 33
#define PIN_RX4 36
#define PIN_TX4 4
#define PIN_RX5 39
#define PIN_TX5 26

#define PIN_O1 5
#define PIN_O2 23
#define PIN_O3 19
#define PIN_O4 18
#define PIN_OALL 12


EspSoftwareSerial::UART swSer;
EspSoftwareSerial::UART swSer2;
EspSoftwareSerial::UART swSer3;
EspSoftwareSerial::UART swSer4;

const char *id_select_str = R"(
  <br/><label for='day'>Seleccione el ID del Esp32</label>
  <select name="ID" id="idEsp32" onchange="document.getElementById('key_custom').value = this.value">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
  </select>
  <script>
    document.getElementById('idEsp32').value = "%d";
    document.querySelector("[for='key_custom']").hidden = true;
    document.getElementById('key_custom').hidden = true;
  </script>
  )";


auto hwSer = Serial2;
unsigned char data[4] = {};
float distancia;
float lastDistancia;

bool oncePress = false;
long int tiempoBoton1=0;

bool ControlCalibrando=false;
bool ControlDiluyendo=false;
bool primeraVezLoopDiluir=false;
float cantidadADiluir = 0.0;
int tanqueADiluir=1;
int pinUtilizado=PIN_O1;
int CalibCant=0;
float volumen=0;

long diluir_T1;
long diluir_dt;
void saveConigFile()  {
  logSer.print("saving config");

  StaticJsonDocument<512> json;
  json["ipRasp"]=ipRasp;
  json["puertoMQTT"]=puertoMQTT;
  json["broker"]=broker;
  json["idEsp"]=idEsp;
  // json["tipoCaudalimetro"]=tipoCaudalimetro;
  json["Fact_K"]=Fact_K;
  File configFile = SPIFFS.open(JSON_CONFIG_FILE,"w");
  if (!configFile) { 
    logSer.println("error al abrir");
  }
  serializeJsonPretty(json,logSer);
  if (serializeJson(json,configFile)==0){
    logSer.println("error al escribir");
  }
  configFile.close();
}

bool loadConfigFile(){
  logSer.println("montando sistema");
  if (SPIFFS.begin(false) ||SPIFFS.begin(true) ){
    logSer.println("sistema MONTADO ");
    if (SPIFFS.exists(JSON_CONFIG_FILE)){
      logSer.println("lEYENDO ");
      File configFile=SPIFFS.open(JSON_CONFIG_FILE,"r");
      if (configFile){
        logSer.println("abriendo config file ");
        StaticJsonDocument<512> json;
        DeserializationError error = deserializeJson(json,configFile);
        serializeJsonPretty(json,logSer);
        if (!error){
          logSer.println("Parsong json");
          strcpy(ipRasp,json["ipRasp"]);
          strcpy(broker,json["broker"]);
          puertoMQTT=json["puertoMQTT"].as<int>();
          idEsp=json["idEsp"].as<int>();
          // tipoCaudalimetro=json["tipoCaudalimetro"].as<int>();
          Fact_K=json["Fact_K"].as<int>();
          return true;
        }
        else{
          logSer.println("Error al leer json");
        }
      }
    }

  }
  else{
      logSer.println("error al montar fs");

    }
    return false;
}


void saveConfigCallback(){
  logSer.print("shoudl guardar");
  guardarConfig=true;
}

void configModeCallback (WiFiManager *myWiFiManager){
  logSer.println("entrando modo config ");
  digitalWrite(PIN_LEDV , HIGH);
  digitalWrite(PIN_LEDR, HIGH);
  logSer.print("wifi ap : ");
  logSer.println(myWiFiManager->getConfigPortalSSID());

  logSer.print("ip ap : ");
  logSer.println(WiFi.softAPIP());
}
void calibracion (){
  
  if (ControlCalibrando){
    digitalWrite(PIN_O1,LOW);
    digitalWrite(PIN_OALL,HIGH);
    CalibNumPulsos++;
    // logSer.print("Litros ");  
    // logSer.print(CalibCant);  
    // logSer.print(" Pulsos");  
    // logSer.println(CalibNumPulsos);  

  }
  else if (ControlDiluyendo){
    CalibNumPulsos++;
    // logSer.print(" Pulsos");  
    // logSer.println(CalibNumPulsos);  
  }
  
    

  
  

}

int ObtenerFrecuecia() 
{
  int frecuencia;
  CalibNumPulsos = 0;   //Ponemos a 0 el número de pulsos
  interrupts();    //Habilitamos las interrupciones
  delay(1000);   //muestra de 1 segundo
  noInterrupts(); //Deshabilitamos  las interrupciones
  frecuencia=CalibNumPulsos; //Hz(pulsos por segundo)
  return frecuencia;
}




void callbackMQTT(char* topic, byte* message, unsigned int length) {
  logSer.print("Message arrived on topic: ");
  logSer.print(topic);
  logSer.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    logSer.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  logSer.println(messageTemp);
    StaticJsonDocument<500> jsonMqtt;
  DeserializationError error = deserializeJson(jsonMqtt, messageTemp);
  if(error) {
    logSer.println("Error desearizando");
    return; 
  }
   if (String(topic) == ("esp32/"+String(idEsp)+"/calib")) {
      logSer.println( "LLEGO AL TOPICO CALIB");
          
      if (ControlCalibrando == false && jsonMqtt["calibrar"]==true && ControlDiluyendo==false){
        ControlCalibrando=jsonMqtt["calibrar"];
        CalibCant=jsonMqtt["cantidad"];
        attachInterrupt(PIN_CAUDALIMETRO,calibracion,RISING);
        interrupts();
      }
      else if (ControlCalibrando == true && jsonMqtt["calibrar"]==false){
        digitalWrite(PIN_O1,HIGH);
        digitalWrite(PIN_OALL,LOW);
        ControlCalibrando=jsonMqtt["calibrar"];
        float new_k=float(CalibNumPulsos) /(float(CalibCant)*60);
        logSer.print("NEW K IS : ");
        logSer.println(new_k);
        Fact_K=int(new_k*100);
        guardarConfig=true;
        saveConigFile();
        CalibNumPulsos=0; 
        detachInterrupt(PIN_CAUDALIMETRO);
      }


      
   }
   else if (String(topic) == ("esp32/"+String(idEsp)+"/diluir")){
    logSer.println( "LLEGO AL TOPICO diluir");

    if (ControlCalibrando == false && ControlDiluyendo==false && jsonMqtt["paro"]==false){
      ControlDiluyendo=true;
      attachInterrupt(PIN_CAUDALIMETRO,calibracion,RISING);

      tanqueADiluir=jsonMqtt["tanque"];
      cantidadADiluir=jsonMqtt["cantidad"];
      
   }
   else if (ControlDiluyendo==true && jsonMqtt["paro"]==true){
       ControlDiluyendo=false;
       volumen=0;
       digitalWrite(PIN_O1,HIGH);
       digitalWrite(PIN_O2,HIGH);
       digitalWrite(PIN_O3,HIGH);
       digitalWrite(PIN_O4,HIGH);
       digitalWrite(PIN_OALL,LOW);
       primeraVezLoopDiluir=false;
      detachInterrupt(PIN_CAUDALIMETRO);
   }

}}



void setup() {
  // put your setup code here, to run once:
  delay(2000);
  logSer.begin(115200);
  // logSer.println(WiFi.macAddress());
  pinMode(PIN_CAUDALIMETRO, INPUT); // Sets the echoPin as an Input
  pinMode(PIN_BOTON, INPUT_PULLUP);
  pinMode(PIN_LEDV, OUTPUT); 
  pinMode(PIN_LEDR, OUTPUT); 
  pinMode(PIN_O1, OUTPUT); 
  pinMode(PIN_O2, OUTPUT);
  pinMode(PIN_O3, OUTPUT);
  pinMode(PIN_O4, OUTPUT);
  pinMode(PIN_OALL, OUTPUT);
  
  digitalWrite(PIN_O1,HIGH);
  digitalWrite(PIN_O2,HIGH);
  digitalWrite(PIN_O3,HIGH);
  digitalWrite(PIN_O4,HIGH);
  digitalWrite(PIN_OALL,LOW);
  bool forceConfig= false;
  bool spiffsSetup=loadConfigFile();
  if (!spiffsSetup){
    logSer.println("no hay datos forzado config");
    forceConfig=true;
  }
  WiFi.mode(WIFI_STA);

  // wm.resetSettings();

  wm.setDebugOutput(true);
  wm.setConfigPortalTimeout(120);
  wm.setConnectTimeout(20);
  wm.setSaveConfigCallback(saveConfigCallback);
  wm.setAPCallback(configModeCallback);
  new (&custom_text_box)  WiFiManagerParameter ("IPLOCA","Ingrese ip de raspberry si es necesario puerto",ipRasp,50);
  new (&custom_text_broker) WiFiManagerParameter ("broker_mqtt","Ingrese broker mqtt ",broker,50);
  char converteValue[6];
  sprintf(converteValue,"%d",puertoMQTT);
  new (&custom_text_box_num) WiFiManagerParameter  ("num", "Puerto MQTT", converteValue,7);

   

  char bufferStr[700];
  sprintf(bufferStr, id_select_str, idEsp);
  new (&custom_field) WiFiManagerParameter(bufferStr);
  char convertedValueTipo[6];
  sprintf(convertedValueTipo, "%d", idEsp); // Need to convert to string to store a default value.
  new (&custom_hidden) WiFiManagerParameter("key_custom", "Will be hidden", convertedValueTipo, 2);
  char converteValue3[60];
  sprintf(converteValue3,"%d",Fact_K);
  new (&custom_k_factor) WiFiManagerParameter  ("factor_k", " Factor de conversion ex: 1/2':750  3/4':550 1':350", converteValue3,60);
  // wm.addParameter(&custom_IdEsp);
  wm.addParameter(&custom_text_box);
  wm.addParameter(&custom_text_broker);
  wm.addParameter(&custom_text_box_num);
  wm.addParameter(&custom_k_factor);
  wm.addParameter(&custom_hidden);
  wm.addParameter(&custom_field);
  
  

  if (forceConfig){
    if (!wm.startConfigPortal("SL Esp32 Config","password")){
      logSer.println("failed to conect");
      delay(3000);

      ESP.restart();
      delay(5000);

    }
  }
  else{
    if (!wm.autoConnect("SL Esp32 Config","password")){
      logSer.println("failed to conec pasao de tiemo t");
      delay(3000);

      ESP.restart();
      delay(5000);
    }
  }


  


  if (WiFi.status() != WL_CONNECTED){
     digitalWrite(PIN_LEDV , LOW);
  digitalWrite(PIN_LEDR , HIGH);
  }
  else{
    digitalWrite(PIN_LEDV , HIGH);
  digitalWrite(PIN_LEDR , LOW);
  logSer.println("wifi conected");
  logSer.print(" ip adres :");
  logSer.println(WiFi.localIP());
  }
  
  logSer.println("");
  

  strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp));
  logSer.print(" Ip Rasp:");
  logSer.println(ipRasp);

  
  puertoMQTT=atoi(custom_text_box_num.getValue());
  logSer.print(" Mqtt port:");
  logSer.println(puertoMQTT);

  strncpy(broker, custom_text_broker.getValue(),sizeof(broker));
  logSer.print("broker:");
  logSer.println(broker);

  // idEsp=atoi(custom_IdEsp.getValue());
  // logSer.print(" id Esp:");
  // logSer.println(idEsp);

  logSer.print(" el char es ");
  logSer.println(custom_k_factor.getValue());


  Fact_K=atoi(custom_k_factor.getValue());
  logSer.print(" Fact_K:");
  logSer.print(Fact_K);
  logSer.print(" el char es ");
  logSer.println(custom_k_factor.getValue());

  idEsp = atoi(custom_hidden.getValue());
  logSer.print("Id Esp");
  logSer.println(idEsp);


  String ipRaspStr=ipRasp;
  serverName = "http://"+ipRaspStr ;
  logSer.print("api : ");
  logSer.println(serverName);


if (guardarConfig){
  saveConigFile();
}
  // setup_wifi();

  client.setServer(broker, puertoMQTT);
  client.setCallback(callbackMQTT);
  hwSer.begin(BAUD_RATE);
  swSer.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX2, PIN_TX2);
  swSer2.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX3, PIN_TX3);
  swSer3.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX4, PIN_TX4);
  swSer4.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX5, PIN_TX5);
  
  swSer.enableIntTx(true);
  swSer2.enableIntTx(true);
  swSer3.enableIntTx(true);
  swSer4.enableIntTx(true);
	logSer.println(PSTR("Tx on swSer"));
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {

    if (digitalRead(PIN_BOTON) == LOW ){
  if (oncePress == false){
    tiempoBoton1=millis();
    oncePress=true;
  }

  long int tiempo=millis() - tiempoBoton1;

  if (tiempo >= 1500){
  logSer.println(" presionado 5 segs parametros");
  logSer.println(wm.getParametersCount());
   if (!wm.startConfigPortal("SL Esp32 Config","password")) {
      logSer.println("failed to connect and hit timeout");
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.restart();
      delay(5000);
    }
    strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp));
    puertoMQTT=atoi(custom_text_box_num.getValue());
    strncpy(broker, custom_text_broker.getValue(),sizeof(broker));
    Fact_K=atoi(custom_k_factor.getValue());
    idEsp = atoi(custom_hidden.getValue());
    String ipRaspStr=ipRasp;
    serverName = "http://"+ipRaspStr ;
    if (guardarConfig){
      saveConigFile();
    }
  }}
    logSer.print("Attempting MQTT connection...");
    // Attempt to connect
    char clientName[15];
    sprintf(clientName, "ESP32_Id_%d", idEsp);
    if (client.connect(clientName)) {
      logSer.println("connected");
      // Subscribe
      char subTopic[20];
      sprintf(subTopic, "esp32/%d/calib", idEsp);
      client.subscribe(subTopic);
      char subTopic2[20];
      sprintf(subTopic2, "esp32/%d/diluir", idEsp);
      client.subscribe(subTopic2);
      logSer.print("subsribiedose a ");
      logSer.println(subTopic);
      logSer.print("subsribiedose a ");
      logSer.println(subTopic2);
      digitalWrite(PIN_LEDV , HIGH);
      digitalWrite(PIN_LEDR, LOW);

    } else {
      logSer.print("failed, rc=");
      logSer.print(client.state());
      logSer.println(" try again in 5 seconds");
      digitalWrite(PIN_LEDV , LOW);
      digitalWrite(PIN_LEDR, HIGH);

      // Wait 5 seconds before retrying
      delay(3000);
    }
  }
}





void leerUltrasonico(EspSoftwareSerial::UART &pos, int tanqueID){

  do {
    for (int i = 0; i < 4; i++)
    {
      data[i] = pos.read();
    }
  } while (pos.read() == 0xff);

  //Espera a que se complete la transmisión de datos salientes
  pos.flush();

  if (data[0] == 0xff)
  {
    int sum;
    //Comprobación de los valores de lectura
    sum = (data[0] + data[1] + data[2]) & 0x00FF;
    /*Verifica que el resultado de la operación anterior coincida con el valor del dato 3
       Si no coincide, entonces la edición es errónea
    */
    if (sum == data[3])
    {
      //Conversión de los valores medidos en cm
      distancia = (data[1] << 8) + data[2]; 
      if (distancia > 30)
      {
        logSer.print("distancia ");
        logSer.print(tanquesDisponible[idEsp-1][tanqueID]);
        logSer.print(":");
        logSer.print((distancia / 10));
        logSer.println("CM");
        if (distancia != lastDistancia){
          lastDistancia=distancia;
          Contenido=String((distancia / 10));
          HTTPClient http;
          char numstr[2];
          String serverPath = serverName +"/api/cont/tanque/"+ itoa(tanquesDisponible[idEsp-1][tanqueID], numstr,10)+"/"+ Contenido;
          logSer.print("Enviando "); 
          logSer.println(serverPath);
          http.begin(serverPath.c_str());
          int httpResponseCode = http.GET();
      
          if (httpResponseCode>0) {
            logSer.print("HTTP Response code: ");
            logSer.println(httpResponseCode);
            String payload = http.getString();
            logSer.println(payload);
          }
          else {
            logSer.println("Error code: ");
            // logSer.println(httpResponseCode);
          }
          // Free resources
          http.end();
          
           
        }
      } else
      {
        logSer.print("Debajo del límite inferior Tanque ");
        logSer.println(tanquesDisponible[idEsp-1][tanqueID]);
      }
    } else 
    {
      logSer.print("ERROR lectura tanque ");
    logSer.println(tanquesDisponible[idEsp-1][tanqueID]);

    }
  }

}

void leerUltrasonicoHS(HardwareSerial &pos, int tanqueID){

  do {
    for (int i = 0; i < 4; i++)
    {
      data[i] = pos.read();
    }
  } while (pos.read() == 0xff);

  //Espera a que se complete la transmisión de datos salientes
  pos.flush();

  if (data[0] == 0xff)
  {
    int sum;
    //Comprobación de los valores de lectura
    sum = (data[0] + data[1] + data[2]) & 0x00FF;
    /*Verifica que el resultado de la operación anterior coincida con el valor del dato 3
       Si no coincide, entonces la edición es errónea
    */
    if (sum == data[3])
    {
      //Conversión de los valores medidos en cm
      distancia = (data[1] << 8) + data[2]; 
      if (distancia > 30)
      {
        logSer.print("distancia ");
        logSer.print(tanquesDisponible[idEsp-1][tanqueID]);
        logSer.print(":");
        logSer.print((distancia / 10));
        logSer.println("CM");
        if (distancia != lastDistancia){
          lastDistancia=distancia;
          Contenido=String((distancia / 10));
          HTTPClient http;
          char numstr[2];
          String serverPath = serverName +"/api/cont/tanque/"+ itoa(tanquesDisponible[idEsp-1][tanqueID], numstr,10)+"/"+ Contenido;
          logSer.print("Enviando "); 
          logSer.println(serverPath);
          http.begin(serverPath.c_str());
          int httpResponseCode = http.GET();
      
          if (httpResponseCode>0) {
            logSer.print("HTTP Response code: ");
            logSer.println(httpResponseCode);
            String payload = http.getString();
            logSer.println(payload);
          }
          else {
            logSer.println("Error code: ");
            // logSer.println(httpResponseCode);
          }
          // Free resources
          http.end();
          
           
        }
      } else
      {
        logSer.print("Debajo del límite inferior Tanque ");
        logSer.println(tanquesDisponible[idEsp-1][tanqueID]);
      }
    } else 
    {
      logSer.print("ERROR lectura tanque ");
    logSer.println(tanquesDisponible[idEsp-1][tanqueID]);

    }
  }

}
void loop() {

if (digitalRead(PIN_BOTON) == LOW ){
  if (oncePress == false){
    tiempoBoton1=millis();
    oncePress=true;
  }

  long int tiempo=millis() - tiempoBoton1;

  if (tiempo >= 5000){
  logSer.println(" presionado 5 segs parametros");
  logSer.println(wm.getParametersCount());
   if (!wm.startConfigPortal("SL Esp32 Config","password")) {
      logSer.println("failed to connect and hit timeout");
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.restart();
      delay(5000);
    }
    strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp));
    puertoMQTT=atoi(custom_text_box_num.getValue());
    strncpy(broker, custom_text_broker.getValue(),sizeof(broker));
    Fact_K=atoi(custom_k_factor.getValue());
    idEsp = atoi(custom_hidden.getValue());
    String ipRaspStr=ipRasp;
    serverName = "http://"+ipRaspStr ;
    if (guardarConfig){
      saveConigFile();
    }
  

  if (WiFi.status() == WL_CONNECTED){
    digitalWrite(PIN_LEDV , HIGH);
    digitalWrite(PIN_LEDR, LOW);
    oncePress=false;
  }
  
}

}


if (WiFi.status() == WL_CONNECTED){

  if (!client.connected()) {
    reconnect();
  }

  client.loop();
  if (ControlCalibrando == false && ControlDiluyendo == false){

      if (hwSer.available()>1){
          leerUltrasonicoHS(hwSer,0);
      }
      if (swSer.available() > 1 ) {

            leerUltrasonico(swSer,1);
      }
        if (swSer2.available() > 1 ) {

            leerUltrasonico(swSer2,2);
      }

      if (swSer3.available() > 1 ) {

            leerUltrasonico(swSer3,3);
      }
        if (swSer4.available() > 1 ) {

            leerUltrasonico(swSer4,4);
      }

    delay(100);
  
  }
  
  else if (ControlDiluyendo == true){
      if (!primeraVezLoopDiluir){
              switch (tanqueADiluir)
                {
                case 1:
                  pinUtilizado=PIN_O1;
                  break;
                case 2:
                  pinUtilizado=PIN_O2;
                  break;
                  case 3:
                  pinUtilizado=PIN_O3;
                  break;
                  case 4:
                  pinUtilizado=PIN_O4;
                  break;
                default:
                  break;
                }
                volumen = 0 ;
                diluir_dt=0; //variación de tiempo por cada bucle
                diluir_T1=millis(); 
                primeraVezLoopDiluir=true;
      }
      if ( volumen <= cantidadADiluir){
        digitalWrite(PIN_OALL,HIGH);
        digitalWrite( pinUtilizado,LOW);
        float frecuencia=ObtenerFrecuecia(); //obtenemos la frecuencia de los pulsos en Hz
        float caudal_L_m=frecuencia/(float(Fact_K)/100); 
        diluir_dt=millis()-diluir_T1;
        diluir_T1=millis();
        volumen=volumen+(caudal_L_m/60)*(diluir_dt/1000);
        logSer.print ("Volumen: "); 
        logSer.print (volumen,3); 
        logSer.println (" L");
      }
      else{
        ControlDiluyendo=false;
        primeraVezLoopDiluir=false;
        CalibNumPulsos=0;
        volumen=0;
        digitalWrite(PIN_OALL,LOW);
        digitalWrite( pinUtilizado,HIGH);
      }
  }
  }


  
}
#END

Debug Messages

Originally created by @gabo4299 on GitHub (Apr 18, 2023). Original GitHub issue: https://github.com/tzapu/WiFiManager/issues/1591 ### Basic Infos #### Hardware WiFimanager Branch/Release: Master Esp32: Hardware: ESP32 WROOM Core Version: 2.4.0, staging ### Description the saved ap works fine when i put the usb cable and open the serial monitor, if i don't open the serial monitor throws me an authentication failed, ive tried to power with an switching source ive think that the current wasnt enough, but it still not working. the connectTimeOut was changed to 60, 20 and 10 secconds and nothing. ### Settings in IDE Module: D1 R3 Additional libraries: ### Sketch ```cpp #BEGIN #include <Arduino.h> #include <SoftwareSerial.h> #include <WiFi.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiManager.h> #include <FS.h> #include <SPIFFS.h> #include <PubSubClient.h> #define JSON_CONFIG_FILE "/config.json" bool guardarConfig=false; // variables guardadas en memoria FlASH char ipRasp[50]="192.168.1.3:5000"; char broker[50]="192.168.1.3"; int puertoMQTT =1883; int idEsp =1; int tipoCaudalimetro = 2; int Fact_K=750; // Seleccion de tanques int tanquesDisponible [3][5]={{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}}; // CALIBRACION volatile long CalibNumPulsos; auto logSer = Serial; WiFiManager wm(logSer); WiFiClient espClient; PubSubClient client(espClient); WiFiManagerParameter custom_text_box; WiFiManagerParameter custom_text_broker; WiFiManagerParameter custom_text_box_num; WiFiManagerParameter custom_field; WiFiManagerParameter custom_hidden; WiFiManagerParameter custom_k_factor; // strings de api String serverName; String Contenido; // definiciones de pines y constantes #define BAUD_RATE 9600 #define PIN_CAUDALIMETRO 25 #define PIN_LEDR 27 #define PIN_LEDV 14 #define PIN_BOTON 13 #define PIN_RX2 35 #define PIN_TX2 15 #define PIN_RX3 34 #define PIN_TX3 33 #define PIN_RX4 36 #define PIN_TX4 4 #define PIN_RX5 39 #define PIN_TX5 26 #define PIN_O1 5 #define PIN_O2 23 #define PIN_O3 19 #define PIN_O4 18 #define PIN_OALL 12 EspSoftwareSerial::UART swSer; EspSoftwareSerial::UART swSer2; EspSoftwareSerial::UART swSer3; EspSoftwareSerial::UART swSer4; const char *id_select_str = R"( <br/><label for='day'>Seleccione el ID del Esp32</label> <select name="ID" id="idEsp32" onchange="document.getElementById('key_custom').value = this.value"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> <script> document.getElementById('idEsp32').value = "%d"; document.querySelector("[for='key_custom']").hidden = true; document.getElementById('key_custom').hidden = true; </script> )"; auto hwSer = Serial2; unsigned char data[4] = {}; float distancia; float lastDistancia; bool oncePress = false; long int tiempoBoton1=0; bool ControlCalibrando=false; bool ControlDiluyendo=false; bool primeraVezLoopDiluir=false; float cantidadADiluir = 0.0; int tanqueADiluir=1; int pinUtilizado=PIN_O1; int CalibCant=0; float volumen=0; long diluir_T1; long diluir_dt; void saveConigFile() { logSer.print("saving config"); StaticJsonDocument<512> json; json["ipRasp"]=ipRasp; json["puertoMQTT"]=puertoMQTT; json["broker"]=broker; json["idEsp"]=idEsp; // json["tipoCaudalimetro"]=tipoCaudalimetro; json["Fact_K"]=Fact_K; File configFile = SPIFFS.open(JSON_CONFIG_FILE,"w"); if (!configFile) { logSer.println("error al abrir"); } serializeJsonPretty(json,logSer); if (serializeJson(json,configFile)==0){ logSer.println("error al escribir"); } configFile.close(); } bool loadConfigFile(){ logSer.println("montando sistema"); if (SPIFFS.begin(false) ||SPIFFS.begin(true) ){ logSer.println("sistema MONTADO "); if (SPIFFS.exists(JSON_CONFIG_FILE)){ logSer.println("lEYENDO "); File configFile=SPIFFS.open(JSON_CONFIG_FILE,"r"); if (configFile){ logSer.println("abriendo config file "); StaticJsonDocument<512> json; DeserializationError error = deserializeJson(json,configFile); serializeJsonPretty(json,logSer); if (!error){ logSer.println("Parsong json"); strcpy(ipRasp,json["ipRasp"]); strcpy(broker,json["broker"]); puertoMQTT=json["puertoMQTT"].as<int>(); idEsp=json["idEsp"].as<int>(); // tipoCaudalimetro=json["tipoCaudalimetro"].as<int>(); Fact_K=json["Fact_K"].as<int>(); return true; } else{ logSer.println("Error al leer json"); } } } } else{ logSer.println("error al montar fs"); } return false; } void saveConfigCallback(){ logSer.print("shoudl guardar"); guardarConfig=true; } void configModeCallback (WiFiManager *myWiFiManager){ logSer.println("entrando modo config "); digitalWrite(PIN_LEDV , HIGH); digitalWrite(PIN_LEDR, HIGH); logSer.print("wifi ap : "); logSer.println(myWiFiManager->getConfigPortalSSID()); logSer.print("ip ap : "); logSer.println(WiFi.softAPIP()); } void calibracion (){ if (ControlCalibrando){ digitalWrite(PIN_O1,LOW); digitalWrite(PIN_OALL,HIGH); CalibNumPulsos++; // logSer.print("Litros "); // logSer.print(CalibCant); // logSer.print(" Pulsos"); // logSer.println(CalibNumPulsos); } else if (ControlDiluyendo){ CalibNumPulsos++; // logSer.print(" Pulsos"); // logSer.println(CalibNumPulsos); } } int ObtenerFrecuecia() { int frecuencia; CalibNumPulsos = 0; //Ponemos a 0 el número de pulsos interrupts(); //Habilitamos las interrupciones delay(1000); //muestra de 1 segundo noInterrupts(); //Deshabilitamos las interrupciones frecuencia=CalibNumPulsos; //Hz(pulsos por segundo) return frecuencia; } void callbackMQTT(char* topic, byte* message, unsigned int length) { logSer.print("Message arrived on topic: "); logSer.print(topic); logSer.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { logSer.print((char)message[i]); messageTemp += (char)message[i]; } logSer.println(messageTemp); StaticJsonDocument<500> jsonMqtt; DeserializationError error = deserializeJson(jsonMqtt, messageTemp); if(error) { logSer.println("Error desearizando"); return; } if (String(topic) == ("esp32/"+String(idEsp)+"/calib")) { logSer.println( "LLEGO AL TOPICO CALIB"); if (ControlCalibrando == false && jsonMqtt["calibrar"]==true && ControlDiluyendo==false){ ControlCalibrando=jsonMqtt["calibrar"]; CalibCant=jsonMqtt["cantidad"]; attachInterrupt(PIN_CAUDALIMETRO,calibracion,RISING); interrupts(); } else if (ControlCalibrando == true && jsonMqtt["calibrar"]==false){ digitalWrite(PIN_O1,HIGH); digitalWrite(PIN_OALL,LOW); ControlCalibrando=jsonMqtt["calibrar"]; float new_k=float(CalibNumPulsos) /(float(CalibCant)*60); logSer.print("NEW K IS : "); logSer.println(new_k); Fact_K=int(new_k*100); guardarConfig=true; saveConigFile(); CalibNumPulsos=0; detachInterrupt(PIN_CAUDALIMETRO); } } else if (String(topic) == ("esp32/"+String(idEsp)+"/diluir")){ logSer.println( "LLEGO AL TOPICO diluir"); if (ControlCalibrando == false && ControlDiluyendo==false && jsonMqtt["paro"]==false){ ControlDiluyendo=true; attachInterrupt(PIN_CAUDALIMETRO,calibracion,RISING); tanqueADiluir=jsonMqtt["tanque"]; cantidadADiluir=jsonMqtt["cantidad"]; } else if (ControlDiluyendo==true && jsonMqtt["paro"]==true){ ControlDiluyendo=false; volumen=0; digitalWrite(PIN_O1,HIGH); digitalWrite(PIN_O2,HIGH); digitalWrite(PIN_O3,HIGH); digitalWrite(PIN_O4,HIGH); digitalWrite(PIN_OALL,LOW); primeraVezLoopDiluir=false; detachInterrupt(PIN_CAUDALIMETRO); } }} void setup() { // put your setup code here, to run once: delay(2000); logSer.begin(115200); // logSer.println(WiFi.macAddress()); pinMode(PIN_CAUDALIMETRO, INPUT); // Sets the echoPin as an Input pinMode(PIN_BOTON, INPUT_PULLUP); pinMode(PIN_LEDV, OUTPUT); pinMode(PIN_LEDR, OUTPUT); pinMode(PIN_O1, OUTPUT); pinMode(PIN_O2, OUTPUT); pinMode(PIN_O3, OUTPUT); pinMode(PIN_O4, OUTPUT); pinMode(PIN_OALL, OUTPUT); digitalWrite(PIN_O1,HIGH); digitalWrite(PIN_O2,HIGH); digitalWrite(PIN_O3,HIGH); digitalWrite(PIN_O4,HIGH); digitalWrite(PIN_OALL,LOW); bool forceConfig= false; bool spiffsSetup=loadConfigFile(); if (!spiffsSetup){ logSer.println("no hay datos forzado config"); forceConfig=true; } WiFi.mode(WIFI_STA); // wm.resetSettings(); wm.setDebugOutput(true); wm.setConfigPortalTimeout(120); wm.setConnectTimeout(20); wm.setSaveConfigCallback(saveConfigCallback); wm.setAPCallback(configModeCallback); new (&custom_text_box) WiFiManagerParameter ("IPLOCA","Ingrese ip de raspberry si es necesario puerto",ipRasp,50); new (&custom_text_broker) WiFiManagerParameter ("broker_mqtt","Ingrese broker mqtt ",broker,50); char converteValue[6]; sprintf(converteValue,"%d",puertoMQTT); new (&custom_text_box_num) WiFiManagerParameter ("num", "Puerto MQTT", converteValue,7); char bufferStr[700]; sprintf(bufferStr, id_select_str, idEsp); new (&custom_field) WiFiManagerParameter(bufferStr); char convertedValueTipo[6]; sprintf(convertedValueTipo, "%d", idEsp); // Need to convert to string to store a default value. new (&custom_hidden) WiFiManagerParameter("key_custom", "Will be hidden", convertedValueTipo, 2); char converteValue3[60]; sprintf(converteValue3,"%d",Fact_K); new (&custom_k_factor) WiFiManagerParameter ("factor_k", " Factor de conversion ex: 1/2':750 3/4':550 1':350", converteValue3,60); // wm.addParameter(&custom_IdEsp); wm.addParameter(&custom_text_box); wm.addParameter(&custom_text_broker); wm.addParameter(&custom_text_box_num); wm.addParameter(&custom_k_factor); wm.addParameter(&custom_hidden); wm.addParameter(&custom_field); if (forceConfig){ if (!wm.startConfigPortal("SL Esp32 Config","password")){ logSer.println("failed to conect"); delay(3000); ESP.restart(); delay(5000); } } else{ if (!wm.autoConnect("SL Esp32 Config","password")){ logSer.println("failed to conec pasao de tiemo t"); delay(3000); ESP.restart(); delay(5000); } } if (WiFi.status() != WL_CONNECTED){ digitalWrite(PIN_LEDV , LOW); digitalWrite(PIN_LEDR , HIGH); } else{ digitalWrite(PIN_LEDV , HIGH); digitalWrite(PIN_LEDR , LOW); logSer.println("wifi conected"); logSer.print(" ip adres :"); logSer.println(WiFi.localIP()); } logSer.println(""); strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp)); logSer.print(" Ip Rasp:"); logSer.println(ipRasp); puertoMQTT=atoi(custom_text_box_num.getValue()); logSer.print(" Mqtt port:"); logSer.println(puertoMQTT); strncpy(broker, custom_text_broker.getValue(),sizeof(broker)); logSer.print("broker:"); logSer.println(broker); // idEsp=atoi(custom_IdEsp.getValue()); // logSer.print(" id Esp:"); // logSer.println(idEsp); logSer.print(" el char es "); logSer.println(custom_k_factor.getValue()); Fact_K=atoi(custom_k_factor.getValue()); logSer.print(" Fact_K:"); logSer.print(Fact_K); logSer.print(" el char es "); logSer.println(custom_k_factor.getValue()); idEsp = atoi(custom_hidden.getValue()); logSer.print("Id Esp"); logSer.println(idEsp); String ipRaspStr=ipRasp; serverName = "http://"+ipRaspStr ; logSer.print("api : "); logSer.println(serverName); if (guardarConfig){ saveConigFile(); } // setup_wifi(); client.setServer(broker, puertoMQTT); client.setCallback(callbackMQTT); hwSer.begin(BAUD_RATE); swSer.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX2, PIN_TX2); swSer2.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX3, PIN_TX3); swSer3.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX4, PIN_TX4); swSer4.begin(BAUD_RATE, EspSoftwareSerial::SWSERIAL_8N1, PIN_RX5, PIN_TX5); swSer.enableIntTx(true); swSer2.enableIntTx(true); swSer3.enableIntTx(true); swSer4.enableIntTx(true); logSer.println(PSTR("Tx on swSer")); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { if (digitalRead(PIN_BOTON) == LOW ){ if (oncePress == false){ tiempoBoton1=millis(); oncePress=true; } long int tiempo=millis() - tiempoBoton1; if (tiempo >= 1500){ logSer.println(" presionado 5 segs parametros"); logSer.println(wm.getParametersCount()); if (!wm.startConfigPortal("SL Esp32 Config","password")) { logSer.println("failed to connect and hit timeout"); delay(3000); //reset and try again, or maybe put it to deep sleep ESP.restart(); delay(5000); } strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp)); puertoMQTT=atoi(custom_text_box_num.getValue()); strncpy(broker, custom_text_broker.getValue(),sizeof(broker)); Fact_K=atoi(custom_k_factor.getValue()); idEsp = atoi(custom_hidden.getValue()); String ipRaspStr=ipRasp; serverName = "http://"+ipRaspStr ; if (guardarConfig){ saveConigFile(); } }} logSer.print("Attempting MQTT connection..."); // Attempt to connect char clientName[15]; sprintf(clientName, "ESP32_Id_%d", idEsp); if (client.connect(clientName)) { logSer.println("connected"); // Subscribe char subTopic[20]; sprintf(subTopic, "esp32/%d/calib", idEsp); client.subscribe(subTopic); char subTopic2[20]; sprintf(subTopic2, "esp32/%d/diluir", idEsp); client.subscribe(subTopic2); logSer.print("subsribiedose a "); logSer.println(subTopic); logSer.print("subsribiedose a "); logSer.println(subTopic2); digitalWrite(PIN_LEDV , HIGH); digitalWrite(PIN_LEDR, LOW); } else { logSer.print("failed, rc="); logSer.print(client.state()); logSer.println(" try again in 5 seconds"); digitalWrite(PIN_LEDV , LOW); digitalWrite(PIN_LEDR, HIGH); // Wait 5 seconds before retrying delay(3000); } } } void leerUltrasonico(EspSoftwareSerial::UART &pos, int tanqueID){ do { for (int i = 0; i < 4; i++) { data[i] = pos.read(); } } while (pos.read() == 0xff); //Espera a que se complete la transmisión de datos salientes pos.flush(); if (data[0] == 0xff) { int sum; //Comprobación de los valores de lectura sum = (data[0] + data[1] + data[2]) & 0x00FF; /*Verifica que el resultado de la operación anterior coincida con el valor del dato 3 Si no coincide, entonces la edición es errónea */ if (sum == data[3]) { //Conversión de los valores medidos en cm distancia = (data[1] << 8) + data[2]; if (distancia > 30) { logSer.print("distancia "); logSer.print(tanquesDisponible[idEsp-1][tanqueID]); logSer.print(":"); logSer.print((distancia / 10)); logSer.println("CM"); if (distancia != lastDistancia){ lastDistancia=distancia; Contenido=String((distancia / 10)); HTTPClient http; char numstr[2]; String serverPath = serverName +"/api/cont/tanque/"+ itoa(tanquesDisponible[idEsp-1][tanqueID], numstr,10)+"/"+ Contenido; logSer.print("Enviando "); logSer.println(serverPath); http.begin(serverPath.c_str()); int httpResponseCode = http.GET(); if (httpResponseCode>0) { logSer.print("HTTP Response code: "); logSer.println(httpResponseCode); String payload = http.getString(); logSer.println(payload); } else { logSer.println("Error code: "); // logSer.println(httpResponseCode); } // Free resources http.end(); } } else { logSer.print("Debajo del límite inferior Tanque "); logSer.println(tanquesDisponible[idEsp-1][tanqueID]); } } else { logSer.print("ERROR lectura tanque "); logSer.println(tanquesDisponible[idEsp-1][tanqueID]); } } } void leerUltrasonicoHS(HardwareSerial &pos, int tanqueID){ do { for (int i = 0; i < 4; i++) { data[i] = pos.read(); } } while (pos.read() == 0xff); //Espera a que se complete la transmisión de datos salientes pos.flush(); if (data[0] == 0xff) { int sum; //Comprobación de los valores de lectura sum = (data[0] + data[1] + data[2]) & 0x00FF; /*Verifica que el resultado de la operación anterior coincida con el valor del dato 3 Si no coincide, entonces la edición es errónea */ if (sum == data[3]) { //Conversión de los valores medidos en cm distancia = (data[1] << 8) + data[2]; if (distancia > 30) { logSer.print("distancia "); logSer.print(tanquesDisponible[idEsp-1][tanqueID]); logSer.print(":"); logSer.print((distancia / 10)); logSer.println("CM"); if (distancia != lastDistancia){ lastDistancia=distancia; Contenido=String((distancia / 10)); HTTPClient http; char numstr[2]; String serverPath = serverName +"/api/cont/tanque/"+ itoa(tanquesDisponible[idEsp-1][tanqueID], numstr,10)+"/"+ Contenido; logSer.print("Enviando "); logSer.println(serverPath); http.begin(serverPath.c_str()); int httpResponseCode = http.GET(); if (httpResponseCode>0) { logSer.print("HTTP Response code: "); logSer.println(httpResponseCode); String payload = http.getString(); logSer.println(payload); } else { logSer.println("Error code: "); // logSer.println(httpResponseCode); } // Free resources http.end(); } } else { logSer.print("Debajo del límite inferior Tanque "); logSer.println(tanquesDisponible[idEsp-1][tanqueID]); } } else { logSer.print("ERROR lectura tanque "); logSer.println(tanquesDisponible[idEsp-1][tanqueID]); } } } void loop() { if (digitalRead(PIN_BOTON) == LOW ){ if (oncePress == false){ tiempoBoton1=millis(); oncePress=true; } long int tiempo=millis() - tiempoBoton1; if (tiempo >= 5000){ logSer.println(" presionado 5 segs parametros"); logSer.println(wm.getParametersCount()); if (!wm.startConfigPortal("SL Esp32 Config","password")) { logSer.println("failed to connect and hit timeout"); delay(3000); //reset and try again, or maybe put it to deep sleep ESP.restart(); delay(5000); } strncpy(ipRasp, custom_text_box.getValue(),sizeof(ipRasp)); puertoMQTT=atoi(custom_text_box_num.getValue()); strncpy(broker, custom_text_broker.getValue(),sizeof(broker)); Fact_K=atoi(custom_k_factor.getValue()); idEsp = atoi(custom_hidden.getValue()); String ipRaspStr=ipRasp; serverName = "http://"+ipRaspStr ; if (guardarConfig){ saveConigFile(); } if (WiFi.status() == WL_CONNECTED){ digitalWrite(PIN_LEDV , HIGH); digitalWrite(PIN_LEDR, LOW); oncePress=false; } } } if (WiFi.status() == WL_CONNECTED){ if (!client.connected()) { reconnect(); } client.loop(); if (ControlCalibrando == false && ControlDiluyendo == false){ if (hwSer.available()>1){ leerUltrasonicoHS(hwSer,0); } if (swSer.available() > 1 ) { leerUltrasonico(swSer,1); } if (swSer2.available() > 1 ) { leerUltrasonico(swSer2,2); } if (swSer3.available() > 1 ) { leerUltrasonico(swSer3,3); } if (swSer4.available() > 1 ) { leerUltrasonico(swSer4,4); } delay(100); } else if (ControlDiluyendo == true){ if (!primeraVezLoopDiluir){ switch (tanqueADiluir) { case 1: pinUtilizado=PIN_O1; break; case 2: pinUtilizado=PIN_O2; break; case 3: pinUtilizado=PIN_O3; break; case 4: pinUtilizado=PIN_O4; break; default: break; } volumen = 0 ; diluir_dt=0; //variación de tiempo por cada bucle diluir_T1=millis(); primeraVezLoopDiluir=true; } if ( volumen <= cantidadADiluir){ digitalWrite(PIN_OALL,HIGH); digitalWrite( pinUtilizado,LOW); float frecuencia=ObtenerFrecuecia(); //obtenemos la frecuencia de los pulsos en Hz float caudal_L_m=frecuencia/(float(Fact_K)/100); diluir_dt=millis()-diluir_T1; diluir_T1=millis(); volumen=volumen+(caudal_L_m/60)*(diluir_dt/1000); logSer.print ("Volumen: "); logSer.print (volumen,3); logSer.println (" L"); } else{ ControlDiluyendo=false; primeraVezLoopDiluir=false; CalibNumPulsos=0; volumen=0; digitalWrite(PIN_OALL,LOW); digitalWrite( pinUtilizado,HIGH); } } } } #END ``` ### Debug Messages
kerem closed this issue 2026-02-28 01:29:45 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/WiFiManager#1358
No description provided.