Arduino als Webserver

Hallo

Ich möchte verschiedenen Sensoren mit meinem Arduino UNO / Ethernet Shield auslesen und auf einer Website ersichtlich machen. Die Daten müssen nicht gespeichert werden.

Dazu habe ich folgende Vorlage gefunden und verwendet:

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi
 
 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 170);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
       
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

Verstehe ich das richtig, dass der Arduino durch diesen Code zum Webserver wird und die Daten von einem beliebigen Gerät abrufbar sind? Falls ja, wie kann ich diese Website aufrufen?

Nicht beliebig aufrufbar, nur im gleichen Subnetz. Aufrufen: Die hinter 'server is at ' genannte IP (siehst du im seriellen Monitor) in deinen Browser tippen.

Hallo,

ja so ist es , du must die IP Adresse z.B im Brauser eingeben dann sollte die Seite erscheien. Die IP muss aber schon aus dem gleichen Netz sein.

ich kenne mich nicht mit dem Sheeld aus es gibt da sicher auch die Möglichkeit das das die IP nicht fest vergeben wird, sondern vom Router , DHCP Server vergeben wir.

Heinz

Wenn Du den Server aufrufen willst, ist eine feste IP die bessere Wahl.

Gruß Tommy

Tommy56: Wenn Du den Server aufrufen willst, ist eine feste IP die bessere Wahl.

Gruß Tommy

Das stimmt, alllerdings wenn der T0 nicht weiß was schon alles im Netz vorhanden ist könnte es dumm enden. ;)

Gruß Heinz

Wer keinen Überblick über sein Netzwerk hat, sollte die Finger davon lassen ;)

With version 1.0, the library supports DHCP. Using Ethernet.begin(mac) with the proper network setup, the Ethernet shield will automatically obtain an IP address. This increases the sketch size significantly.

(Quelle)

Das würde ich einem UNO nicht antun wollen.

Gruß Tommy

Und ohne das "F-Makro" würde ich es einem Uno nicht antun. Der geriet dabei sehr schnell an seine Grenzen.

Verstehe ich das richtig, dass der Arduino durch diesen Code zum Webserver wird und die Daten von einem beliebigen Gerät abrufbar sind?

ja. Wie schon geschrieben, schreibt er auf der Seriellen die IP raus mit der du den Server erreichst.

Der Code entspricht weitgehend (aber nicht ganz) dem IDE Beispiel. Zum ersten kennenlernen ist das ok, aber ich würde immer mit dem IDE Beispiel als Smoke-Test anfangen.

Hier habe ich mal zusammengefasst, was man am IDE Beispiel alles anpassen soll, bzw. wie man hier etwas mehr rausholt https://werner.rothschopf.net/202001_arduino_webserver_post.htm

Und wenn das noch nicht reicht, und du weitermachen möchtest, hier habe ich noch etwas zum optimieren geschrieben: https://werner.rothschopf.net/microcontroller/202011_arduino_webserver_optimieren.htm (und warum das F-Makro für den client nicht bedenkenlos angesetzt werden soll und was es Alternativ gibt).

Geh einfach schrittweise vor, dann klappt es auch mit dem Uno.

Sehr schöne Analyse, besonders das F-Macro-Verhalten in Verbindung mit client.print. Aber für die seriellen Texte sollte es der TO trotzdem verwenden.

Gruß Tommy

Hallo,

wenn Du vorhast Dich etwas intensiver mit dem Thema Webserver zu befassen das besorge dir einen ESP8266 Node mcu Modul oder Wemos. Die haben WIFI und viele Funktionen mit on Board die es einfach machen einen Webserver zu realisieren.

hier noch ein Link um auf den Geschmack zu kommen https://fipsok.de/

Heinz