M5Stack ATOM S3 je kompaktní a všestranná mikrokontrolérová jednotka, která je zvláště užitečná pro projekty Internetu věcí (IoT). Kombinace s ethernetovým modulem otevírá svět možností pro síťově připojené aplikace. Tento článek poskytuje komplexního průvodce, jak postavit jednoduchý webový server na M5Stack ATOM S3 pomocí ethernetového modulu, podrobně vysvětluje kód a zkoumá možné vylepšení.
Požadavky na hardware:
-
M5Stack ATOM S3
-
M5Stack Ethernet modul (nebo kompatibilní)
-
Kabel USB Type-C pro programování
-
Ethernetový kabel pro síťové připojení
Požadavky na software:
-
Arduino IDE (s podporou desky ESP32)
-
Knihovna M5Stack pro ATOM S3
#include "M5AtomS3.h" #include#include #definovat SCK5 #definovat MISO 7 #definice MOSI 8 #definice CS 6 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x99}; // MAC adresa (často přepsána DHCP) IPAddress ip(192, 168, 1, 177); // Statická IP adresa (nepoužívá se v tomto příkladu s povoleným DHCP) EthernetServer server(80); // Vytvořit objekt serveru na portu 80 (HTTP) void setup() { auto cfg = M5.config(); AtomS3.begin(cfg); AtomS3.Display.setTextColor(ZELENÁ); AtomS3.Display.setTextDatum(střed_střed); AtomS3.Display.setFont(&fonts::Orbitron_Light_24); AtomS3.Display.setTextSize(1); SPI.begin(SCK, MISO, MOSI, -1); // Inicializace SPI komunikace pro Ethernet Ethernet.init(CS); // Inicializujte Ethernetový čip s pinem CS AtomS3.Display.drawString("Inicializace...", AtomS3.Display.width() / 2, 60); while (Ethernet.begin(mac) != 1) { // Pokus o získání IP adresy přes DHCP Serial.println("Chyba při získávání IP adresy přes DHCP, zkouším znovu..."); zpoždění(1000); } // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernetový štít nebyl nalezen. Promiňte, bez hardwaru to nejde. :("); zatímco (true) { delay(1); // nedělej nic, nemá smysl spouštět bez Ethernet hardwaru } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernetový kabel není připojen."); } server.begin(); // Spustit server Serial.print("server je na "); Serial.println(Ethernet.localIP()); // Vytiskne přiřazenou IP adresu AtomS3.Display.setTextSize(0.5); AtomS3.Display.clear(); AtomS3.Display.drawString(Ethernet.localIP().toString().c_str(), AtomS3.Display.width() / 2, 60); // Zobrazit IP na obrazovce } void loop() { EthernetClient client = server.available(); // Zkontrolujte nové připojení klienta if (client) { // Pokud je klient připojen Serial.println("nový klient"); boolean currentLineIsBlank = true; while (client.connected()) { // Dokud je klient stále připojen if (client.available()) { // Pokud klient odeslal data char c = client.read(); // Přečíst znak od klienta Serial.write(c); // Vytiskne znak do sériového monitoru if (c == '\n' && currentLineIsBlank) { // Kontrola konce HTTP požadavku // Send HTTP response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Připojení: zavřít"); client.println("Obnovit: 5"); // Obnovit stránku každých 5 sekund client.println(); // Prázdný řádek pro signalizaci konce hlavičky klient.println(""); client.println(""); client.print("Ahoj M5Stack LAN modul!"); klient.println(""); break; // Ukončit vnitřní smyčku while (požadavek zpracován) } pokud (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } zpoždění(1); client.stop(); // Zavřít připojení klienta Serial.println("klient odpojen"); } }
✔ Zkopírováno!
Podrobný výklad:
- Zahrnuje: Kód začíná zahrnutím potřebných knihoven: M5AtomS3.h pro ATOM S3, SPI.h pro SPI komunikaci (používanou modulem Ethernet) a M5_Ethernet.h pro funkčnost Ethernetu.
- Definuje: Příkazy #define definují piny SPI používané modulem Ethernet. Tyto jsou klíčové pro správnou komunikaci.
- MAC adresa: byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x99}; deklaruje MAC adresu. I když je zahrnuta, často ji přepisuje DHCP server, když se zařízení připojí k síti.
- IP adresa: IPAddress ip(192, 168, 1, 177); definuje statickou IP adresu. Nicméně v tomto příkladu je použito DHCP, takže tato statická IP adresa není zařízení skutečně přiřazena. Je to zástupný symbol.
- Ethernet Server: EthernetServer server(80); vytváří instanci třídy EthernetServer, která naslouchá příchozím připojením na portu 80 (standardní HTTP port).
- Funkce set up():
- auto cfg = M5.config(); AtomS3.begin(cfg);: Inicializuje hardware M5 ATOM S3.
-
Následující řádky konfigurují zobrazení pro výstup textu: nastavení barvy, zarovnání, písma a velikosti.
-
SPI.begin(SCK, MISO, MOSI, -1); inicializuje SPI komunikaci pomocí definovaných pinů. Hodnota -1 znamená, že žádný konkrétní pin pro výběr čipu není spravován samotnou knihovnou SPI.
-
Ethernet.init(CS); inicializuje Ethernetový čip pomocí specifikovaného pinu pro výběr čipu (CS).
-
AtomS3.Display.drawString("Init...", AtomS3.Display.width() / 2, 60); zobrazuje na obrazovce ATOM S3 "Init..." pro indikaci probíhající inicializace.
-
Smyčka while (Ethernet.begin(mac) != 1) se pokouší získat IP adresu přes DHCP. Pokračuje v opakování každou sekundu, dokud není přijata platná IP adresa. Zde získává ATOM S3 svou síťovou adresu.
-
Kód poté kontroluje, zda je přítomen hardware Ethernetu a zda je navázáno spojení (kabelové připojení). Pokud ne, program se zastaví. To je důležité pro spolehlivý provoz.
-
server.begin(); spustí Ethernet server, čímž jej připraví na přijímání příchozích připojení.
-
Přiřazená IP adresa (získaná přes DHCP) je vytištěna v sériovém monitoru a zobrazena na obrazovce ATOM S3.
7. smyčka()
funkce:
- EthernetClient client = server.available(); kontroluje, zda se k serveru připojil nějaký klient. server.available() vrací objekt EthernetClient, pokud je klient k dispozici, nebo null, pokud není.
- Blok if (client) se vykoná, pokud je klient připojen.
- boolean currentLineIsBlank = true; je příznak používaný k detekci konce HTTP požadavku.
- Smyčka while (client.connected()) pokračuje, dokud je klient připojen.
- if (client.available()) kontroluje, zda klient odeslal nějaká data.
- char c = client.read(); čte jeden znak z požadavku klienta.
- Serial.write(c); vypíše přijatý znak do Serial Monitoru pro ladění.
- Kód poté analyzuje HTTP požadavek. Podmínka if (c == '\n' && currentLineIsBlank) kontroluje konec HTTP požadavku. Prázdný řádek (\n\r\n nebo \n\n) obvykle znamená konec hlaviček.
Pokud je detekován konec požadavku, server odešle HTTP odpověď:
-
HTTP/1.1 200 OK
: Standardní HTTP odpověď indikující úspěch. *Content-Type: text/html
: Určuje, že tělo odpovědi je HTML. *Connection: close
: Říká klientovi, že spojení bude po odeslání odpovědi uzavřeno. Toto je jednoduchý přístup; pro efektivnější komunikaci by bylo možné použít trvalá spojení. *Refresh: 5
: Tento hlavičkový údaj instruuje prohlížeč, aby obnovoval stránku každých 5 sekund. To vytváří dynamický efekt. * Prázdný řádek (client.println();
) je zásadní; odděluje HTTP hlavičky od skutečného obsahu. * HTML obsah je pak odeslán:
. Toto je jednoduché HTML, které bude zobrazeno v prohlížeči. *Hello M5Stack LAN Module!
break;
ukončuje vnitřní smyčkuwhile (client.connected())
, protože odpověď byla odeslána. * Kód pak řeší logiku detekce konce HTTP požadavku.if (c == ' ')
kontroluje znak nového řádku, což značí začátek nového řádku v požadavku.currentLineIsBlank
je nastaveno natrue
, když je detekován nový řádek.else if (c != ' ')
kontroluje, zda znak není návrat vozíku. Pokud to není návrat vozíku, znamená to, že na aktuálním řádku jsou data, takžecurrentLineIsBlank
je nastaveno nafalse
. Tato logika efektivně detekuje prázdný řádek, který signalizuje konec HTTP hlaviček. *delay(1);
poskytuje krátké zpoždění, které dává prohlížeči čas zpracovat přijatá data. *client.stop();
uzavírá spojení s klientem. *Serial.println("client disconnected");
vypisuje zprávu do Serial Monitoru, která indikuje, že klient se odpojil.
Vylepšení a další rozvoj:
-
Dynamický obsah: Aktuální HTML je statické. Můžete generovat dynamický obsah pomocí proměnných a logiky ve vašem Arduino kódu. Například můžete zobrazit hodnoty ze senzorů, ovládat akční členy nebo zobrazit aktuální čas.
-
Zpracování různých požadavků: Kód v současné době odpovídá na jakýkoli požadavek stejným HTML. Můžete implementovat logiku pro zpracování různých HTTP metod (GET, POST atd.) a různých URL, což vám umožní vytvořit složitější webové rozhraní.
-
HTML formuláře a uživatelský vstup: Přidejte na svou webovou stránku HTML formuláře, aby uživatelé mohli zadávat data. Tato data pak můžete zpracovat na ATOM S3 a použít je k ovládání svých zařízení.
-
WebSockets: Pro komunikaci v reálném čase zvažte použití WebSockets místo HTTP. WebSockets umožňují obousměrnou komunikaci mezi klientem a serverem, což je nezbytné pro interaktivní aplikace.
-
Bezpečnost: Pro produkční prostředí je bezpečnost zásadní. Implementujte mechanismy ověřování a autorizace k ochraně vašeho zařízení a dat.
-
Integrace systému souborů: Ukládejte soubory HTML, CSS a JavaScript na SD kartu nebo flash paměť a podávejte je z ATOM S3. To vám umožní vytvářet sofistikovanější webová rozhraní.
-
AJAX a JavaScript: Použijte AJAX (Asynchronní JavaScript a XML) k dynamické aktualizaci částí webové stránky bez nutnosti úplného obnovení stránky. To zlepšuje uživatelský zážitek.
-
mDNS (Multicast DNS): Použijte mDNS k přiřazení čitelnějšího názvu vašemu ATOM S3 v místní síti, což usnadní přístup.
-
Zpracování chyb: Implementujte robustní zpracování chyb pro elegantní řešení situací, jako jsou výpadky sítě nebo neplatné uživatelské vstupy.
-
OTA (Over-The-Air) aktualizace: Implementujte OTA aktualizace, které vám umožní vzdáleně aktualizovat firmware vašeho ATOM S3.
Řešení problémů:
-
Žádná IP adresa: Zkontrolujte své síťové připojení, ujistěte se, že je na vašem routeru povolen DHCP, a ověřte, že je Ethernetový modul správně připojen k ATOM S3.
-
Nelze se připojit: Dvakrát zkontrolujte IP adresu ATOM S3, ujistěte se, že je ve stejné síti jako váš počítač, a ověřte, že žádné firewally neblokují připojení.
-
Problémy s monitorováním sériové linky: Ujistěte se, že rychlost přenosu v monitoru sériové linky odpovídá rychlosti přenosu použité ve vašem kódu (obvykle 115200).
Toto rozšířené vysvětlení poskytuje podrobnější pochopení kódu a nabízí výchozí bod pro vývoj pokročilejších webových serverových aplikací na M5Stack ATOM S3. Nezapomeňte konzultovat dokumentaci M5Stack a další online zdroje pro podrobnější informace a příklady.