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();
}
}