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?
Výběr LAN modulu
Re: Výběr LAN modulu
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
.
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
Re: Výběr LAN modulu
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.
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.
Re: Výběr LAN modulu
V pohodě
. Jsem rád, když ti to pomůže.
Kód
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)
PHP skript (insert.php) na tvém serveru
Ulož na webserver (např. do složky, kde máš MySQL):
Vytvoř tabulku např.:
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.
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)
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)
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(" °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");
}
}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();
?>Co dál upravitCREATE TABLE teploty (id INT AUTO_INCREMENT PRIMARY KEY, teplota FLOAT, cas DATETIME);
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.
Re: Výběr LAN modulu
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" ...
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host