Schranke ansteuern

Servus Arduino Gemeinde,

Ich mache mir schon die ganze Zeit darüber Gedanken wie ich eine Vorhandene Schranke ansteuern kann.

Momentan ist folgende Ausgangssituation...

Schranke befindt sich nicht in unmittelbarer Nähe.
Zeitweise funktioniert die Induktionschleife zum Ausfahren nicht, worauf dann das Handy klingelt und man dann extra dorthin laufen muß um sie manuell zu öffnen.

Ich würde gern die IP Kamera auf eine extra Webpage packen und darauf einen "Öffnen" Button einbinden.
Sobald dieser gedrückt wird öffnet die Schranke (Tastimpuls reicht) und ich kann das auf der Kamera mitverfolgen.
Das ganze hatte ich per Lan gedacht mit einem Arduino Uno mit Ethernet Shield und einer Ralais Karte.
Vorhanden ist das ganze schon, nur an der Umsetzung hapert es.
Ich habe auch schon mit Beispielscetchen herumexperimentiert, aber das ganze hat mir nicht so wirklich gefallen da es auf einem Webserver aufgebaut war.
Kann man diesen Tastbefehl für das Arduino nicht per IP Adresse + Port irgendwie aktivieren ?

Viele Grüße
MAB

Kann man diesen Tastbefehl für das Arduino nicht per IP Adresse + Port irgendwie aktivieren ?

ja kann man.

Andererseits ein "Webserver" ist ja auch an nur ip und Port 80. So what.

Schick deinen "SchrankeAuf" an den Arduino Webserver und gut ist.

Wenn ich dein geschreibe richtig interpretiere, hast du einen Anderen Webserver wo du deine Webcam eingebunden hast. Auf dieser anderen Webseite sollte ein Button sein.

Also musst du dort einen form POST (oder GET) einbauen und den Befehl an den den Arduino senden.

Daher beginnst du mal mit einem einfachen Server am Arduino der Daten entgegennehmen kann.
Und zur Verwirrung, würde ich das zunächst lokal am Arduino testen, also doch wieder eine HTTP Seite auf dem Arduino hosten und "lokal" ausprobieren.

Ich würde nach dieser/meiner Anleitung vorgehen:
https://werner.rothschopf.net/202001_arduino_webserver_post.htm

und wenn das alles klappt, "On1" halt vom anderen Webserver senden.

Hallo,

erst mal vielen Dank für die Hilfe.
Ich habe mir mal die Seite durchgeschaut wobei ich zugegebenermaßen nicht alles verstanden habe.
Aber die Unterschiede von GET und POST sind mir nun bekannt.
Bei dem Beispielsketch mit dem ich herumexperimentiert hatte, haben mir fogende Punkte nicht gefallen...

  1. Der Output Pin war beim Start ständig aktiv, so das das Relais im Ruhezustand ständig angezogen war.
  2. Man muß manuell wieder zurückstellen, d.h. nach dem öffnen muß auch wieder geschlossen werden.
    Eine definierte Zeit wäre schöner das ganze wieder zu schließen.
  3. Eine Button Eingabe muß extra mit einem "Submit" Button abgeschickt werden.

Ich habe schon versucht gewisse Stellen anzupassen um das Sketch für meine Vorhaben zu veränden.
Aber da meine Programmierkenntnisse so bescheiden sind kam es darauf hinaus das der Sketch entweder sofort Fehlermeldungen ausspuckte oder es passierte überhaupt nichts.

Ich hände Ihn hier nochmal hinein:

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

// Gib die 6 (hexadezimalen) Zahlen der Mac-Adresse Deines Ethernet-Shields ein:
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xBD };

// Gib die gewünschte IP-Adresse ein, die Dein Webserver haben soll:
IPAddress ip(192,168,178,60);

// Initialisiere Deinen Server und weise ihm einen Port zu:
// (Port 80 ist ueblich fuer HTTP):
EthernetServer server(1234);

int led = 8;

void setup() {
  // Serielle Kommunikation (fuer den Seriellen Monitor)
  Serial.begin(9600);
  while (!Serial) {
    ; // warte
  }
  // starte Ethernet Verbindung pinMode für die LED und den Server:
  Ethernet.begin(mac, ip);
  pinMode(led, OUTPUT);
  server.begin();
  Serial.print("Server an IP: ");
  Serial.println(Ethernet.localIP());
}

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

void loop() {
  // listen
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        //WICHTIG: client enthält Daten um die LED's zu steuern.
        char c = client.read(); 
        //WICHTIG: buffer String erweitern mit jedem loop Durchgang.                          
        buffer+=c;                                                                       
        if (c == '\n' && currentLineIsBlank) {          
          // http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<body>");
          // 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("SCHRANKE ist <font color = 'green'> AUF </font>");
          } else {
            client.print("SCHRANKE ist wieder <font color = 'red'> GESCHLOSSEN </font>");
          }
          client.println("
");
          //Senden an server 
          client.print("<FORM action =\"http://192.168.178.60:1234/\">");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"1\">AUF");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"0\">ZU");
          client.print("<P> <INPUT type =\"submit\" value =\"SENDEN\"> </FORM>");
          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("it works with 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("it works with status=0");
              digitalWrite(led,LOW);
              }          
          buffer = "";
        }                                                                        
      }
    }
    // Gibt dem Webbrowser Zeit, die Daten zu erhalten.
    delay(1);
    // Schließe Connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

Vielen Dank nochmal an dieser Stelle
MAB

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Bei dem Beispielsketch mit dem ich herumexperimentiert hatte, haben mir fogende Punkte nicht gefallen...

  1. Der Output Pin war beim Start ständig aktiv, so das das Relais im Ruhezustand ständig angezogen war.
  2. Man muß manuell wieder zurückstellen, d.h. nach dem öffnen muß auch wieder geschlossen werden.
    Eine definierte Zeit wäre schöner das ganze wieder zu schließen.
  3. Eine Button Eingabe muß extra mit einem "Submit" Button abgeschickt werden.
  1. und 3. bezweilfe ich dass das so in meinem Sketch wäre.

  2. ist im einfachsten Fall zwei weitere Zeilen Code damit das Ding genau das machst.

Übe noch ein wenig.

@Tommy,

vielen Dank für den Hinweis, habe es sofort geändert.

noiasca:

  1. und 3. bezweilfe ich dass das so in meinem Sketch wäre.

  2. ist im einfachsten Fall zwei weitere Zeilen Code damit das Ding genau das machst.

Übe noch ein wenig.

Das war auch der erste Sketch den ich ausprobiert hatte, hat nichts mit dem Beispiel auf Deiner Seite zu tun.
Punkt 2 ist genau mein Problem, Texte ändern im Script ist nicht das Ding, aber wenn es um Funktionen geht sieht das ganze chinesisch aus :slight_smile: .
Üben ist ein guter Ratgeber, aber dazu müßte man wenigstes wissen worin man gerade herumwurschtelt.
Leider ist bei dem Beispielscript (nicht das von Dir) keine ausführliche Anleitung dabei was für was ist.
Damit wäre es einfacher Schritt für Schritt durch den Sketch zu gehen.

Viele Grüße
MAB

Der Code in #2 enthält halt alles was ich generell am Beispiel Sketch ankreide, daher pfusche ich da nicht rein.

Um einen Pin kurz ein und aus zu schalten nimmt man halt ein böses delay wenn man es nicht anders kann:

digitalWrite(led,HIGH); 
delay(500); // dirty delay, not longer then 500ms...
digitalWrite(led, LOW);

Der Code macht Sinn und ist auch (für mich :grinning:) sehr verständlich.
Allerdings habe ich jetzt versucht dieses in den Sketch eizubinden, jedoch mit dem Ergebnis das die Relaiskarte rund alles 5 bis 6 Sekunden am schalten ist ohne das ich etwas mache. :-\

Ich tüftel noch mal etwas weiter, vielleicht ergibt sich doch noch etwas.

Viele Grüße
MAB

Nach etlichen hin und her probieren werde ich mich wohl mit dem "Submit" Button arrangieren und den Sketch so verwenden wie er ist.
Die Relaiskarte machte bei allen Versuchen etwas zu ändern was sie wollte. Entweder man konnte einmal schalten und nie wieder, oder sie machte sich komplett selbstständig und hörte gar nicht mehr auf zu "klackern".
Trotzdem vielen Dank für die vielen Tipps und Mühe...

Viele Grüße
MAB

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.