Vytvoření jednoduchého webového serveru s M5Stack ATOM S3 a ATOMIC PoE W5500

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í
M5Stack ATOMIC PoE základna W5500

M5Stack ATOMIC PoE základna W5500

Zobrazit produkt
M5Stack ATOMS3

M5Stack ATOMS3

Zobrazit produkt

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:

  1. 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.
  1. Definuje: Příkazy #define definují piny SPI používané modulem Ethernet. Tyto jsou klíčové pro správnou komunikaci.
  1. 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.
  1. 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.
  1. Ethernet Server: EthernetServer server(80); vytváří instanci třídy EthernetServer, která naslouchá příchozím připojením na portu 80 (standardní HTTP port).
  2. 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:

    Hello M5Stack LAN Module!

    . Toto je jednoduché HTML, které bude zobrazeno v prohlížeči. * break; ukončuje vnitřní smyčku while (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 na true, 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že currentLineIsBlank je nastaveno na false. 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.

Zanechte komentář

Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena *

Přihlaste se k odběru našeho newsletteru

Získejte nejnovější informace o našich produktech a speciálních nabídkách.