Per connettermi in WPS con un WeMos D1 Pro vorrei che mi lampeggiasse un led intanto che esegue il ciclo sottostante:
bool startWPSPBC() {
Serial.println("WPS config start");
bool wpsSuccess = WiFi.beginWPSConfig();
if (wpsSuccess) {
// Well this means not always success :-/ in case of a timeout we have an empty ssid
String newSSID = WiFi.SSID();
if (newSSID.length() > 0) {
// WPSConfig has already connected in STA mode successfully to the new station.
Serial.printf("WPS finished. Connected successfull to SSID '%s'\n", newSSID.c_str());
Serial.println(WiFi.localIP());
digitalWrite (2, LOW);
} else {
wpsSuccess = false;
digitalWrite (2, HIGH);
}
}
return wpsSuccess;
}
Il LED è su 2 e lo accendo, fisso, al termine del WPS oppure lo spengo se non è andato a buon fine.
Ma per farlo lampeggiare DURANTE il ciclo come posso fare?
Non vedo cicli quindi penso tu ti stia riferendo alle istruzioni beginWPSConfig e/o WiFi.SSID, essendo metodi atomici di librerie o modifichi queste per far lampeggiare il led se possibile oppure colleghi ad un pin un led con il lampeggio integrato, o se vuoi complicarti inutilmente la vita piloti un NE555 con un pin e fai lampeggiare il led con la frequenza che ti pare modificando i componenti a corredo del NE555, schemi su internet ne trovi a tonnellate. Io userei il led lampeggiante in automatico
Si, ma lui mi sembra voglia anche poterlo accendere fisso ...
Forse dico una cappellata (non sarebbe la prima :P) ... fare una funzione nel loop con 3 stati con comportamento dipendente da una variabile flag a 3 valori ? ... tipo, se la flag e' 0, spento, se e' 1 lampeggio (con millis :P), se e' 2 acceso ... e poi mettere la flag a 0 nel setup, metterla ad 1 subito prima di chiamare la funzione del beginWPS, e poi rimetterla a 0 se wpsuccess false o a 2 se true ? ...
Ho fatto una "scatolina" bellina bellina con dentro uno step-down da 24 a 5 volt, poi un convertitore RS485 a TTL e poi un WeMos con antenna esterna. Ho trovato anche un bellissimo contenitore in alluminio per schermare tutto.
E sono ON-LINE via WiFi con il mio PLC.
Adesso non riuscirei più a farne a meno sulle mie macchine dato che ci faccio teleassistenza e rientro nella Industria 4.0
Uso il led integrato del WeMos (GPIO02) per sapere se sono connesso, disconnesso oppure in "ricerca WPS".
Ecco perché non ho mai parlato di due Led.
Quindi Acceso, Spento o Lampeggiante.
Già gli faccio fare tre blink con delay (100), senza farmi troppe torte con millis, quando mi da errore di connessione.
Pensavo di riuscire a farlo lampeggiare in "ricerca wps", ma è un ciclo interno alla libreria.
L'idea di Ete mi sembra la più fattibile: se sono in ricerca lampeggia con un void esterno.
Vedo di mettere in pratica. Thanks
Ma chiamare la funzione blocca il loop ? ... perche' se lo blocca, allora e' normale che non lampeggi ... pero' mi sembra strano che sia stata fatta in modo da bloccare il loop ...
.... SI Etem, quelle chiamate che si connetto al WiFi, o comunque al WPS, sono blocccanti sino all'avvenuta connessione o al timeout, dopo di che ... ti ritornano il risultato ...
Allora mi sa che l'unica soluzione per steve e' "sacrificare" un'altro GPIO per un led lampeggiante ... perche' se il loop si blocca, non credo ci sia alcun altro modo per farlo lampeggiare ... o almeno a me proprio non ne vengono in mente ...
Il lampeggio era per farmi capire se stava cercando, se non ha trovato e se va in WPS, tutto con il led sulla board (GPIO2)
Se sta cercando ho ovviato accendendo e spegnendo il led insieme ad ogni punto che appare sul monitor seriale (e in questo caso non è bloccante)
Per gli altri modi lo faccio lampeggiare prima, tre volte, con differente velocità.
P.S. Il Led lavora "al contrario".
void setup() {
pinMode (MAX485_DE_RE, OUTPUT);
pinMode (2, OUTPUT);
digitalWrite (MAX485_DE_RE, LOW);
digitalWrite (2, HIGH);
Serial.begin(115200);
delay(1000);
Serial.printf("\nTry connecting to WiFi with SSID '%s'\n", WiFi.SSID().c_str());
WiFi.mode(WIFI_STA);
WiFi.begin(WiFi.SSID().c_str(), WiFi.psk().c_str()); // reading data from EPROM, last saved credentials
while (WiFi.status() == WL_DISCONNECTED) {
delay(500);
Serial.print(".");
digitalWrite (2, LOW); delay (20); digitalWrite (2, HIGH);
}
wl_status_t status = WiFi.status();
if (status == WL_CONNECTED) {
Serial.printf("\nConnected successfull to SSID '%s'\n", WiFi.SSID().c_str());
Serial.println(WiFi.localIP());
digitalWrite (2, LOW);
} else {
Serial.printf("\nCould not connect to WiFi. state='%d' ", status);
for (i=0; i<4; i++) {
digitalWrite (2, LOW); delay (100); digitalWrite (2, HIGH); delay (100);
}
// Serial.println("Please press WPS button on your router.\n Press any key to continue...");
// while (!Serial.available()) {
// ;
// }
if (!startWPSPBC()) {
Serial.println("Failed to connect with WPS :-(");
digitalWrite (2, HIGH);
}
}
... ma ... usare un LED RGB ed usare i tre colori per dare le dovute indicazioni?
Tempo fa io feci una schedina dove l'utente era informato dello status proprio tramite un LED RGB che indicava, con i vari colori, cosa stava facendo e a che punto era del programma
... ho, se poi tre pin (R,G,B) sono troppi ... complicando un po' il software, puoi usare un LED Neopixel (WS2812B ... quelli di cui parlavamo nell'altra discussione) che, a scapito di un sistema più complesso di colloquio software, usa UN solo pin