🌍 Π§Π°ΡΡ‚ΡŒ 37: Π’Π΅Π±-сСрвСр Π½Π° ATmega328P с динамичСскими страницами

Π”Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π²Π΅Π±-сСрвСр Π½Π° Arduino Uno! Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ethernet Shield ΠΈΠ»ΠΈ ESP8266 Π² качСствС сСтСвого интСрфСйса.

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π΅Π±-сСрвСр с ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ:

cpp

#include <SPI.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>

// Настройки сСти
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);
EthernetServer server(80);

// Π¨Π°Π±Π»ΠΎΠ½Ρ‹ страниц (Π² PROGMEM)
const char index_html[] PROGMEM = R"=====(
<!DOCTYPE HTML>
<html>
<head>
<title>ARDUINOHACKS Server</title>
<style>
body { font-family: Arial; text-align: center; }
h1 { color: #2c3e50; }
.metric { display: inline-block; margin: 20px; padding: 20px; border: 1px solid #ddd; }
.value { font-size: 48px; color: #e74c3c; }
</style>
<script>
function update() {
    fetch('/api/status')
        .then(response => response.json())
        .then(data => {
            document.getElementById('temp').innerHTML = data.temperature + 'Β°C';
            document.getElementById('humidity').innerHTML = data.humidity + '%';
            document.getElementById('uptime').innerHTML = data.uptime + 's';
        });
}
setInterval(update, 1000);
</script>
</head>
<body>
<h1>ARDUINOHACKS Server</h1>
<div class="metric">
    <div>Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π°</div>
    <div class="value" id="temp">--</div>
</div>
<div class="metric">
    <div>Π’Π»Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ</div>
    <div class="value" id="humidity">--</div>
</div>
<div class="metric">
    <div>Аптайм</div>
    <div class="value" id="uptime">--</div>
</div>
</body>
</html>
)=====";

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° HTTP запросов
void handleRequest(EthernetClient client) {
    String request = "";
    while (client.connected()) {
        if (client.available()) {
            char c = client.read();
            request += c;
            if (c == '\n' && request.endsWith("\r\n\r\n")) {
                break;
            }
        }
    }
    
    // ΠŸΠ°Ρ€ΡΠΈΠΌ ΠΏΡƒΡ‚ΡŒ
    String path = "/";
    if (request.indexOf("GET ") == 0) {
        path = request.substring(4, request.indexOf(" ", 4));
    }
    
    // ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚
    if (path == "/") {
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println("Connection: close");
        client.println();
        client.print(F(index_html));  // Из PROGMEM
    } 
    else if (path == "/api/status") {
        // JSON API
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: application/json");
        client.println("Connection: close");
        client.println();
        client.print("{");
        client.print("\"temperature\":");
        client.print(analogRead(A0) / 10.24);  // Бимуляция
        client.print(",\"humidity\":");
        client.print(analogRead(A1) / 10.24);
        client.print(",\"uptime\":");
        client.print(millis() / 1000);
        client.print("}");
    }
    else {
        client.println("HTTP/1.1 404 Not Found");
        client.println("Content-Type: text/html");
        client.println("Connection: close");
        client.println();
        client.println("<h1>404 - Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°</h1>");
    }
}

void setup() {
    Ethernet.begin(mac, ip);
    server.begin();
    Serial.begin(115200);
    Serial.print("Π‘Π΅Ρ€Π²Π΅Ρ€ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° IP: ");
    Serial.println(Ethernet.localIP());
}

void loop() {
    EthernetClient client = server.available();
    if (client) {
        handleRequest(client);
        delay(1);
        client.stop();
    }
}

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

About the Author: user1

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *