Koupil jsem si Arduino s Wifi na desce, že to bude určitě snažší. Je to skutečně tak?
Ano, je to pravda, ale na internetu jsou hlavně návody pro ty, kteří mají wifi modul a tak jsem se lehce ztratil jak se to vlastně dělá. Návod je pro Arduino UNO R3 + WiFi ATmega328P+ESP8266 (32Mb memory) USB-TTL CH340G For Arduino Uno NodeMCU WeMos ESP8266 One New Arrival, ale určitě bude použitelný pro více druhů, které mají Wifi přímo na desce v základu.
Co je potřeba pochopit (asi to každý pochopil kromě mě hned)
1) jsou to dvě věci na jedné desce
2) a s každou se komunikuje zvláš a každá má svůj vlastní život
Pojďme prubnout tu WIFI! Kvůli tomu jste si to určitě koupili...
1) Nastavte přepínače na programování ESP8266 (upload sketch) - 5, 6, 7 na ON, zbytek OFF, červené zvýraznění na obrázku
2) připojte k PC. Trvale bude svítit červená LED ESP - zelené zvýraznění
3) ESP je připraveni poslouchat. V programu Arduino IDE vyberte NÁSTROJE/VÝVOJOVÁ DESKA/ a vyberte Generic ESP8266 module (pokud ho tam nemáte donistalujte desku - manažer - vyhledat ESP2866)
4) Následující program je ukradený (pardon, ale je tam zdroj) a upravený pro další informace a pochopení začátečníků.
5) Zapamatujte si, pokud vám Arduino píše nesmysly divné znaky, snižte rychlost komunikace na Serial.begin(9600); Mě rychlejší píše kraviny a nepotřebuji ji.
Program:
// ESP Web Server
// kompatibilní s ESP32 a ESP8266
// navody.arduino-shop.cz
// pro použití s ESP32, odkomentujte řádek níže
// #define ESP32
// připojení potřebných knihoven
#ifdef ESP32
#include < wifi.h >
#include < wificlient.h >
#include < webserver.h >
#include < espmdns.h >
#else
#include < esp8266wifi.h >
#include < wificlient.h >
#include < esp8266webserver.h >
#include < esp8266mdns.h >
#endif
// vytvoření proměnných s názvem WiFi sítě a heslem
const char* nazevWifi = "název vaší wifi";
const char* hesloWifi = "heslo vaší wifi";
// incializace webserveru na portu 80
#ifdef ESP32
WebServer server(80);
#else
ESP8266WebServer server(80);
#endif
// propojovací pin indikační LED diody a analogového pinu
#ifdef ESP32
#define LEDka 31
#define analogPin 32
#else
#define LEDka 16
#define analogPin A0
#endif
// podprogram s hlavní zprávou, která je vytištěna
// při zadání IP adresy do prohlížeče
void zpravaHlavni() {
// načtení hodnoty analogového pinu a času
// od spuštění Arduina ve formátu String
String analog = String(analogRead(analogPin));
String cas = String(millis() / 1000);
// vytvoření zprávy, která bude vytištěna
// v prohlížeči (
znamená nový řádek)
String zprava = "Ahoj Arduino svete!
";
Serial.print("Ahoj Arduino svete!");
zprava += "Analogovy pin A0: ";
zprava += analog;
zprava += "
Cas od spusteni Arduina je ";
zprava += cas;
zprava += " vterin.
";
zprava += "Stav LED: ";
zprava += digitalRead(LEDka);
zprava += "
";
zprava += "< a href="/ledON"" >Zapni LEDku< /a >
";
zprava += "< a href="/ledOFF"" >Vypni LEDku< /a >";
// vytištění zprávy se statusem 200 - OK
server.send(200, "text/html", zprava);
}
// podprogram s chybovou zprávou, která je vytištěna
// při zadání IP adresy s neexistující podstránkou
void zpravaNeznamy() {
// vytvoření zprávy s informací o neexistujícím odkazu
// včetně metody a zadaného argumentu
String zprava = "Neexistujici odkaz
";
zprava += "URI: ";
zprava += server.uri();
zprava += "
Metoda: ";
zprava += (server.method() == HTTP_GET)? "GET" : "POST";
zprava += "
Argumenty: ";
zprava += server.args();
zprava += "
";
for (uint8_t i = 0; i < server.args(); i++) {
zprava += " " + server.argName(i) + ": " + server.arg(i) + "
";
}
// vytištění zprávy se statusem 404 - Nenalezeno
server.send(404, "text/plain", zprava);
}
void setup() {
// nastavení LED diody jako výstupní a její vypnutí
pinMode(LEDka, OUTPUT);
digitalWrite(LEDka, LOW);
// zahájení komunikace po sériové lince
Serial.begin(9600);
// zahájení komunikace po WiFi s připojením
// na router skrze zadané přihl. údaje
WiFi.begin(nazevWifi, hesloWifi);
// čekání na úspěšné připojení k routeru,
// v průběhu čekání se vytiskne každých
// 500 milisekund tečka po sériové lince
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// odřádkování a výpis informací o úspěšném připojení
// včetně přidelené IP adresy od routeru
Serial.println("");
Serial.print("Pripojeno k WiFi siti ");
Serial.println(nazevWifi);
Serial.print("IP adresa: ");
Serial.println(WiFi.localIP());
// kontrola funkčnosti MDNS
if (MDNS.begin("espwebserver")) {
Serial.println("MDNS responder je zapnuty.");
}
// nastavení vytištění hlavní zprávy po přístupu
// na samotnou IP adresu
server.on("/", zpravaHlavni);
// pokud chceme vytisknout pouze menší zprávy, není
// nutné je vytvářet v podprogramech jako zpravaHlavni,
// viz. ukázka níže
// nastavení vytištění jiné zprávy po přístupu na
// podstránku ukazka, tedy např. 10.0.0.31/ukazka
server.on("/ukazka", []() {
String zprava = "Ukazka odkazu pro vice stranek.";
server.send(200, "text/plain", zprava);
});
// nastavení stavu LED diody na zapnuto
server.on("/ledON", []() {
// zapnutí LED diody
digitalWrite(LEDka, HIGH);
Serial.println("Zapni LED.");
// vytištění hlavní stránky
zpravaHlavni();
});
// nastavení stavu LED diody na vypnuto
server.on("/ledOFF", []() {
// vypnutí LED diody
digitalWrite(LEDka, LOW);
Serial.println("Vypni LED.");
// vytištění hlavní stránky
zpravaHlavni();
});
// nastavení vytištění informací o neznámém
// odkazu pomocí podprogramu zpravaNeznamy
server.onNotFound(zpravaNeznamy);
// zahájení aktivity HTTP serveru
server.begin();
Serial.println("HTTP server je zapnuty.");
}
void loop() {
Serial.print("Funguji jiz: ");
Serial.print(millis());
Serial.println("milisekund.");
Serial.println(WiFi.localIP());
Serial.println();
Serial.print("MAC: ");
Serial.println(WiFi.macAddress());
delay(5000); //červené můžete smazat, ale mě se líbí informace navíc
// pravidelné volání detekce klienta,
// v případě otevření stránky se provedou
// funkce nastavené výše
server.handleClient();
// krátká pauza před novým během smyčky
delay(10);
}
6) No, nahrajte do Arduino. Pokud to na poprvé nejde zkuste za pár vteřin znovu (bez resetu nebo znovu připojení
7) Odpojte od PC a přepínač 7 dejte na OFF (5,6 jsou jediné na ON)
8) Připojte k PC a spuste SERIOVÝ MONITOR
9) Kochejte se, jak to funguje. Trvá to tak 20 sec než se začne něco objevovat.
Příklad výpisu
09:52:49.214 -> Funguji jiz: 5649milisekund.
09:52:49.214 -> 192.168.1.xxx
09:52:49.248 ->
09:52:49.248 -> MAC: 2C:F4:32:4C:xx:xx
09:52:54.244 -> Funguji jiz: 10660milisekund.
09:52:54.244 -> 192.168.1.xx
09:52:54.279 ->
09:52:54.279 -> MAC: 2C:F4:32:4C:xx:xx
09:52:59.244 -> Funguji jiz: 15671milisekund.
09:52:59.244 -> 192.168.1.xxx
10) Do prohlížeče v PC, které je připojené ke stejné síti zadejte IP adresu, kterou vidíte 192.168.1.xx. Čumíte co? Jste na webserveru Vašeho Arduina. Je tam program na blikání ledky. Chete to vidět?
11) Ledku jsme definovali na kanál 16, takže stačí ledku napojit na kanál 16 u ESP8266. Otočte desku a uvidíte jak jsou popsané jeho kanály.
GND je mínus, kanál 16 je plus
12) připojte nějakou ledku, která snese cca 3,5V. Já jsem použil ledku na 2,4V a k tomu spočítaný odpor pro 4,2V a svítila akorát. Takže se toho nebojte.
Proč potřebujete ledku a nepoužijeme tu, co je na desce? Protože tu má jen Arduino ne ESP8266 se kterým se teď hrajeme. V některých verzích ji má, ale v této integrované ne.
13) MAC adresa Arduina se vám hodí, pokud chcete na vašem routeru nastavit jakou IP má pokaždé dostat. Jinak nemáte garantováno, že za půl roku váš router arduinu nepřidělí jinou IP a budete se divit, proč nefunguje.