Výběr LAN modulu

Odpovědět
Axamith
Příspěvky: 540
Registrován: 09 srp 2017, 08:17
Kontaktovat uživatele:

Výběr LAN modulu

Příspěvek od Axamith » 06 led 2026, 18:14

Vybírám LAN modul pro komunikaci AVR s SQL a HTML.
Do SQL ukládat hodnoty teplot (cca 1x za 15 min)
HTML zobrazovat stavy relé a teplot.

S LAN moduly zkušenost nula.
Co jsem procházel, používají různé čipy

W5500
Síťový ethernetový modul W5500 pro Arduino
Mikro Ethernet modul W5500

ENC28J60
Ethernet LAN modul ENC28J60

Je mezi nimi nějaký zásadní rozdíl? Jediné, co jsem dohledal, tak s čipem ENC28J60 je údajně náročnější na paměť.
Můžete prosím poradit nejlépe z vlastní zkušenosti?

Uživatelský avatar
Caster
Příspěvky: 486
Registrován: 11 zář 2019, 09:02

Re: Výběr LAN modulu

Příspěvek od Caster » 06 led 2026, 18:42

Vyber W5500: Konkrétně ten mikro modul z Laskakitu (druhý odkaz) vypadá kompaktnější (55x28 mm) a je explicitně kompatibilní s AVR deskami. Má 5V tolerantní I/O, takže se hodí k 5V AVR bez level shifteru. První modul z Dratku je podobný, ale možná větší.

Jak začít: Použij Arduino IDE s knihovnou Ethernet2 (pro W5500). Pro odesílání do SQL: AVR pošle HTTP POST na tvůj server (např. PHP script, který vloží data do MySQL). Pro HTML: Implementuj jednoduchý web server na AVR, který vrací stránku s daty (použij knihovnu pro JSON nebo plain HTML). Testuj na ATMega2560, pokud máš, protože má víc paměti než 328.

Tipy z praxe: Pokud budeš mít problémy s pamětí, sleduj volnou RAM pomocí funkce freeMemory(). Pro teploty každých 15 min stačí wake-up timer na AVR, aby šetřil energii. A pokud chceš něco ještě snadnějšího, zvaž ESP8266/ESP32 (s WiFi), ale ty jsi specifikoval LAN a AVR.

P.S.
W5500 (první dva moduly): To je modernější čip od Wiznet s hardwarem vestavěným TCP/IP stackem (podporuje TCP, UDP, ICMP, IPv4 atd. přímo v čipu). AVR ho ovládá přes SPI, ale čip se stará o většinu síťové logiky sám.

Nároky na paměť: Mnohem nižší – knihovny (jako Ethernet2 pro Arduino) zaberou jen kolem 0.5-1 kB RAM, protože čip má vlastní 32 kB buffer pro TX/RX. To je ideální pro AVR, kde je paměť limitující faktor.

Výhody: Snadnější použití – rychlejší setup, lepší výkon (až 100 Mbps, ale reálně 10-20 Mbps), nižší spotřeba CPU na AVR. Podporuje až 8 souběžných socketů, což je super pro kombinaci klienta (odesílání do SQL) a serveru (HTML). Komunita ho chválí pro stabilitu v IoT projektech. Funguje i v širším teplotním rozsahu (-40°C až 85°C), což může být plus pro venkovní aplikace.

Nevýhody: Dražší (kolem 200-400 Kč), ale za tu cenu dostaneš víc funkcí. Spotřeba je podobná (kolem 150-180 mA).

Když uvedeš jaký máš konkrétní MCU, doplním sem kód programu ;) .

Axamith
Příspěvky: 540
Registrován: 09 srp 2017, 08:17
Kontaktovat uživatele:

Re: Výběr LAN modulu

Příspěvek od Axamith » 06 led 2026, 19:04

Skvěle zpracovaná odpověď, moc děkuji.
Mikro modul s W5500 je mi sympatický svou kompaktností, PCB se dost plní a moc místa už nemám.
Napájet z 3,3V výstupu desky, logika na 5V bez převodníku se mi líbí.
Pojede to na Mini Arduino MEGA 2560 CH340G ATMEGA2560-16AU
Kód (zatím) nepotřebuji, jsem ve fázi návrhu PCB, pokud se budu trápit s LAN komunikací, připomenu se.
Ještě jednou díky.

Uživatelský avatar
Caster
Příspěvky: 486
Registrován: 11 zář 2019, 09:02

Re: Výběr LAN modulu

Příspěvek od Caster » 06 led 2026, 20:47

V pohodě ;-). Jsem rád, když ti to pomůže.

Kód
  • Měří teplotu (příklad s DS18B20 senzorem na pinu 7 – snadno změníš na DHT22 nebo jiný)
  • Každých ~15 minut odešle teplotu do MySQL databáze přes HTTP POST na tvůj PHP server
  • Hostuje jednoduchý web server na portu 80, kde zobrazuje aktuální teplotu a stav 2 relé (ovládání tlačítky ON/OFF)
  • Relé na pinech 8 a 9 (s aktivním LOW – běžné relé moduly)
Zapojení W5500 modulu k Mega 2560
Standardní SPI piny na Mega:
MOSI → pin 51
MISO → pin 50
SCK → pin 52
CS/SS → pin 10 (doporučené, můžeš změnit)
VCC → 5V (nebo 3.3V podle modulu)
GND → GND

Potřebné knihovny (nainstaluj přes Arduino IDE → Správce knihoven)
  • Ethernet (oficiální, od Arduino – podporuje W5500 přímo)
  • OneWire (pro DS18B20)
  • DallasTemperature (pro DS18B20)
Arduino kód:

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// --- Nastavení sítě ---
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  // Změň na unikátní, pokud máš víc zařízení
IPAddress ip(192, 168, 1, 177);                    // Statická IP tvého AVR v síti
EthernetServer server(80);                         // Web server na portu 80

// --- Teplota (DS18B20) ---
#define ONE_WIRE_BUS 7                             // Pin pro DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperature = 0.0;

// --- Relé ---
const int relay1 = 8;                              // Relé 1
const int relay2 = 9;                              // Relé 2
bool relay1State = false;
bool relay2State = false;

// --- Odesílání do SQL ---
const char* serverSQL = "tvojdomena.cz";            // Domena nebo IP tvého webserveru
const String phpScript = "/cesta/k/insert.php";     // Cesta k PHP skriptu
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 15UL * 60UL * 1000UL;  // 15 minut

void setup() {
  Serial.begin(9600);
  
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  digitalWrite(relay1, HIGH);  // Relé OFF (aktivní LOW)
  digitalWrite(relay2, HIGH);
  
  sensors.begin();
  
  // Start Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Server běží na IP: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Načti teplotu
  sensors.requestTemperatures();
  temperature = sensors.getTempCByIndex(0);
  
  // Odeslání do SQL každých 15 min
  if (millis() - lastSendTime >= sendInterval) {
    sendToSQL(temperature);
    lastSendTime = millis();
  }
  
  // Web server
  EthernetClient client = server.available();
  if (client) {
    String request = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        request += c;
        if (c == '\n') {
          // Zpracuj požadavek
          if (request.indexOf("GET /?relay1=ON") > -1) relay1State = true;
          if (request.indexOf("GET /?relay1=OFF") > -1) relay1State = false;
          if (request.indexOf("GET /?relay2=ON") > -1) relay2State = true;
          if (request.indexOf("GET /?relay2=OFF") > -1) relay2State = false;
          
          digitalWrite(relay1, relay1State ? LOW : HIGH);
          digitalWrite(relay2, relay2State ? LOW : HIGH);
          
          // Odešli HTML stránku
          sendHTML(client);
          break;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

void sendHTML(EthernetClient client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html><head><meta charset=\"UTF-8\"><title>AVR Monitor</title>");
  client.println("<meta http-equiv=\"refresh\" content=\"30\"></head>");  // Auto refresh každých 30s
  client.println("<body><h1>Stav systému</h1>");
  client.print("<p>Teplota: ");
  client.print(temperature);
  client.println(" &deg;C</p>");
  
  client.println("<h2>Relé 1</h2>");
  client.print("<p>Stav: "); client.println(relay1State ? "ZAPNUTO" : "VYPNUTO"); client.println("</p>");
  client.println("<a href=\"/?relay1=ON\"><button>ZAPNOUT</button></a> ");
  client.println("<a href=\"/?relay1=OFF\"><button>VYPNOUT</button></a>");
  
  client.println("<h2>Relé 2</h2>");
  client.print("<p>Stav: "); client.println(relay2State ? "ZAPNUTO" : "VYPNUTO"); client.println("</p>");
  client.println("<a href=\"/?relay2=ON\"><button>ZAPNOUT</button></a> ");
  client.println("<a href=\"/?relay2=OFF\"><button>VYPNOUT</button></a>");
  
  client.println("</body></html>");
}

void sendToSQL(float temp) {
  EthernetClient client;
  if (client.connect(serverSQL, 80)) {
    client.println("POST " + phpScript + " HTTP/1.1");
    client.println("Host: " + String(serverSQL));
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    String data = "temp=" + String(temp);
    client.println(data.length());
    client.println();
    client.print(data);
    client.stop();
    Serial.println("Data odeslána do SQL");
  } else {
    Serial.println("Chyba připojení k serveru");
  }
}
PHP skript (insert.php) na tvém serveru
Ulož na webserver (např. do složky, kde máš MySQL):

Kód: Vybrat vše

<?php
$servername = "localhost";
$username = "uzivatel";
$password = "heslo";
$dbname = "databaze";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) die("Connection failed");

$temp = floatval($_POST['temp']);
$sql = "INSERT INTO teploty (teplota, cas) VALUES ($temp, NOW())";

if ($conn->query($sql) === TRUE) {
    echo "OK";
} else {
    echo "Error";
}
$conn->close();
?>
Vytvoř tabulku např.:
CREATE TABLE teploty (id INT AUTO_INCREMENT PRIMARY KEY, teplota FLOAT, cas DATETIME);
Co dál upravit
Změň MAC, IP, serverSQL, phpScript podle sebe.
Pokud používáš jiný teplotní senzor (např. DHT22), nahraď část s DallasTemperature knihovnou DHT.
Pro víc relé přidej další piny a tlačítka.
Testuj nejdřív jen web server, pak přidej odesílání.

Když něco nefunguje (např. Ethernet), pošli výpis ze Serial Monitoru.

Uživatelský avatar
gilhad
Příspěvky: 874
Registrován: 07 bře 2018, 11:22

Re: Výběr LAN modulu

Příspěvek od gilhad » 07 led 2026, 12:22

Jenom bych chtěl podotknout, že umělák celkem běžně halucinuje a vykládá velice uvěřitelné věci, které ale vůbec nejsou pravda. Takže je potřeba ověřit cokoli co říká a nejenom to odmávnout, že "to vypadá dobře" nebo "takhle by to mohlo být" ...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host