Bestimmte Funktion aus über Webserver schalten

Moin!

Ich bin hier auf ein Problem gestoßen. Und zwar muss ich im Rahmen eines Schulprojektes einen Arduino programmieren, der Funksteckdosen per RF-Sender(433MHz) schalten soll. Er soll dies nach Eingabe über Touchscreen und nach Übermittlung eines Signals per Bluetooth über das Smartphone machen. Das funktioniert soweit alles.

Zusätzlich soll jetzt auch noch der die Steckdose nach Betätigen eines Buttons im Webserver über Ethernet-Shiled geschaltet werden. Ich habe es schon hinbekommen, mit dem Bespielsketch "Webserver" und ein bisschen rumprobieren, einen Ausgang auf HIGH und LOW zu schalten. Aber wie kann ich etwas anderes schalten? Also zum Beispiel eine Funktion?

Hier einmal mein Sketch für den Webserver. Ich hab den Sketch für den Webserver erstmal ohne Display usw. erstellt. Erst wenn alles funktioniert, integriere ich es in den bestehenden Sketch...

#if ARDUINO > 18
#include <SPI.h> // Für Arduino Version größer als 0018
#endif
#include <Ethernet.h>
#include <TextFinder.h>
#include <SD.h>
 
byte mac[] = { 0x5A, 0xA2, 0xDA, 0x0D, 0x56, 0x7A }; // MAC-Adresse des Ethernet-Shield
byte ip[]  = { 192, 168, 178, 222 };                   // IP zum aufrufen des Webservers
byte sdPin = 4;                                      // Pin der SD-Karte
 
EthernetServer server(80);                           // Server port
 
File webFile;
 
void setup()
{  
  Ethernet.begin(mac, ip); // Client starten
  server.begin();          // Server starten
  Serial.begin(9600);
  Serial.println("ARDUINO - STEUERUNG");
 
  Serial.println("Initialisiere SD-Karte...");
  if (!SD.begin(sdPin)) 
  {
    Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");
    return;
  }
  Serial.println(" - SD-Karte erfolgreich initialisiert.");
 
  if (!SD.exists("index.htm")) 
  {
    Serial.println(" - Datei (index.htm) wurde nicht gefunden!");
    return;
  }
  Serial.println(" - Datei (index.htm) wurde gefunden.");
 
  Serial.println();
  Serial.println("Verbraucher schalten");
}
 
void loop()
{
  EthernetClient client = server.available(); // Auf Anfrage warten
 
  if(client)
  {
    /*****************************************
      Ausgänge über das Webformular steuern  *
    *****************************************/
    TextFinder finder(client);
 
    if(finder.find("GET"))
    {
      while(finder.findUntil("pin", "\n\r"))
      {
        char typ = client.read();
        int  pin = finder.getValue();
        int  val = finder.getValue();
 
        if(typ == 'D')
        {
          pinMode(pin, OUTPUT);
          digitalWrite(pin, val);
          Serial.print(" - D"+String(pin));
        }
        else if(typ == 'A')
        {
          analogWrite(pin, val);
          Serial.print(" - A"+String(pin));
        }
        else Serial.print(" - Falscher Typ");
 
        if(val==1) Serial.println(" ein"); else Serial.println(" aus");
      }
    }
 
    /************************
      Webformular anzeigen  *
    ************************/
    boolean current_line_is_blank = true;       // eine HTTP-Anfrage endet mit einer Leerzeile und einer neuen Zeile
 
    while (client.connected()) 
    {
      if (client.available())                   // Wenn Daten vom Server empfangen werden
      {
        char c = client.read();                 // empfangene Zeichen einlesen
        if (c == '\n' && current_line_is_blank) // wenn neue Zeile und Leerzeile empfangen
        { // Standard HTTP Header senden
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
 
          // Website von SD-Karte laden
          webFile = SD.open("index.htm");  // Website laden
          if (webFile)
          {
            while(webFile.available())
            {
              client.write(webFile.read()); // Website an Client schicken
            }
            webFile.close();
          }
          break;
        }
        if (c == '\n') 
        {
          current_line_is_blank = true;
        } 
        else if (c != '\r') 
        {
          current_line_is_blank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

von der SD-Karte wird folgende HTML-Datei aufgerufen, die hier das angeschlossene Bluetoothmodul über den Pin 45 mit Spannung versorgt und dieses somit einschaltet.
Mit dem Button Steckdose möchte ich nun eigentlich Statt dem Pin3 entweder eine Funktion aufrufen

  • z.B. void steckdose()
  • oder direkt den Code über den RF-Sender senden (mySwitch.switchOn("11000", "10000"):wink:

Ich hab aber keine Ahnung, wie ich das anstelle. Und über Google finde ich auch nichts.

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8” />
  <title>Arduino Steuerung</title>
  <style>
    h2 { margin-bottom:5px; }
  .button {
    background-color: #4CAF50; /* Green */
    border: none;
    color: white;
    padding: 16px 32px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 16px;
    margin: 4px 2px;
    -webkit-transition-duration: 0.4s; /* Safari */
    transition-duration: 0.4s;
    cursor: pointer;
}

.button1 {
    background-color: white; 
    color: black; 
    border: 2px solid #4CAF50;
}

.button1:hover {
    background-color: #4CAF50;
    color: white;
}

.button2 {
    background-color: white; 
    color: black; 
    border: 2px solid #008CBA;
}

.button2:hover {
    background-color: #008CBA;
    color: white;
}

  </style>
</head>
<body>
 
<img src="ifttt-banner.jpg" alt="ifttt" width="600" height="300" align="center">



  <a href="/?pinD3=1" target="ifr"><button class="button button1">Steckdose ein</button></a>
  <a href="/?pinD3=0" target="ifr"><button class="button button1">Steckdose aus</button></a>
   
         
  <a href="/?pinD45=1" target="ifr"><button class="button button2">Bluetooth ein</button></a>
  <a href="/?pinD45=0" target="ifr"><button class="button button2">Bluetooth aus</button></a>
  
  
 
  <iframe name="ifr" style="display:none;" width="0" height="0"></iframe>
</body>
</html>

Mein Sketch, wo der Server nachher integriert wird, ist über 300 Zeilen lang und hab ich der Übersichtlichkeit halber mal weggelassen. Kann ich bei Bedarf aber gern nachreichen.

Ich hoffe, jemand kann mir helfen.

Grüße

Das machst Du genau so, wie Du z.B. den Pin schaltest
Dein Code:

if(typ == 'D')
        {
          pinMode(pin, OUTPUT);
          digitalWrite(pin, val);
          Serial.print(" - D"+String(pin));
        }

Beispiel:

if(typ == 'S') // für Steckdose
{
   if (val == 1) {
     // Einschalten
     mySwitch.switchOn("11000", "10000");
     Serial.println(" - S ein);
  }
  else {
     // Ausschalten
     mySwitch.switchOff(...);
     Serial.println(" - S aus);
  }    
}

Ungetestet, nur als Anregung.

Gruß Tommy