M5Stack ATOM S3 on kompakti ja monipuolinen mikrokontrolleriyksikkö, erityisen hyödyllinen esineiden internet (IoT) -projekteissa. Yhdistämällä se Ethernet-moduuliin avautuu mahdollisuuksien maailma verkkoon kytketyille sovelluksille. Tämä artikkeli tarjoaa kattavan oppaan yksinkertaisen web-palvelimen rakentamiseen M5Stack ATOM S3:lla käyttäen Ethernet-moduulia, selittäen koodin yksityiskohtaisesti ja tutkien mahdollisia parannuksia.
Laitteistovaatimukset:
-
M5Stack ATOM S3
-
M5Stack Ethernet -moduuli (tai yhteensopiva)
-
USB Type-C -kaapeli ohjelmointiin
-
Ethernet-kaapeli verkkoyhteyttä varten
Ohjelmistovaatimukset:
-
Arduino IDE (ESP32-lautatuki mukana)
-
M5Stack-kirjasto ATOM S3:lle
#include "M5AtomS3.h" #include#include #define SCK 5 #define MISO 7 #define MOSI 8 #define CS 6 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x99}; // MAC-osoite (usein DHCP:n ylikirjoittama) IPAddress ip(192, 168, 1, 177); // Staattinen IP-osoite (ei käytössä tässä DHCP-esimerkissä) EthernetServer server(80); // Luo palvelinobjekti porttiin 80 (HTTP) void setup() { auto cfg = M5.config(); AtomS3.begin(cfg); AtomS3.Display.setTextColor(GREEN); AtomS3.Display.setTextDatum(middle_center); AtomS3.Display.setFont(&fonts::Orbitron_Light_24); AtomS3.Display.setTextSize(1); SPI.begin(SCK, MISO, MOSI, -1); // Alusta SPI-yhteys Ethernetille Ethernet.init(CS); // Alusta Ethernet-piiri CS-nastalla AtomS3.Display.drawString("Alustetaan...", AtomS3.Display.width() / 2, 60); while (Ethernet.begin(mac) != 1) { // Yritä saada IP-osoite DHCP:n kautta Serial.println("Virhe IP-osoitteen hakemisessa DHCP:n kautta, yritetään uudelleen..."); delay(1000); } // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet-laajennuslevyä ei löytynyt. Valitettavasti ei voi toimia ilman laitteistoa. :("); while (true) { delay(1); // älä tee mitään, ei ole järkeä ajaa ilman Ethernet-laitteistoa } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet-kaapeli ei ole kytketty."); } server.begin(); // Käynnistä palvelin Serial.print("palvelin on osoitteessa "); Serial.println(Ethernet.localIP()); // Tulosta määritetty IP-osoite AtomS3.Display.setTextSize(0.5); AtomS3.Display.clear(); AtomS3.Display.drawString(Ethernet.localIP().toString().c_str(), AtomS3.Display.width() / 2, 60); // Näytä IP näytöllä } void loop() { EthernetClient client = server.available(); // Tarkista uusi asiakasyhteys if (client) { // Jos asiakas on yhteydessä Serial.println("uusi asiakas"); boolean currentLineIsBlank = true; kun (client.connected()) { // Kun asiakas on vielä yhteydessä if (client.available()) { // Jos asiakkaalta on saapunut dataa char c = client.read(); // Lue merkki asiakkaalta Serial.write(c); // Tulosta merkki sarjamonitoriin if (c == '\n' && currentLineIsBlank) { // Tarkista HTTP-pyynnön loppu // Send HTTP response client.println("HTTP/1.1 200 OK"); client.println("Sisältötyyppi: text/html"); client.println("Yhteys: sulje"); client.println("Päivitä: 5"); // Päivitä sivu 5 sekunnin välein client.println(); // Tyhjä rivi otsikon lopun merkiksi client.println(""); client.println(""); client.print("Hei M5Stack LAN -moduuli!"); client.println(""); break; // Poistu sisemmästä while-silmukasta (pyyntö käsitelty) } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); client.stop(); // Sulje asiakasyhteys Serial.println("client disconnected"); } }
✔ Kopioitu!
Yksityiskohtainen selitys:
- Kirjastot: Koodi alkaa tarvittavien kirjastojen sisällyttämisellä: M5AtomS3.h ATOM S3:lle, SPI.h SPI-yhteydelle (käytetään Ethernet-moduulissa) ja M5_Ethernet.h Ethernet-toiminnallisuudelle.
- Määritelmät: #define-lauseet määrittelevät Ethernet-moduulin käyttämät SPI-nastat. Nämä ovat olennaisia oikealle tiedonsiirrolle.
- MAC-osoite: byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x99}; määrittelee MAC-osoitteen. Vaikka se on mukana, DHCP-palvelin usein korvaa sen, kun laite yhdistyy verkkoon.
- IP-osoite: IPAddress ip(192, 168, 1, 177); määrittelee staattisen IP-osoitteen. Tässä esimerkissä kuitenkin käytetään DHCP:tä, joten tätä staattista IP-osoitetta ei oikeasti anneta laitteelle. Se on paikkamerkki.
- Ethernet-palvelin: EthernetServer server(80); luo EthernetServer-luokan instanssin, joka kuuntelee saapuvia yhteyksiä portissa 80 (standardi HTTP-portti).
- set up() -funktio:
- auto cfg = M5.config(); AtomS3.begin(cfg);: Alustaa M5 ATOM S3 -laitteiston.
-
Seuraavat rivit konfiguroivat näytön tekstin näyttämistä varten: asetetaan väri, tasaus, fontti ja koko.
-
SPI.begin(SCK, MISO, MOSI, -1); alustaa SPI-yhteyden määriteltyjen nastojen avulla. -1 tarkoittaa, että SPI-kirjasto ei hallinnoi mitään tiettyä chip select -nastaa.
-
Ethernet.init(CS); alustaa Ethernet-sirun käyttämällä määriteltyä chip select (CS) -nastaa.
-
AtomS3.Display.drawString("Init...", AtomS3.Display.width() / 2, 60); näyttää "Init..." ATOM S3:n näytöllä osoittaakseen, että alustaminen on käynnissä.
-
while (Ethernet.begin(mac) != 1) -silmukka yrittää saada IP-osoitteen DHCP:n kautta. Se yrittää uudelleen joka sekunti, kunnes kelvollinen IP saadaan. Tässä ATOM S3 saa verkkotunnuksensa.
-
Koodi tarkistaa sitten, onko Ethernet-laitteisto paikalla ja onko linkki (kaapeliyhteys) muodostettu. Jos ei, ohjelma pysähtyy. Tämä on tärkeää luotettavan toiminnan kannalta.
-
server.begin(); käynnistää Ethernet-palvelimen, jolloin se on valmis vastaanottamaan saapuvia yhteyksiä.
-
Määritetty IP-osoite (saatu DHCP:n kautta) tulostetaan Serial Monitoriin ja näytetään ATOM S3:n näytöllä.
7. loop()
funktio:
- EthernetClient client = server.available(); tarkistaa, onko mikään asiakas yhdistänyt palvelimeen. server.available() palauttaa EthernetClient-olion, jos asiakas on saatavilla, tai null, jos ei ole.
- if (client) -lohko suoritetaan, jos asiakas on yhteydessä.
- boolean currentLineIsBlank = true; on lippu, jota käytetään HTTP-pyynnön lopun havaitsemiseen.
- while (client.connected()) -silmukka jatkuu niin kauan kuin asiakas on yhteydessä.
- if (client.available()) tarkistaa, onko asiakas lähettänyt dataa.
- char c = client.read(); lukee yhden merkin asiakkaan pyynnöstä.
- Serial.write(c); tulostaa vastaanotetun merkin Serial Monitoriin virheenkorjausta varten.
- Koodi jäsentää sitten HTTP-pyynnön. Ehto if (c == '\n' && currentLineIsBlank) tarkistaa HTTP-pyynnön lopun. Tyhjä rivi (\n\r\n tai \n\n) merkitsee tyypillisesti otsikoiden loppua.
Jos pyynnön loppu havaitaan, palvelin lähettää HTTP-vastauksen:
-
HTTP/1.1 200 OK
: Vakio HTTP-vastaus, joka ilmaisee onnistumisen. *Content-Type: text/html
: Määrittää, että vastausrungon sisältö on HTML:ää. *Connection: close
: Ilmoittaa asiakkaalle, että yhteys suljetaan vastauksen lähettämisen jälkeen. Tämä on yksinkertainen lähestymistapa; pysyviä yhteyksiä voitaisiin käyttää tehokkaampaan viestintään. *Refresh: 5
: Tämä otsake ohjaa selainta päivittämään sivun 5 sekunnin välein. Tämä luo dynaamisen efektin. * Tyhjä rivi (client.println();
) on ratkaisevan tärkeä; se erottaa HTTP-otsikot varsinaisesta sisällöstä. * HTML-sisältö lähetetään sitten:
. Tämä on yksinkertainen HTML, joka näytetään selaimessa. *Hello M5Stack LAN Module!
break;
poistuu sisemmästäwhile (client.connected())
-silmukasta, koska vastaus on lähetetty. * Koodi käsittelee sitten logiikan HTTP-pyynnön lopun havaitsemiseksi.if (c == '\n')
tarkistaa rivinvaihtomerkin, joka ilmaisee uuden rivin alun pyynnössä.currentLineIsBlank
asetetaantrue
, kun rivinvaihto havaitaan.else if (c != '\r')
tarkistaa, ettei merkki ole rivinvaihtokaraktääri (carriage return). Jos se ei ole, se tarkoittaa, että nykyisellä rivillä on dataa, jotencurrentLineIsBlank
asetetaanfalse
. Tämä logiikka havaitsee tehokkaasti tyhjän rivin, joka merkitsee HTTP-otsikoiden loppua. *delay(1);
antaa pienen viiveen, jolloin selain ehtii käsitellä vastaanotetut tiedot. *client.stop();
sulkee yhteyden asiakkaaseen. *Serial.println("client disconnected");
tulostaa viestin Sarjamonitoriin, joka ilmoittaa asiakkaan katkaisseen yhteyden.
Parannukset ja Jatkuva Kehitys:
-
Dynaaminen Sisältö: Nykyinen HTML on staattista. Voit luoda dynaamista sisältöä käyttämällä muuttujia ja logiikkaa Arduino-koodissasi. Esimerkiksi voit näyttää anturilukemia, ohjata toimilaitteita tai näyttää nykyisen ajan.
-
Eri Pyyntöjen Käsittely: Koodi vastaa tällä hetkellä kaikkiin pyyntöihin samalla HTML-sisällöllä. Voit toteuttaa logiikkaa eri HTTP-menetelmien (GET, POST jne.) ja eri URL-osoitteiden käsittelemiseksi, jolloin voit luoda monimutkaisemman verkkokäyttöliittymän.
-
HTML Lomakkeet ja Käyttäjän Syöte: Lisää HTML-lomakkeita verkkosivullesi, jotta käyttäjät voivat syöttää tietoja. Voit sitten käsitellä näitä tietoja ATOM S3:ssa ja käyttää niitä laitteidesi ohjaukseen.
-
WebSockets: Reaaliaikaiseen viestintään harkitse WebSocketsin käyttöä HTTP:n sijaan. WebSockets mahdollistavat kaksisuuntaisen viestinnän asiakkaan ja palvelimen välillä, mikä on olennaista interaktiivisissa sovelluksissa.
-
Tietoturva: Tuotantoympäristöissä tietoturva on ratkaisevan tärkeää. Toteuta todennus- ja valtuutusmekanismit suojataksesi laitteesi ja tietosi.
-
Tiedostojärjestelmän integrointi: Tallenna HTML-, CSS- ja JavaScript-tiedostot SD-kortille tai flash-muistiin ja tarjoa ne ATOM S3:sta. Tämä mahdollistaa kehittyneempien web-käyttöliittymien luomisen.
-
AJAX ja JavaScript: Käytä AJAX:ia (Asynchronous JavaScript and XML) päivittääksesi verkkosivun osia dynaamisesti ilman, että koko sivua tarvitsee ladata uudelleen. Tämä parantaa käyttökokemusta.
-
mDNS (Monilähete DNS): Käytä mDNS:ää antaaksesi ATOM S3:lle ihmisen luettavissa olevan nimen paikallisverkossa, mikä helpottaa sen käyttämistä.
-
Virheenkäsittely: Toteuta vankka virheenkäsittely hallitaksesi sujuvasti tilanteita, kuten verkkoyhteyksien katkeamisia tai virheellisiä käyttäjän syötteitä.
-
OTA (Over-The-Air) -päivitykset: Toteuta OTA-päivitykset, jotta voit päivittää ATOM S3:n laiteohjelmiston etänä.
Vianmääritys:
-
Ei IP-osoitetta: Tarkista verkkoyhteytesi, varmista, että DHCP on käytössä reitittimessäsi, ja varmista, että Ethernet-moduuli on kunnolla kytketty ATOM S3:een.
-
Yhteyttä ei voi muodostaa: Tarkista ATOM S3:n IP-osoite, varmista, että se on samassa verkossa tietokoneesi kanssa, ja varmista, ettei palomuureja ole estämässä yhteyttä.
-
Serial Monitorin ongelmat: Varmista, että Serial Monitorin baudinopeus vastaa koodissasi käytettyä baudinopeutta (yleensä 115200).
Tämä laajennettu selitys tarjoaa perusteellisemman ymmärryksen koodista ja tarjoaa lähtökohdan kehittyneempien web-palvelinsovellusten kehittämiseen M5Stack ATOM S3:lla. Muista tutustua M5Stackin dokumentaatioon ja muihin verkkolähteisiin saadaksesi yksityiskohtaisempaa tietoa ja esimerkkejä.