Comparar const char

Hola amigos tengo el siguiente problema: necesito hacer la siguiente comparacion

const char* wificasa= "casa"

if (wificasa=="casa")
{Serial.println("son iguales");
}

sin embargo no logro que sea valida la sentencia. Me pueden ayudar? gracias de antemano

if  ( strcmp(wificasa, "casa") == 0 ) {
  Serial.println("son iguales");
}

cuando lo pruebo asi me funciona, sin embargo en mi codigo no funciona, aqui lo adjunto

  StaticJsonDocument<300> doc;
  DeserializationError err = deserializeJson(doc, desjson);
  if (err) {writeDisplay("NO JSON",5000);
    return;
  }
  ssidwifi = doc["SSID"];
  passwordwifi = doc["PASSWORD"];

  writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
  
}
if (strcmp(ssidwifi, ("SmartCentral") == 0 ) 
  { writeDisplay("central found",3000);
 
    IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    Udp.beginPacket(broad, 8888);
    Udp.write("credentials");
    Udp.endPacket();
  }

writeDisplay es una funcion implementada para mostar en una pantalla SSD
en el archivo json esta serializado SmartCentral previamente

A

if (strcmp(ssidwifi, ("SmartCentral") == 0 ) 

le está sobrando un paréntesis, debería ser

if (strcmp(ssidwifi,"SmartCentral") == 0 ) 

Saludos

quite el parantesis y sigue sin entrar en la secuencia

aqui sigue igual no entra a esta sentencia

  if (strcmp(ssidwifi, "SmartCentral") == 0 )  
  { writeDisplay("central found",3000);
     IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    Udp.beginPacket(broad, 8888);
    Udp.write("credentials");
    Udp.endPacket();
}
````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

Entonces es obvio que el problema está en la variable o el error viene antes porque es tan fácil de comprobar cómo pasar en un char array directamente el valor con el que comparas

void setup(){
   Serial.begin(9600);
}

void loop(){
  char *ssidwifi = "SmartCentral";
  if (strcmp(ssidwifi, "SmartCentral") == 0 )  { 
     Serial.println("Entra");
  }
}

Simplificando:

if (!strcmp(wificasa,"casa")  )  { 
     Serial.println("son iguales");
  }

...

if (strcmp(wificasa,"casa")  )  { 
     Serial.println("NO son iguales");
  }

(añadida la negación "!" delante del string compare)

Puedes copiar el JSON?
Saludos.

si strcmp() no devuelve un boolean, ¿Qué diferencia hay entre convertir el 0 que te da en caso de que las cadenas sean iguales en 1 al invertirlo con ! que la comparación == 0?

@cuantron te veo hoy algo lanzado. menuda respuesta. Sin acritud. Llevo casi 40 años programando pero seguro que me equivoco a veces (muchas).
Símplemente estaba simplificando el código.

Es que no lo has simplificado, has tratado una función que no retorna un bool cómo si diera un bool invertido y repito, en nada cambia el == 0 que Sí es el resultado de cadena coincidente.

"La función strcmp compara las cadenas. En resumen , compara carácter por carácter , si las cadenas son iguales retornara un valor 0, si la primera cadena es mayor retornara un valor positivo y si es menor retornara un valor negativo."

Me limito a decir que:
-Haces algo extraño.
-No soluciona en nada la comparación del == 0 (pues esto es correcto). Es decir tu código no cambia la situación.
-Puede dar lugar a equivocación. Alguien que no sepa qué hace la función strcmp() con los códigos que pones creerá que da un boolean invertido donde será 0, false cuando sea coincidente y 1 true cuando no.

Lo de que estoy lanzado. Mira, yo no digo nada de mi trabajo, de mis años de experiencia. El foro es para debatir ideas. Tranquilo, todos nos equivocamos, por eso precisamente tenemos este foro. Lo que tampoco puede ser es que si detectas algo extraño y lo comentas la gente se te tire encima diciendo que vas lanzado. Es cómo si impartiendo clases el alumno te reprocha que le corriges el error.

:slight_smile: Hay quejas absurdas en internet, enserio... y me preocupa porque estoy haciendo una web precisamente con la idea de enseñar, pero si la gente reacciona así :confused:

Bueno, no pensaba entrar a discutir pero creo que deberías reflexionar ese texto que he citado y el post que me habías escrito y ya has eliminado.

Mi código, efectivamente, no cambia la solución ni soluciona. Mi interés era únicamente el de divulgar otras formas de hacer las cosas en C++ dado que algunos post que este foro contiene carecen de base mínima de programación y quise hacer reflexionar sobre cómo funciona el "if", que no es otra cosa que dar un resultado cero (false) u otro valor (true). En otros post no me meto porque tienen bastante más nivel de lo que yo puedo llegar o no tengo herramientas o tiempo para poder ayudar.
Creo que al menos lo de divulgar lo he conseguido dado que has borrado tu post, supongo, después de haber comprobado que mis indicaciones funcionaban.

1 Like

Por definición cualquier valor distinto de 0 se considera TRUE, así que más allá de que se pueda generar confusión sobre el tipo de dato devuelto por strcmp(), la solución de @DanX3 es válida.

Saludos


Moderador
@cuantron y @DanX3 las discusiones de este tipo se debaten por privado.
La última vez que veo algo similar con Uds.
Les enviaré privados a cada uno de Uds.


void SerializeObject(String wifi_ssid, String pass_wifi)
{

  StaticJsonDocument<300> doc;
  doc["SSID"] = wifi_ssid;
  doc["PASSWORD"] = pass_wifi;

  serializeJson(doc, json);
  Serial.println(json);
}

void DeserializeObject(String desjson)
{

  StaticJsonDocument<300> doc;
  DeserializationError err = deserializeJson(doc, desjson);
  if (err) {writeDisplay("NO JSON",5000);
    return;
  }
  ssidwifi = doc["SSID"];
  passwordwifi = doc["PASSWORD"];

  writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
  
}

aca estan las dos funciones del json

@rvinaso necesitaríamos el json (fichero o cadena de donde se nutra) y el código fuente completo

hola @DanX3 , discupa haber desaparecido, se me rompio la computadora y ahora es q puedo volver a revisar el forum. aqui va el codigo completo
</>


#include <splash.h>

/*
   This sketch trys to Connect to the best AP based on a given list

*/
#include "FS.h"
#include <ArduinoJson.hpp>
#include <ArduinoJson.h>
bool    spiffsActive = false;
String json;
int Pin1 = 1;// is connected TX  azul
int Pin4 = 3;// is connected RX  amarillo
#include <ESP8266WiFi.h>
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <WiFiManager.h>
#include <WiFiUdp.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE    DHT11
#include <Wire.h>
#include "SSD1306.h"





bool activateWifiManager = false;
int contador;
int listoparaenviar = 0;
const char* ssidjson;
const char* passwordjson;
const char *ssidwifi ;
const char * passwordwifi;
const char* ssidSmartCentral="SmartCentral";
const char* incomingSsidwifi ;
const char*  incomingPasswordwifi ;
unsigned int localPort = 8888;
String routerSSID;
String routerKey;
int salvarConfig = 0;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
//int D0;
int activar = 0;
int salvarSSID = 0;
int salvarPASSWORD = 0;

WiFiManager wm;
WiFiUDP Udp;
DHT dht(DHTPIN, DHTTYPE);
SSD1306 display(0x3c, 1, 3); //
#define flipDisplay true


uint8_t MAC_array[6];
char MAC_char[18];

IPAddress server;
String ipadd;
String paquete = "esperando";

void writeDisplay(String mostrar,int espera)
{display.clear();
 display.setFont(ArialMT_Plain_16);
 display.drawString(0, 0, mostrar);
 display.display();
    delay(espera);

  }





void SerializeObject(String wifi_ssid, String pass_wifi)
{

  StaticJsonDocument<300> doc;
  doc["SSID"] = wifi_ssid;
  doc["PASSWORD"] = pass_wifi;

  serializeJson(doc, json);
  Serial.println(json);
}

void DeserializeObject(String desjson)
{

  StaticJsonDocument<300> doc;
  DeserializationError err = deserializeJson(doc, desjson);
  if (err) {writeDisplay("NO JSON",5000);
    return;
  }
  ssidjson = doc["SSID"];
  passwordjson = doc["PASSWORD"];

 
}
void DeserializeCred(String desjson)
{

  StaticJsonDocument<300> doc;
  DeserializationError error2 = deserializeJson(doc, desjson);
  if (error2) {writeDisplay("NO JSON",5000);
    return;
  }
  incomingSsidwifi = doc["SSID"];
  incomingPasswordwifi = doc["PASSWORD"];

  writeDisplay(incomingSsidwifi,3000);
  writeDisplay(incomingPasswordwifi,3000);
  
}

/**
  escribe contenido en un archivo
  string state - contenido a escribir en el archivo
  string path - archivo que se va a escribir
*/

void writeFile(String state, String path) {


  File rFile = SPIFFS.open(path, "w+");
  if (!rFile) {
    Serial.println("Error abriendo!");
  } else {
    rFile.println(state);

    Serial.println(state);
  }
  rFile.close();
}

void appendFile(String state, String path) {


  File rFile = SPIFFS.open(path, "a+");
  if (!rFile) {
    Serial.println("Error!");
  } else {
    rFile.println(state);

    Serial.println(state);
  }
  rFile.close();
}

/**
  el contenido de un archivo
  param cadena path - archivo que se va a leer
  return string - contenido leído del archivo
*/

String readFile(String path) {
  File rFile = SPIFFS.open(path, "r");
  if (!rFile) {
    Serial.println("Error !");
  }
  String content = rFile.readStringUntil('\r');
  Serial.print("reading state: ");
  Serial.println(content);
  rFile.close();
  return content;
}

/**
  @desc inicializa el sistema de archivos
*/

void openFS(void) {

  if (!SPIFFS.begin()) {
    Serial.println("\nError abriendo archivo spiffs");
  } else {
    Serial.println("\nSuccess iniciando Spiffs!");
  }
}









void setup()
{
  Serial.begin(115200);
  delay(10);
  dht.begin();
  display.init();
  if (flipDisplay) display.flipScreenVertically();
 writeDisplay("STARTING",3000);
  Udp.begin(localPort);
  WiFi.mode(WIFI_STA);

  delay(1000);





  // Start filing subsystem
  if (SPIFFS.begin()) {
    Serial.println("SPIFFS Active");
    // Serial.println();
    spiffsActive = true;
  } else {
    //Serial.println("Unable to activate SPIFFS");
  }
  delay(2000);

  openFS();



  String state2 = readFile("/config.txt");
  DeserializeObject(state2);
  delay(1000);
  ssidwifi=ssidjson;
  passwordwifi=passwordjson; 
  
  WiFi.begin(ssidwifi, passwordwifi);  //
  ///// en el display que tengo conectado al ESP01 me muestra caracteres random, por eso no se conecta  
 writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
 writeDisplay("Searching",3000);
     

  
 
////////////////////////////////////////////////////levantar el hotspot si no se conecta  
  while (WiFi.status() != WL_CONNECTED) 
  {
    //  Serial.println("WiFi not connected!");
   writeDisplay("waiting wifi",100);
    contador++;
}
    
    if (contador == 1800) ///se cumple el minuto sin conectarse a la central
    { writeDisplay("No central",5000);
      activateWifiManager = true;
      //break;
    }
  
  
  if (activateWifiManager == true) ///activo el hotspot propio
  { bool res;
    writeDisplay("Starting AP",3000);
    res = wm.autoConnect("SmartSensor", "12345678");

    routerSSID = WiFi.SSID().c_str(); //cojo clave y
    routerKey = WiFi.psk().c_str(); //password del router
    ssidwifi = routerSSID.c_str();
  passwordwifi = routerKey.c_str();
    SerializeObject(ssidwifi, passwordwifi);

    writeFile(json, "/config.txt");    //los guardo
  }
  else ///////// se conecta a la central directamente
  {
    writeDisplay("central found",3000);
 
    IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    Udp.beginPacket(broad, 8888);
    Udp.write("credentials");
    Udp.endPacket();
    //////////////esperar las credenciales para conectarse a la red&//////
  while(salvarSSID == 0) 
   {
    writeDisplay("Waiting credentials",100);
    int packetSize = Udp.parsePacket();
  if (packetSize)
  {     
    IPAddress remote = Udp.remoteIP();
       
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);

    //Serial.print("Contents: ");
    String mensaje = packetBuffer;
      Serial.println(mensaje);
    if (mensaje.substring(0, 4) == "net:")
    {String credentials = String (mensaje.substring(4));
      DeserializeCred(credentials);
      salvarSSID = 1;
       writeDisplay("serializing",3000);
  SerializeObject(incomingSsidwifi, incomingPasswordwifi);
  delay(2000);
  writeFile(json, "/config.txt");

 ssidwifi=incomingSsidwifi ;
  passwordwifi=incomingPasswordwifi;

       
     
    }
    memset(packetBuffer, 0, sizeof(packetBuffer));
  }
   }
  writeDisplay("displaying cred",3000);

 


  
  writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
  
   delay(2000);
  WiFi.begin(ssidwifi, passwordwifi);
  delay(3000);
   if(WiFi.status() == WL_CONNECTED)
  {writeDisplay("Wifi ok",5000);
   writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);      
  }
 
   }

 //////////////////aqui ya el se conecto al router/////////////////////////////////
    IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    String dir_Mac = WiFi.macAddress(); //cojo la direccion mac
    Serial.print("Direccion MAC");
    Serial.println(dir_Mac);
    WiFi.macAddress(MAC_array);
    for (int i = 0; i < sizeof(MAC_array); i++)
    { sprintf(MAC_char, "%s%02x", MAC_char, MAC_array[i]);
    }
    Serial.print("MAC CON ARRAY:  ");
    Serial.println(MAC_char);
    writeDisplay("Sending",3000);
    Udp.beginPacket(broad, 8888); //direccion de broadcast
    //envia un paquete a todos los elementos de la red
    // el servidor debe almacenar esta direccion

    Udp.write("sentemp:");
    Udp.write(MAC_char);
    Udp.endPacket();
    delay(10);
    while (paquete == "esperando")
    {  writeDisplay("Waiting",3000);
      int packetSize = Udp.parsePacket();
      if (packetSize)
      {
        // read the packet into packetBufffer
        Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
        paquete = packetBuffer;
        if (paquete == "sincronizado")
          server = Udp.remoteIP();
        listoparaenviar = 1;
      }
      if (paquete == "esperando")
      {
        Udp.beginPacket(broad, 8888);
        Udp.write("sentemp:");
        Udp.write(MAC_char);
        Udp.endPacket();
        delay(10);
      }
    }
    writeDisplay("Sincronized",3000);
  
}


void loop() {

if(listoparaenviar==1)
{char* buffn="";

  char buffer[1024]=" ";
//  
   float humedad = dht.readHumidity();
  // Read temperature as Celsius
  float temp = dht.readTemperature(true);
  
//   Check if any reads failed and exit early (to try again).
  if (isnan(humedad) || isnan(temp) ) {
   
    return;
  }
  dtostrf(temp,3,2,buffn);
   sprintf(buffer,buffn);
   Udp.beginPacket(server, 8888);
   Udp.write(buffer);
   Udp.endPacket();
    
  
  display.clear();
   display.setFont(ArialMT_Plain_24);
  display.drawString(0, 0, buffer);
  
  display.display();
  delay(10000);

  
}


if (WiFi.status() != WL_CONNECTED) ///se cayo la conexion por alguna razon
{
  writeDisplay("LOST CONN",1000);
  listoparaenviar=0;
}
else
{listoparaenviar=1;
  }






}
`````````````````````````````````````````````````````````````````````````
y este es el fichero json, bien sencillo
````````````````````````````````````````````````````````````````
{"SSID":"SmartCentral","PASSWORD":"12345678"}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</>
gracias de antemano

Hola amigos llevo varios dias vuelto loco con un codigo que estoy implementando para lograr conectar un esp8266 a una red de manera automatica. basicamente mi codigo extrae las credenciales de un archivo JSon que tengo guardado en la memoria flash del esp8266. Sin embargo me sucede que cuando extraigo las credenciales y activo Wifi.begin no se conecta. He logrado aislar el problema, no se por que cuando paso las credenciales por wifi.begin, se vuelven caracteres erroneos. Aqui les dejo el codigo y comentado la zona del problema. Gracias de antemano


#include <splash.h>

/*
   This sketch trys to Connect to the best AP based on a given list

*/
#include "FS.h"
#include <ArduinoJson.hpp>
#include <ArduinoJson.h>
bool    spiffsActive = false;
String json;
int Pin1 = 1;// is connected TX  azul
int Pin4 = 3;// is connected RX  amarillo
#include <ESP8266WiFi.h>
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <WiFiManager.h>
#include <WiFiUdp.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE    DHT11
#include <Wire.h>
#include "SSD1306.h"





bool activateWifiManager = false;
int contador;
int listoparaenviar = 0;
const char* ssidjson;
const char* passwordjson;
const char *ssidwifi ;
const char * passwordwifi;
const char* ssidSmartCentral="SmartCentral";
const char* incomingSsidwifi ;
const char*  incomingPasswordwifi ;
unsigned int localPort = 8888;
String routerSSID;
String routerKey;
int salvarConfig = 0;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
//int D0;
int activar = 0;
int salvarSSID = 0;
int salvarPASSWORD = 0;
String state2;
WiFiManager wm;
WiFiUDP Udp;
DHT dht(DHTPIN, DHTTYPE);
SSD1306 display(0x3c, 4, 3); //  revisar los pines de comunicacion a lo mejor lo q chiva el json son los pines q se usan para otra cosa
#define flipDisplay true


uint8_t MAC_array[6];
char MAC_char[18];

IPAddress server;
String ipadd;
String paquete = "esperando";

void writeDisplay(String mostrar,int espera)
{display.clear();
 display.setFont(ArialMT_Plain_16);
 display.drawString(0, 0, mostrar);
 display.display();
    delay(espera);

  }





void SerializeObject(String wifi_ssid, String pass_wifi)
{

  StaticJsonDocument<300> doc;
  doc["SSID"] = wifi_ssid;
  doc["PASSWORD"] = pass_wifi;

  serializeJson(doc, json);
  Serial.println(json);
}

void DeserializeObject(String desjson)
{

  StaticJsonDocument<300> doc;
  DeserializationError err = deserializeJson(doc, desjson);
  if (err) {writeDisplay("NO JSON",5000);
    return;
  }
  ssidjson = doc["SSID"];
  passwordjson = doc["PASSWORD"];
  
 
}
 

/**
  escribe contenido en un archivo
  string state - contenido a escribir en el archivo
  string path - archivo que se va a escribir
*/

void writeFile(String state, String path) {


  File rFile = SPIFFS.open(path, "w+");
  if (!rFile) {
    Serial.println("Error abriendo!");
  } else {
    rFile.println(state);

    Serial.println(state);
  }
  rFile.close();
}

void appendFile(String state, String path) {


  File rFile = SPIFFS.open(path, "a+");
  if (!rFile) {
    Serial.println("Error!");
  } else {
    rFile.println(state);

    Serial.println(state);
  }
  rFile.close();
}

/**
  el contenido de un archivo
  param cadena path - archivo que se va a leer
  return string - contenido leído del archivo
*/

String readFile(String path) {
  File rFile = SPIFFS.open(path, "r");
  if (!rFile) {
    Serial.println("Error !");
  }
  String content = rFile.readStringUntil('\r');
  Serial.print("reading state: ");
  Serial.println(content);
  rFile.close();
  return content;
}

/* *
  @desc inicializa el sistema de archivos
*/

void openFS(void) {

  if (!SPIFFS.begin()) {
    Serial.println("\nError abriendo archivo spiffs");
  } else {
    Serial.println("\nSuccess iniciando Spiffs!");
  }
}









void setup()
{
  Serial.begin(115200);
  delay(10);
  dht.begin();
  display.init();
  if (flipDisplay) display.flipScreenVertically();
 writeDisplay("STARTING",3000);
  Udp.begin(localPort);
  WiFi.mode(WIFI_STA);

  delay(1000);





  // Start filing subsystem
  if (SPIFFS.begin()) {
    Serial.println("SPIFFS Active");
    // Serial.println();
    spiffsActive = true;
  } else {
    //Serial.println("Unable to activate SPIFFS");
  }
  delay(2000);

  openFS();



  state2 = readFile("/config.txt");
  DeserializeObject(state2);
  delay(1000);
  ssidwifi=ssidjson;
  passwordwifi=passwordjson; 
  Serial.println(ssidwifi);////aqui las credenciales estan bien
  Serial.println(passwordwifi);
  WiFi.begin(ssidwifi, passwordwifi);  //
     
 Serial.println(ssidwifi);//////aqui las credenciales son caracteres erroneos 
  Serial.println(passwordwifi);
 
 writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
 writeDisplay("Searching",3000);
     

  
 
////////////////////////////////////////////////////levantar el hotspot si no se conecta  
  while (WiFi.status() != WL_CONNECTED) 
  {
    //  Serial.println("WiFi not connected!");
   writeDisplay("waiting wifi",100);
    contador++;

    
    if (contador == 1800) ///se cumple el minuto sin conectarse a la central
    { writeDisplay("No central",5000);
      activateWifiManager = true;
      //break;
    }
  }
  
  if (activateWifiManager == true) ///activo el hotspot propio
  { bool res;
    writeDisplay("Starting AP",3000);
    res = wm.autoConnect("SmartSensor", "12345678");

    routerSSID = WiFi.SSID().c_str(); //cojo clave y
    routerKey = WiFi.psk().c_str(); //password del router
    ssidwifi = routerSSID.c_str();
  passwordwifi = routerKey.c_str();
    SerializeObject(ssidwifi, passwordwifi);

    writeFile(json, "/config.txt");    //los guardo
  }
  else ///////// se conecta a la central directamente
  {
    writeDisplay("central found",3000);
 
    IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    Udp.beginPacket(broad, 8888);
    Udp.write("credentials");
    Udp.endPacket();
    //////////////esperar las credenciales para conectarse a la red&//////
  while(salvarSSID == 0) 
   {
    writeDisplay("Waiting credentials",100);
    int packetSize = Udp.parsePacket();
  if (packetSize)
  {     
    IPAddress remote = Udp.remoteIP();
       
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);

    //Serial.print("Contents: ");
    String mensaje = packetBuffer;
      Serial.println(mensaje);
    if (mensaje.substring(0, 4) == "net:")
    {String credentials = String (mensaje.substring(4));
      DeserializeObject(credentials);
      salvarSSID = 1;
       writeDisplay("serializing",3000);
  SerializeObject(incomingSsidwifi, incomingPasswordwifi);
  delay(2000);
  writeFile(json, "/config.txt");

 ssidwifi=incomingSsidwifi ;
  passwordwifi=incomingPasswordwifi;

       
     
    }
    memset(packetBuffer, 0, sizeof(packetBuffer));
  }
   }
  writeDisplay("displaying cred",3000);

 


  
  writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);
  
   delay(2000);
  WiFi.begin(ssidwifi, passwordwifi);
  delay(3000);
   if(WiFi.status() == WL_CONNECTED)
  {writeDisplay("Wifi ok",5000);
   writeDisplay(ssidwifi,3000);
  writeDisplay(passwordwifi,3000);      
  }
 
   }

 //////////////////aqui ya el se conecto al router/////////////////////////////////
    IPAddress broad = WiFi.localIP();
    broad[3] = 255;
    String dir_Mac = WiFi.macAddress(); //cojo la direccion mac
    Serial.print("Direccion MAC");
    Serial.println(dir_Mac);
    WiFi.macAddress(MAC_array);
    for (int i = 0; i < sizeof(MAC_array); i++)
    { sprintf(MAC_char, "%s%02x", MAC_char, MAC_array[i]);
    }
    Serial.print("MAC CON ARRAY:  ");
    Serial.println(MAC_char);
    writeDisplay("Sending",3000);
    Udp.beginPacket(broad, 8888); //direccion de broadcast
    //envia un paquete a todos los elementos de la red
    // el servidor debe almacenar esta direccion

    Udp.write("sentemp:");
    Udp.write(MAC_char);
    Udp.endPacket();
    delay(10);
    while (paquete == "esperando")
    {  writeDisplay("Waiting",3000);
      int packetSize = Udp.parsePacket();
      if (packetSize)
      {
        // read the packet into packetBufffer
        Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
        paquete = packetBuffer;
        if (paquete == "sincronizado")
          server = Udp.remoteIP();
        listoparaenviar = 1;
      }
      if (paquete == "esperando")
      {
        Udp.beginPacket(broad, 8888);
        Udp.write("sentemp:");
        Udp.write(MAC_char);
        Udp.endPacket();
        delay(10);
      }
    }
    writeDisplay("Sincronized",3000);
  
}


void loop() {

if(listoparaenviar==1)
{char* buffn="";

  char buffer[1024]=" ";
//  
   float humedad = dht.readHumidity();
  // Read temperature as Celsius
  float temp = dht.readTemperature(true);
  
//   Check if any reads failed and exit early (to try again).
  if (isnan(humedad) || isnan(temp) ) {
   
    return;
  }
  dtostrf(temp,3,2,buffn);
   sprintf(buffer,buffn);
   Udp.beginPacket(server, 8888);
   Udp.write(buffer);
   Udp.endPacket();
    
  
  display.clear();
   display.setFont(ArialMT_Plain_24);
  display.drawString(0, 0, buffer);
  
  display.display();
  delay(10000);

  
}


if (WiFi.status() != WL_CONNECTED) ///se cayo la conexion por alguna razon
{
  writeDisplay("LOST CONN",1000);
  listoparaenviar=0;
}
else
{listoparaenviar=1;
  }






}

Esto es lo que me devuelve el monitor serial y por ende no se conecta:


Success iniciando Spiffs!
reading state: {"SSID":"SmartCentral","PASSWORD":"12345678"}
SmartCentral
12345678

@⸮⸮⸮?

Estás utilizando punteros:

const char* ssidjson;
const char* passwordjson;
const char *ssidwifi ;
const char * passwordwifi;
const char* ssidSmartCentral="SmartCentral";
const char* incomingSsidwifi ;
const char*  incomingPasswordwifi ;

Un puntero solo "apunta" a una dirección de memoria. Por ejemplo tienes puesto:

const char* ssidjson;

Este puntero (*) ssidjson sirve únicamente para apuntar a un área de memoria presupone que es para leer un caracter únicamente.
Tampoco entiendo porqué la defines como constante (const)
Echale un vistazo a "String" que te facilitará las cosas.

te pongo un ejemplo de cómo usar char*:

char * mipuntero;
String micadena;

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

void loop() {
  micadena="Hola!";
  Serial.print("La cadena micadena tiene:");
  Serial.println(micadena);
  Serial.print("Usamos el puntero:");
  mipuntero=micadena.c_str(); //asignamos el puntero para que apunte a micadena al primer caracter (micadena[0])
  while (*mipuntero) //mientras el caracter a donde apunta mipuntero no sea cero
  {
    Serial.println(*mipuntero); 
    mipuntero++;   //apunto al siguiente char de la cadena
  }
  while(1); //aqui me quedo para siempre para no repetir el loop
}

Recuerda, un puntero es como en windows tener un acceso directo.
¿Puedes usar un puntero para crear una variable nueva? Si, pero tendrás que asignarle memoria previamente, es decir reservar parte de memoria para el uso de esa variable con comandos como "malloc".
El uso de punteros es lo que le da la potencia a los lenguajes de programación.
Ahora bien, ¿porqué no te funciona al imprimir después de conectar a la wifi?
Porque cuando haces esto:

void DeserializeObject(String desjson)
{

  StaticJsonDocument<300> doc;

estás creando una variable "doc" que se usará en ese procedimiento DeserializeObject únicamente.
Cuando asignas en ese mismo procedimiento así:

ssidjson = doc["SSID"];

Estás diciendo que ssidjson apunte a doc["SSID"] pero ssidjson solo es un puntero a un caracter y no alberga contenido por ser un "char*".
Cuando acaba el void, si no se usa la zona de memoria de "doc" te seguirá funcionando pero en cuanto llames a alguna función tal como te pasa con la de conectar la wifi, la zona de memria que usaba "doc" se sobreescribe con otras variables y por eso es que te aparecen caracteres extraños...

Hola @DanX3 lo q me sucede es que la funcion Wifi.begin solo me funciona con const char*. Supongo q una solucion seria no hacer la deserializacion dentro de un void sino hacerlo directamente en el loop. Me puedes dar alguna otra idea? gracias