Copiare String in char

Ciao di nuovo a tutti
Ho problemi in questa parte del codice:

void WiFiScan()
{
int n=WiFi.scanNetworks();
if(prima_conn_ok) scrive_orario();
for (int i=0; i<n; ++i) // WiFi.SSID(i) è un oggetto String, che deve essere convertito per poter essere conrontato con un char*.
  {     
        if (!strcmp(WiFi.SSID(i).c_str(),ssid )) {WiFi.begin(ssid, pwd );}
   else if (!strcmp(WiFi.SSID(i).c_str(),ssid1)) {WiFi.begin(ssid1,pwd1);}
  }
configTime(TZ, "it.pool.ntp.org", "time.nist.gov");
}

che fatica ad agganciare la rete WiFi. Sembra funzionare mettendo 1 secondo di pausa dopo i WiFi.begin e questo mi fa pensare che forse andrebbe meglio copiando WiFiSSID(i) in un'altra variabile, ma non riesco a farlo nonostante la conversione che ho fatto con .c_str:

char id[30];

void WiFiScan()
{
int n=WiFi.scanNetworks();
if(prima_conn_ok) scrive_orario();
for (int i=0; i<n; ++i) // WiFi.SSID(i) è un oggetto String, che deve essere convertito per poter essere conrontato con un char*.
  {     
  strcpy(id, WiFi.SSID(i).c_str);
       if (!strcmp(id,ssid )) {WiFi.begin(ssid, pwd );}
  else if (!strcmp(id,ssid1)) {WiFi.begin(ssid1,pwd1);}
  }
configTime(TZ, "it.pool.ntp.org", "time.nist.gov");
}

Potete aiutarmi?
Grazie
Gianluca

ciao

due cose...il

strcpy(id, WiFi.SSID(i).c_str);

dovrebbe essere:

strcpy(id, WiFi.SSID(i).c_str());

poi ad ogni ciclo for io resetterei l'array id con:

memset(id,'\0',sizeof(id));

E' vero! Grazie! :slight_smile:
Perché faresti memset?

perchè così sono sicuro che, tranne quello che m'interessa, tutto il resto ritorna "null"

Datman usi gli array con ssid e pwd solo per agganciare automaticamente l'una o l'altra a seconda di dove sei?
In questo caso prova a guardare l'esempio wifimulti. Ero partito anch'io col tuo approccio ma una volta provato il wifimulti non sono più tornato indietro.

Proprio adesso che funziona???... :slight_smile:
Proverò! :slight_smile:

Versione attuale, 3.4:

#include <ESP8266WiFi.h> // URL aggiuntivo per il gestore schede: http://arduino.esp8266.com/stable/package_esp8266com_index.json
#include <SPI.h> // Mi sembra che funzioni anche senza...
#include <Adafruit_GFX.h> // Usato da Max72xxPanel
#include <Max72xxPanel.h> // Installare da zip: https://github.com/markruys/arduino-Max72xxPanel
#include <time.h>

#define TZ "CET-1CEST,M3.5.0/2,M10.5.0/3"

/*
Sull'ora legale: https://forum.arduino.cc/index.php?topic=643074.0
Per l'Italia/Roma:
CET-1CEST,M3.5.0/2,M10.5.0/3

CET = lo Standard Time quando non è presente l'ora legale (Central Europan Time)
-1 = indica 1 ora a Est di Greenwich (quindi CET = GMT+1 = UTC+1)
CEST = lo Standard Time quando è presente l'ora legale (Central Europan Summer Time) con spostamento di 1 ora (default)

M3.5.0 = quando inizia l'ora legale, ossia a Marzo (3) nell'ultima (5) Domenica (0)
/2 = l'ora locale di quando inizia l'ora legale (le 2 di notte)

M10.5.0 = quando termina l'ora legale, ossia a Ottobre (10) nell'ultima (5) Domenica (0)
/3 = l'ora locale di quando termina l'ora legale (le 3 di notte)

Il (5) è inteso come ultima settimana.
Mese.Settimana.Giorno/Ora
Mese va da 1 a 12
Settimana va 1 a 5 (con 5 si intende sempre l'ultima settimana, indipendentemente da quante ce ne sono in quel mese)
Giorno va da 0 a 6 (0=domenica)
*/

char *ssid = "ReteMiaTP";   char  *pwd = "Pippo";
char *ssid1 = "Retemia A5"; char  *pwd1 = "Pippo";
char id[30];

unsigned long t_scan=0; // Per il conteggio del tempo tra una scansione e l'altra della rete (che impiega 2s) durante il loop
int periodo_scan=5000; // Periodo di scansione se c'è già stata una prima conessione
byte prima_conn_ok=0;
byte scan_fatta=0; // Va a 1 dopo aver fatto la scansione ai primi secondi del minuto, per non ripeterla ogni 2s per 10s.
time_t adesso=0;


int numberOfHorizontalDisplays = 8;
int numberOfVerticalDisplays   = 1;
char time_value[20];

// LED Matrix Pin -> ESP8266 Pin
// Vcc            -> 3v  (3V on NodeMCU 3V3 on WEMOS)
// Gnd            -> Gnd (G on NodeMCU)
// DIN            -> D7 (MOSI) (Same Pin for WEMOS)
// CS             -> D4  (Same Pin for WEMOS) D1mini: GPIO2
// CLK            -> D5 (Clk)  (Same Pin for WEMOS)

byte pinCS=2;
Max72xxPanel matrix=Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

unsigned long t_int; // Temporizzazione per la lettura del potenziometro per la regolazione della luminosità.
byte P=5; byte L=7; // POSIZIONE DELL'ORARIO NEL LOOP
time_t t_prec;


void WiFiScan()
{
byte n_ssid;
int n=WiFi.scanNetworks();
if(prima_conn_ok) scrive_orario();
memset(id,'\0',sizeof(id));
for (byte i=0; i<n; ++i) // WiFi.SSID(i) è un oggetto String, che deve essere convertito per poter essere conrontato con un char*.
  {     
  strcpy(id, WiFi.SSID(i).c_str());
       if (!strcmp(id,ssid )) {WiFi.begin(ssid, pwd ); n_ssid=1; break;}
  else if (!strcmp(id,ssid1)) {WiFi.begin(ssid1,pwd1); n_ssid=2; break;}
  }
  delay(1000);
  configTime(TZ, "it.pool.ntp.org", "time.nist.gov");
  //configTime(0*3600, 0, "it.pool.ntp.org", "time.nist.gov"); 
  matrix.fillScreen(LOW);
  matrix.drawChar(30,0,48+n_ssid,HIGH,LOW,1); matrix.write();
  //setenv("TZ", TZ, 3);
  //tzset();
}

void scrive_orario()
{
time_t now = time(nullptr); // Facendo now variabile globale, perdeva il fuso orario.
adesso = time(nullptr);
if (now!=t_prec)
  {
  t_prec=now;
  matrix.fillScreen(LOW);
  String time = String(ctime(&now));
  time.trim();
  time.substring(11,19).toCharArray(time_value, 10);
  // Visualizza lo '0' iniziale prima delle ore 9.00:
  matrix.drawChar(P,0,    time_value[0], HIGH,LOW,1); // H
  // Cancella lo '0' iniziale prima delle ore 9.00:
  // if(time_value[0]!='0') {matrix.drawChar(P,0,time_value[0],HIGH,LOW,1);} // H
  matrix.drawChar(P+L,  0,time_value[1], HIGH,LOW,1); // _H  
  matrix.drawChar(P+L*2,0,time_value[2], HIGH,LOW,1); // __:
  matrix.drawChar(P+L*3,0,time_value[3], HIGH,LOW,1); // ___M
  matrix.drawChar(P+L*4,0,time_value[4], HIGH,LOW,1); // ____M
  matrix.drawChar(P+L*5,0,time_value[5], HIGH,LOW,1); // _____:
  matrix.drawChar(P+L*6,0,time_value[6], HIGH,LOW,1); // ______S
  matrix.drawChar(P+L*7,0,time_value[7], HIGH,LOW,1); // _______S
  matrix.write(); 
  }
}

Premesso che se funziona va sempre bene, prova a vedere cosa succede se cade la connessione.
Col metodo dell'array io non sono riuscito a trovare il modo per farlo riconnettere in automatico.
Col wifimulti lo fa da solo...

Lo fa, lo fa! :slight_smile:
Se ritorna la rete, si riconnette immediatamente; altrimenti, entro 30 secondi ne cerca un'altra. Quando la trova, indica il numero della SSID nella lista.

Beh... per aver preso in mano per la prima volta l'ESP8266 ieri, posso ritenermi soddisfatto... :slight_smile:

Ottimo.
Allora sei più bravo di me...

Eeehhh... Magari fossi veramente bravo! La parte più difficile è stata scegliere quale copiare in rete e trovare le librerie giuste... Poi, la notte scorsa, quando alle 2.30 stavo andando a dormire, mi è venuta l'idea di fare una scansione automatica delle reti e mi sono messo a cercare...:slight_smile:

Un breve video:

Adesso ho velocizzato la commutazione e impiega veramente pochi secondi. Farò un altro video e metterò il collegamento nella discussione sull'orologio.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.