Ciao a tutti.
Sto modificando un orologio NTP a matrici di LED. Connettendolo semplicemente con
WiFi.begin ("ReteMiaTP", "Pippo");
o
WiFi.begin ("Retemia A5", "Pippo");
funziona, ma in nessun modo riesco a far funzionare la scansione automatica delle reti. Se uso i const char * e strcmp ottengo errore, perché va a confrontare un oggetto String (che evidentemente viene da WiFi.SSID) con un const char *.
Potete aiutarmi?
Grazie
Gianluca
#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>
// const char *ssid[] = {"ReteMiaTP", "Retemia A5"};
// const char *pwd[] = {"Pippo", "Pippo"};
const char *ssid = "ReteMiaTP";
const char *pwd = "Pippo";
const char *ssid1 = "Retemia A5";
const char *pwd1 = "Pippo";
// String ssid = "ReteMiaTP";
// String pwd = "Pippo";
// String ssid1 = "Retemia A5";
// String pwd1 = "Pippo";
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.
#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)
*/
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()
{
int n=WiFi.scanNetworks();
for (byte i=0; i<n; ++i)
{
for (byte w=0; w<sizeof(ssid); w++) {if (WiFi.SSID(i)==ssid[w]) WiFi.begin(ssid[w],pwd[w]);}
}
}
*/
void WiFiScan()
{
int n=WiFi.scanNetworks();
for (int i=0; i<n+1; i++)
{
if (WiFi.SSID(i)==ssid) WiFi.begin(ssid,pwd);
else if (WiFi.SSID(i)==ssid1) WiFi.begin(ssid1,pwd1);
else if (WiFi.SSID(i)=="ReteMiaTP") WiFi.begin("ReteMiaTP","Pippo");
else if (WiFi.SSID(i)=="Retemia A5") WiFi.begin("Retemia A5","Pippo");
}
}
void setup()
{
// WiFi.begin("Retemia A5","Pippo");
// Serial.begin(9600);
// CHANGE THE POOL WITH YOUR CITY. SEARCH AT https://www.ntppool.org/zone/@
configTime(0*3600, 0, "it.pool.ntp.org", "time.nist.gov");
// setenv("TZ", "GMT-1BST",1);
// set up TimeZone in local environment
setenv("TZ", TZ, 3);
tzset();
matrix.setIntensity(0); // Use a value between 0 and 15 for brightness
matrix.setRotation(0, 1); // Il 1° display è ruotato
matrix.setRotation(1, 1); // Il 2° display è ruotato
matrix.setRotation(2, 1); // Il 3° display è ruotato
matrix.setRotation(3, 1); // Il 4° display è ruotato
matrix.setRotation(4, 1); // Il 5° display è ruotato
matrix.setRotation(5, 1); // Il 6° display è ruotato
matrix.setRotation(6, 1); // Il 7° display è ruotato
matrix.setRotation(7, 1); // L'8° display è ruotato
matrix.fillScreen(LOW);
matrix.write();
byte P=16; byte L=7; // Variabili locali per la posizione della scritta Wi-Fi
while (WiFi.status()!=WL_CONNECTED)
{
delay(1000);
matrix.drawChar(P, 0, 'W', HIGH,LOW,1); // H
matrix.drawChar(P+L, 0, 'i', HIGH,LOW,1); // HH
matrix.drawChar(P+L*2,0, '-', HIGH,LOW,1); // HH:
matrix.drawChar(P+L*3,0, 'F', HIGH,LOW,1); // HH:M
matrix.drawChar(P+L*4,0, 'i', HIGH,LOW,1); // HH:MM
matrix.write(); // Send bitmap to display
WiFiScan();
delay(1000);
matrix.fillScreen(LOW);
matrix.write();
}
}
void loop()
{
if(millis()-t_int>200) {t_int=millis(); matrix.setIntensity(map(analogRead(0),0,1024,0,12));} // Ogni 200ms legge il potenziometro.
matrix.fillScreen(LOW);
time_t now = time(nullptr);
if (now!=t_prec)
{
t_prec=now;
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
if (WiFi.status()==WL_CONNECTED) prima_conn_ok=1;
else // Non connesso
{
matrix.drawChar(P+L*8-1,0,'°', HIGH,LOW,1);
if (prima_conn_ok)
{
if ((now%100)/10==0 && scan_fatta==0) {scan_fatta=1; WiFiScan();} // Se i secondi iniziano per 0, fa la scansione
else scan_fatta=0;
}
else if (millis()-t_scan>periodo_scan)
{
t_scan=millis();
WiFiScan();
}
}
matrix.write(); // Send bitmap to display
}
}