Mega 2560 als "WebServer-Schalter" verwenden

Hallo,

ich habe keine Ahnung ob das, was ich mir ausgedacht habe möglich ist.
Ich stelle mir das so vor.

Auf dem Smartphone läuft FireFox.
Dafür möchte ich eine HTML-Seite erstellen mit einigen Tastern und einfachen Text-Rückmeldungen.

Ich rufe in FF diese Seite auf.
Drücke eine Taste und werde mit einer bestimmten IP zum Mega2560 WebServer verbunden.
Dieser verlangt jetzt ein PassWort. Dem Nachgekommen; bin ich mit dem Mega verbunden.
Nun drücke ich eine andere Taste, die LED 13 einschalten soll.
Es wird wieder nach einem Passwort gefragt, richtig eigegeben- und LED 13 leuchtet.

Das erste PassWort für die Verbindung zum Mega.
Das zweite Passwort für die Kontrolle über den Mega.

Hintergrund ist folgender:
Ich möchte mir einen AV-Server einrichten der nicht 24/7 läuft.
Der Mega soll das Ding ein- und ausschalten können, mit Rückmeldung.

Was brauche ich an HarWare um mit dem SmartPhone am Mega die LED 13 schalten zu können.
Würde mir ein Mega ADK etwas erleichtern?
Was könnt ihr mir sicheres und sauber laufendes empfehlen, um den Mega mit dem NetzWerk/Internet
zu verbinden?
Gruß und Dank
Andreas

imho kannst du da einen normalen Mega verwenden, plus ein Ethernet Shield.

Oder gleich einen Mega mit Ethernet. Die günstigste Variante gibt es von robotdyn: http://s.click.aliexpress.com/e/r7t5zJ3S

bei den Shield auf eine der letzten Varianten achten, beim FC sind das jene die für POE vorbereitet sind - erkennbar an den schräg verlaufenden Lötpins über das Board.
W5100 Mega 2560 Mega2560 Lan Ethernet R3 Shield Module Micro Sd Wiznet Tcp/ip Network Development Board For Arduino Duem - Integrated Circuits - AliExpress - nicht die billigsten nehmen!

Dann stellt sich natürlich noch die Frage, warum es ein Mega sein soll. Für eine LED kannst auch einen Uno oder einen Nano verwenden. Eine kleine Seite wird auch auf dem Uno/Nano Platz finden. Auch für den Nano gibt es Aufsteckboards die das verkabeln ganz einfach machen Page Not Found - Aliexpress.com.

Oder wenn du tiefer in die Materie eintauchen willst, dann ein ESP mit WLAN, z.B. ein ESP8266 auf einem NodeMcu oder ein ESP32, aber nimm immer einen auf einem Board, nicht die einzelnen Boards, dann hast nämlich Spannungsstabilisierung und USB Wandler gleich dabei. V3 Wireless Module Cp2102 Ch340 Nodemcu 4m Bytes Lua Wifi Internet Of Things Development Board Based Esp8266 Esp-12e For Arduino - Integrated Circuits - AliExpress - wobei ich bei denen die schmälere Variante mit dem CP2102 bevorzuge.

ESP32 Modul verlink ich keines da es von diesesn auch massig Varianten gibt, und auf den Formfaktor wo ich mich eingeschossen habe, der Upload nur mit Tastendruck klappt.

Vom Formfaktor noch günstiger WEMOS D1 mini (z.B. hier), wenn es eine externe Antenne sein soll, dann die pro-Version.

Gruß Tommy

Wenn es nur vom Smartphone aus gehen muss, empfehle ich dir Blynk. Das in Verbindung mit einer Funksteckdose Sonoff S20 auf ESP8265 Basis. Dann hast du das ganze ansprechend und schnell gelöst. Und musst nicht an 230V fummeln.
Oder eben mit Webseite, der ESP8265 in der Steckdose verhält sich genauso wie ein ESP8266.

Hallo,
kein Funk, nur Kabel. Mega 2560 weil ich den kenne, und ich weiß aus langzeit Erfahrung das
der zuverlässig läuft.
Die LED 13 ist nur ein Beispiel. Wenn ich es schaffe, die wie in #0 zu schalten, dann bekomme
ich auch den Rest hin.

Ich habe das "Arduino Ethernet Shield 2" entdeckt, das wäre ja schon etwas.
Was ist denn von dem Ding zu halten. Macht ja einen ordentlichen Eindruck.

An 220V will ich nicht fummeln. Ich greife den Ein/Aus-Schalter des Rechner an. Ein kurzer
Impuls zum hochfahren, ein langer zum runterfahren.
Dann prüfe ich die 5v des Netzteil. So könnte ich zweifelsfrei den Zustand feststellen.

Auf den Mega ADK bin ich gekommen, weil der USB hat. Man könnte so eine Tastatur simulieren
und den Rechner darüber steuern. Denke ich mir.
Gruß und Dank
Andreas

Ich habe ein paar S20 im Einsatz, bisher keine Probleme. Aber wenn du an den Ein/Aus-Knopf willst und Netzwerkkabel dort kein Problem ist, dann reicht sogar ein Uno. Und nimm ein Shield mit dem W5100 Chip. Aber weder Uno noch Mega beherrschen eine gute Verschlüsselung. Also von außen zugreifen dann nur mit VPN.

Hallo,
nehmen sich die Chips denn etwas? Warum W5100? Es gibt doch auch W5200 und W5500.
S20 ist Sonoff?
Gruß und Dank
Andreas

noiasca:
Du sollst nur die ENC28j60 Module meiden.

:o
Ach - jetzt lese ich das hier... leider ein paar Stunden zu spät. Soeben ein ENC28j60 Modul erworben...
:confused:
Ich wollte ja ein W5100 (weil schon ein paar Mal damit erfolgreich gearbeitet), gab es aber nicht, sondern nur die Alternative: ENC28j60.
Naja, hat auch kein Vermögen gekostet.
:o
Was sind denn die wesentlichen Gründe, die gegen ENC28j60 sprechen?

Danke!

Ich hab's nichts bestellt, sondern im Geschäft gekauft :slight_smile: - manchmal bin ich ein wenig altmodisch und vor allem ungeduldig... :slight_smile:
Und deshalb halte ich das Ding ja schon in Händen.

Wie gesagt: macht nichts.

Bei mir haben sich die Sketche mit dem ENC28j60 nach ein paar Tagen immer aufgehängt. Mit dem w5100 hatte ich diese Probleme nie.
Dazu kommt eben das bereits erwähnte Problem mit dem Speicher, insbesondere beim 328 uC.

Ich hab die Teile noch rumliegen. In der Zwischenzeit gibt es ha such erschwingliche W5100 Boards. Aber hauptsächlich benutze ich inzwischen aber die verschiedensten ESP Varianten.

Also ich würde dir NodeMCU empfehlen, ich nutze den gerade auch in meinem Projekt.
Du kannst den mit der Arduino IDE programmieren, verbraucht wenig und kostet nur 7€.

Mit Blynk kannst du den dann steuern übers Handy, das ist auch kostenlos.
Der NodeMCU hat einen Analogen Eingang, da könntest du dann die 5V Leitung mit messen.

Zur Stabilität vill noch, ich hatte den quasi 24/7 in Betrieb an einer PS4 wegen Jailbreak ^^, also Zuverlässigkeit wäre auch gegeben.

Gruß Stefan

Hab das vor kurzem so gemacht:

// Raumluftueberwachung_Mega V1.1

//Erstellt unter Arduino IDE 1.8.9
#include <SPI.h>                               // Library fuer Serielle Ausgaben
#include <Ethernet.h>                          // Netzwerkfunktion


byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  // Vorgabe MAC Adresse, Gerät hat keine 
IPAddress ip(192,168,2,177);         //Voreingestellte IP
IPAddress gateway(192, 168, 2, 1); //IP Adresse des DHCP bzw. Routers
IPAddress subnet(255, 255, 255, 0); // Subnetz Maske
EthernetServer server(80);          // Initialisieren des Server mit Port 80
char Link[]= "http://192.168.2.100"; // Link als Charakter Variable 
int const led = 6;                  // I/O Ausgangs-Pin 6
int receivedInt = -1;               // receivedInt nicht in verwendung da Uerbagabe von NodeMCU nicht stattfindet

void setup() {                      // Einmalige Aufruf-Funktion
  // Serielle Kommunikation (fuer den Seriellen Monitor)
  Serial.begin(115200);
  while (!Serial) {
    ; // warte
  }
  // starte Ethernet Verbindung pinMode für die LED und den Server:
  Ethernet.begin(mac, ip);         // Initialisieren Ethernetfunktion mit Mac und IP-Adresse
  pinMode(led, OUTPUT);            // Initialisiere Ausgangsbetrieb 
  server.begin();                  // Starten des Webservers
  Serial.print("Server an IP: ");    // Serielle Textausgabe
  Serial.println(Ethernet.localIP());  // Ausgabe der IP des Arduino Mega bzw. Shields
  Serial.print("Webserver Mega2560 Shield gestartet");
}

//buffer ist ein String, welcher die Clientdaten zwischenspeichert
String buffer = "";

void loop() {                                // Wiederkehrende funktionen
  
  EthernetClient client = server.available();     //Abhoeren auf Clients
  if (client) {                                   // Wenn Client verbunden
    Serial.println("new client");                 // Serielle Textausgabe
    boolean currentLineIsBlank = true;
    while (client.connected()) {                  // Client Schleife wiederkehrend fuer das Steuern des Relais
      if (client.available()) {
        //WICHTIG: client enthält Daten um das Relais zu Steuern
        char c = client.read(); 
        //WICHTIG: buffer String erweitern mit jedem loop Durchgang.                          
        buffer+=c;                                                                       
        if (c == '\n' && currentLineIsBlank) {          
          // http rückgabe an Client
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");  // Grundgeruest Webseite
          client.println("<html><head><title> Arduino Webserver</title><meta charset=\"UTF-8\" /></head>"); // Ueberschrift 1 an TAB im Browser
          client.println("<body><h1> Arduino Webserver</h1><ul>");             // Ueberschrift 2 Webseite
          client.println("<body><h1>Raumklima Überwachung</h1><ul>");                                             // Ueberschrift 3 Webseite
          
          // meta refresh tag hinzufügen, welcher alle 5 Sekunden den Browser refresht. 
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          //entweder LED an (ON und grüne Schrift) oder aus (OFF und rote Schrift).
          if (digitalRead(led)) {
            client.print("Lüfter ist <font color = 'green'> AN </font>");
          } else {
            client.print("Lüfter ist <font color = 'red'> AUS </font>");
          }
          client.println("
");                                              // Break fuer Buttonabfrage
          
          //Senden an server 
          client.print("<FORM action =\"http://192.168.2.177/\">");             // Empfang der Daten bzw. Zustaende der Buttons zum Server
          // client.print("<FORM action =\"http://192.168.2.100/\">");          // nicht verwendete Formaabfrage des NodeMCU, nur eine Formabfrage möglich
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"1\">AN");   //Input An gewaehlt bzw. Status
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"0\">AUS");  //Input Aus gewahlt bzw. Status
          client.print("<P> <INPUT type =\"submit\" value =\"Submit\"> </FORM>");        //Freigabe bzw. Status Submit Button
          client.print("<iframe width=640 height=360 src=");                             // Ein Rahmen für Iframe funktion Webseite in Webseite anzeigen
          client.print(Link); // Link is not between quotes!                             // Link -> IP Adresse Char des NodeMCU
          client.println(" frameborder=0 allowfullscreen></iframe>");                    // 
          client.println("<body>");

          client.println("</body>");
          
          client.println("</html>");
          break;                         
        }

          if (c == '\n') {
          buffer = "";
          currentLineIsBlank = true;          
          }
          else if (c == '\r') {          

          /* 
           *  WICHTIG: durchsucht den buffer String nach der Char-
           *  folge "GET /?status=1" und falls vorhanden
           *   wird Code ausgeführt.
           */
          if(buffer.indexOf("GET /?status=1")>=0){
              Serial.println("Lüfter An Status=1");
              digitalWrite(led,HIGH);               
              }
           /* 
            *  WICHTIG: durchsucht den buffer String nach der 
            *  Charfolge "GET /?status=0" und falls vorhanden
            *  wird Code ausgeführt.
            */
          if(buffer.indexOf("GET /?status=0")>=0){
              Serial.println("Luefeter Aus status=0");
              digitalWrite(led,LOW);
              }
              if (buffer.indexOf("GET /?receivedInt") >= 0) {         // GET receivetInt nicht aktiv da keine zweite Form->GET
            Serial.println(F("da ist was gekommen"));
            uint16_t start = buffer.indexOf("GET /?receivedInt=");
            receivedInt = buffer.substring(start+19).toInt();
            Serial.print(F("--> receivedInt=")); Serial.println(receivedInt);
          }                    
          buffer = "";
        }                                                                        
      }
    }
    // Gibt dem Webbrowser Zeit, die Daten zu erhalten.
    delay(1);
    // Schließe Connection:
    client.stop();

Wobei man aber auch sagen muss, dass der Mega 2560 mit Shield W5100 nur 4 Verbindungen (laut Hersteller) halten kann. Also mehrere geöffnete Webseiten von verschiedenen Clients, da wirds dann schwierig.

Die Zeilen mit dem iframe kannst du löschen, ich hatte da die Webseite des ESP8266 noch zusätzlich implementiert.

client.print("<iframe width=640 height=360 src=");                             // Ein Rahmen für Iframe funktion Webseite in Webseite anzeigen
          client.print(Link); // Link is not between quotes!                             // Link -> IP Adresse Char des NodeMCU
          client.println(" frameborder=0 allowfullscreen></iframe>");

Wenn es ohne Kabelgefummel nur mit WLAN funktionieren soll und ohnehin weniger Ausgänge gebraucht werden kannst du das auch für den ESP umschreiben.

Hallo,
Funk möchte ich ja nicht, externe App´s auch nicht. Das muß in meinen Händen bleiben.
Mit HTML und Java kann man schon ansprechende Seiten aufbauen, die dann nur noch
gefüllt werden müssen.

Wenn ich das richtig verstanden habe, dann nehmen die W5xxx einem etwas SketchArbeit ab.
Speicherplatz wird auch etwas geschont, das hört sich doch gut an.

Also habe ich mir zum üben das Arduino Ethernet Shield 2 geholt. Draufstecken und fertig.
Danach habe ich die Beispiele probiert- und das läuft. Ist schon ein wenig unheimlich was
heute als "privater" alles möglich ist.
Meine LED kann ich auch ein/ausschalten, Werte empfangen/senden funktioniert auch. Das ist
weit mehr, als ich in dieser kurzen Zeit zu hoffen gewagt habe.

Zum üben ist das Shield ideal, aber sonst... Ich werde es durch eine W5100 Platine ersetzen,
wenn ich denn eine ohne Funk finde.

Den Sketch von Gala30 werde ich mal probieren, mal sehen was da rüberkommt.
Also, vielen Dank für eure Hilfe.
Gruß und Spaß
Andreas

SkobyMobil:
Mit HTML und Java kann man schon ansprechende Seiten aufbauen, die dann nur noch
gefüllt werden müssen.

Du meinst mit Sicherheit nicht JAVA, sondern Javascript.

Gruß Tommy

Hallo,
das ist für mich alles eine Grütze...
Gruß und Spaß
Andreas

Dann viel Spaß mit JAVA auf dem Arduino :wink:

Gruß Tommy