Stránka 1 z 2
Pripojeni do WiFi
Napsal: 04 zář 2019, 07:03
od cz_marek
Reším problem jak pripojit ESP do Wifi v casovem intervalu
Jde o to ze mam nejake zařízení ktere má primarni funkci (měření výšky hladiny v barelu, spinani ventilace ve sklepu ...) a pak ma moznost zjisteni stavu na dalku - pripojeni do WiFi.
Řeším jak to udelat abych nestartoval a nepripojoval wifi v setupu protože pokud je wifi nedostupna což se u par zarizeni muze obcas stat tak nedelaji to pro co byli primarne vytvoreny - misto mereni hladiny se nekonecne dlouho pripojuje a hleda wifi ktera tam neni i kdyz to je jen kontrolni a podruzna funkce.
Ideal by bylo kdyby ESP po startu hledalo wifi - pokud nenajde do 20sekund tak to prerusit a pak kontrolovat treba kazdych 5 minut jestli už je wifi dostupna - pokud ano tak zase 20s pokus o pripojeni...
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 08:45
od KamilV
Jakou používáš knihovnu? Jak se připojuješ nyní? Ukaž prosím setup()
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 08:59
od cz_marek
Sorry tim jsem mel asi zacit...
Použivam ESP8266WiFiMulti - hodi se mi ze muzu do vsech zarizeni dat stejny kod a pak mi to funguje doma, v praci, pres hotspot na telefonu...
Vybral jsem z kodu to podstatne .
Kód: Vybrat vše
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
WiFiClient client;
WiFiServer server(80); //Server on port 80
void setup() {
StartWiFi();
}
void loop() {
}
void StartWiFi(){
WiFi.mode(WIFI_STA);
wifiMulti.addAP("wifi_1", "heslo_1");
wifiMulti.addAP("wifi_2", "heslo_2");
wifiMulti.addAP("wifi_3", "heslo_3");
wifiMulti.addAP("wifi_4", "heslo_4");
Serial.println("Connecting ...");
while (wifiMulti.run() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 12:10
od pavel1tu
Tak jsem se zamotal, na tabletu to nejde ... až doma
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 12:18
od gilhad
A nepomohlo by neco ve stylu
Kód: Vybrat vše
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
WiFiClient client;
WiFiServer server(80); //Server on port 80
bool wifiOK,mereniOK
void setup() {
// StartWiFi();
}
void loop() {
.... // nejaka mereni a tak
if (mereniOK) { // reportujeme, az kdyz je co
wifiOK=StartWiFi(); // pokud se povede reportovat
if (wifiOK) {
Serial.println("Odeslani OK");
} else {
Serial.println("Odeslani selhalo");
};
};
}
void StartWiFi(){
WiFi.mode(WIFI_STA);
wifiMulti.addAP("wifi_1", "heslo_1");
wifiMulti.addAP("wifi_2", "heslo_2");
wifiMulti.addAP("wifi_3", "heslo_3");
wifiMulti.addAP("wifi_4", "heslo_4");
Serial.println("Connecting ...");
int max_try;
max_try=20; // max 20 pokusu,
while ((wifiOK= (wifiMulti.run() != WL_CONNECTED)) && ((max_try>0)) { // logujeme si, zda jsme se pripojili, delame jen max_try pokusu
max_try--;
delay(1000);
Serial.print(".");
}
if (!wifiOK) return false; // kdyz se to nepodarilo vcas, tak toho nechame
Serial.println("");
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
return true; // podarilo se
}
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 12:39
od cz_marek
@ pavel1tu - neresilo by to problem toho ze kdyz se nepripoji do wifi tak se rozbehne program v LOOPu
@ gilhad - pokud by bylo mereni OK tak by se pripojilo do wifi - to by bylo v podstate pri kazdem cyklu, mohl bych to dat primo do loopu. Potřeboval bych spis ošetřit časový interval kdy se zkouší pripojit a pak to vzda a dalsi pokus spusti po nejake dobe - tohle bych byl schopny osetřit. Jen nevim jak na to "když se nepripoji do půl minuty nech toho..."
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 14:25
od gilhad
To je ten max_try ve StartWifi(), ktery po 20 sekundach prestane blokovat. Jestli je tam jeste nejaky wifiMulti.stop(), tak ho v pripade neuspechu muzes zavolat taky, krome toho, ze vratis false.
(teda pokud to blokuje tak, ze napise "Connecting " a nekonecnou radu tecek, tak tim omezis delku te rady, nez to vzda. Pokud se to zablokuje jeste pred tim napisem "Connecting ...", tak tohle nepomuze)
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 14:41
od cz_marek
Jasne už mi to doslo, mel jsem nejakou slabsi chvilku
- nebylo by to na čas ale na pokusy - to by slo. Musim to zkusit
Dik
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 16:32
od gilhad
no, v podstate na cas, protoze ten wifiMulti.run() IMHO pomerne rychle vrati, co zrovna dela a tak to stoji na tom delay(1000)
Re: Pripojeni do WiFi
Napsal: 04 zář 2019, 19:06
od jankop
Nikdy jsem nepoužil WiFiMulti, ale tohle mě funguje slušně. Svit modré LED signalizuje, že zařízení není na WiFi
Kód: Vybrat vše
#include <Ticker.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#define WIFIPERIODA 10 // perioda testovani pripojeni k WiFi [s]
#define LEDBLUEPIN 2 // pin modre LED
bool WiFiTestFlag = true; // priznak pro periodicky test WiFi
bool WiFiState = false; // priznak urcujici, jestli je WiFi pripojena
Ticker WiFiTestTick; // instance pro periodicky test WiFi
ESP8266WiFiMulti wifiMulti;
//********************************************************
void WiFiTest(void) {
if (wifiMulti.run() != WL_CONNECTED) {
WiFiState = false;
digitalWrite(LEDBLUEPIN, false);
Serial.println("Disconnected !");
}
else {
WiFiState = true;
digitalWrite(LEDBLUEPIN, true);
Serial.print("Connected to ");
Serial.print(WiFi.SSID());
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
// Zrusi priznak testovani WiFi
WiFiTestFlag = false;
}
//*********************************************************
// nastavi priznak pro testovani WiFi pomoci Ticker
void WiFiTestFlagSet(void) {
WiFiTestFlag = true;
}
//*********************************************************
void setup(void) {
Serial.begin(115200);
Serial.println("");
// konfigurace a zhasnuti modre LED
pinMode(LEDBLUEPIN, OUTPUT);
digitalWrite(LEDBLUEPIN, true);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
wifiMulti.addAP("CYBORGA", "heslo123");
wifiMulti.addAP("CYBORGB", "heslo123");
wifiMulti.addAP("CYBORGC", "heslo123");
wifiMulti.addAP("CYBORGD", "heslo123");
// aktivace tickeru pro periodické testovani WiFi
WiFiTestTick.attach(WIFIPERIODA, WiFiTestFlagSet);
}
void loop(void) {
// pokud je nastaven priznak testovani WiFi, tak ho testuje
if (WiFiTestFlag)WiFiTest();
if (WiFiState) {
//WiFi je OK, mohu tady treba odesilat data po Netu
}
Serial.println("Cinnosti, ktere nepotrebuji Net, funguji stale");
delay(1000);
}