Keenso Ethernet Relais mit Arduino Steuern!!!

Hallo,
Ich bin neu hier im Forum, beschäftige mich aber schon eine zeitlang mit Arduino!
Bisher habe ich meine projekte immer mit ardublock realisiert, was auch immer gut geklappt hat, aber nun stehe ich vor einem ganz neuen Problem und zwar würde ich gerne einmal versuchen eine Ethernet relaiskarte von keenso mit meinem arduino zu steuern! Es geht mir momentan nur darum einmal ein relais im sekundentakt ein und wieder auszuschalten. Bei diesen relaiskarten ist das ja so, dass man die ip adresse der karte, den port und die nötige unterseite aufruft, um das relais entweder ein oder auszuschalten.
also z.b. http://192.168.1.4/30000/01 Relais 1 an
http://192.168.1.4/30000/00 Relais 1 aus

Ich habe die karte bereits am pc über den webbrowser probiert, dort funktionier alles super, nur weiß ich nicht, wie ich das jetzt mit meinem Arduino realisieren kann??

Ein Ethernetmodul habe ich bereits mit dem beispiel sketch webclient erfolgreich zum laufen gebracht und es wird mir auch alles über den serial monitor ausgegeben.

der Arduino hat eine fixe ip-adresse 192.168.1.100
und die relaiskarte hat die adresse 192.168.1.4/30000/00 usw. für die relais 1-16 an oder aus
vielleicht könnt ihr mir weiterhelfen, damit ich zumindest einmal weis, wie ich eine adresse aufrufe, dass ein relais ein bzw dann wieder ausschaltet.

Ich habe das forum, google und youtube bereits lange zeit durchforstet, jedoch bin ich immer wieder nur auf beispiele gestoßen wo der arduino als server und nicht als client verwendet wird.

verwendet wird ein arduino mega 2560 mit ethernet shield.
Hier der link zum relaisboard, das ich verwende! https://www.amazon.de/gp/product/B07PKBHP9X/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1

würde mich echt freuen, wenn jemand die geduld hätte, mir hier weiter zu helfen.
Vielen Dank
mfg, thomas

Bei diesen relaiskarten ist das ja so, dass man die ip adresse der karte, den port und die nötige unterseite aufruft, um das relais entweder ein oder auszuschalten.
also z.b. http://192.168.1.4/30000/01 Relais 1 an
http://192.168.1.4/30000/00 Relais 1 aus
...
Ein Ethernetmodul habe ich bereits mit dem beispiel sketch webclient erfolgreich zum laufen gebracht und es wird mir auch alles über den serial monitor ausgegeben.

Dann hast du es ja schon fast.

Nun musst du nur noch das webclient Beispiel so erweitern, dass es wahlweise eine der beiden Seiten aufruft.

  • langsam im Wechsel,
  • oder je nach dem wie das Relais geschaltet sein soll.

... und die Antwort auf 404 oder andere Fehlermeldungen auswerten.

der Webclient müsste schon passen.

auf was hast du das geändert:

//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.google.com";    // name address for Google (using DNS)

was hast in diesen beiden Zeilen gesetzt?

    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");

am besten postest du deinen Code.

/*
  Web client

 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen

 */

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(192,168,1,4);  // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 1, 177);
IPAddress myDns(192, 168, 1, 177);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

// Variables to measure the speed
unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;  // set to false for better speed measurement

void setup() {
  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  // 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
  }

  // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // 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.");
    }
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 30000)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
  beginMicros = micros();
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len); // show in the serial monitor (slows some boards)
    }
    byteCount = byteCount + len;
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.print("Received ");
    Serial.print(byteCount);
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(rate);
    Serial.print(" kbytes/second");
    Serial.println();

    // do nothing forevermore:
    while (true) {
      delay(1);
    }
  }
}

wie gesagt, bin ich noch nicht weiter gekommen als den beispielcode für den client, weil ich nicht weis, wo ich ansetzten soll?
als erstes ist mal die frage der server adresse! diese wäre dann ja http://192.168.1.4/30000/01
wobei die 30000 der port und die /01 relais 1 einschalten wäre! aber wie kann ich die adresse so aufrufen, wenn der standard port als 80 angegeben wird und wie kann ich zu der ip noch unterseiten anhängen?

So wie du das schreibst ist 30000 kein port sondern Verzeichnis. Was gibst du im Browser ein um zu schalten? Kopiere das mal hier rein

roadrunner85:
wie gesagt, bin ich noch nicht weiter gekommen als den beispielcode für den client, weil ich nicht weis, wo ich ansetzten soll?

Naja - dann fehlt Dir aber in Deinem Code erstaml was grundlegendes - nämlich die Sekundenumschaltung.

Du suchst sowas? - ungetestet aber damit Du die Idee dahinter siehst…

// Forumsketch - ungetestet - nur zur Veranschaulichung
// https://forum.arduino.cc/index.php?topic=714882.msg4802556#msg4802556
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server (192, 168, 0, 100);
IPAddress ip (192, 168, 0, 177);
EthernetClient client;
unsigned long lastmillis;
void setup()
{
  Serial.begin (115200);
  Serial.println (F ("Start.."));
  Ethernet.init();
  Ethernet.begin (mac, ip);
  if (client.connect (server, 80))
  {
    Serial.print ("connected to ");
    Serial.println (client.remoteIP());
  }
  delay (1000);
}
void loop()
{
  if (millis() - lastmillis > 1000)
  {
    Serial.print (F ("in den Zustand : "));
    Serial.print (schalteNetzwerkRelais());
    Serial.println (F (" geschaltet"));
  }
}
bool schalteNetzwerkRelais()
{
  static bool output;
  if (client.connect (server, 80))
  {
    Serial.print ("connected to ");
    Serial.println (client.remoteIP());
    // Make a HTTP request:
    if (output)
    {
      client.println ("GET /30000/01 HTTP/1.1");
    }
    else
    {
      client.println ("GET /30000/00 HTTP/1.1");
    }
    client.println ("Host: 192.168.0.100");
    client.println ("Connection: close");
    client.println();
  }
  output = !output;
  return (output);
}

als erstes ist mal die frage der server adresse! diese wäre dann ja http://192.168.1.4/30000/01
wobei die 30000 der port und die /01 relais 1 einschalten wäre! aber wie kann ich die adresse so aufrufen, wenn der standard port als 80 angegeben wird und wie kann ich zu der ip noch unterseiten anhängen?

Nein, 30000 ist kein Port!
Ein Port wird mit : getrennt. Also 192.168.0.1:30000 wäre ein Port.
Die 30000 ist ein (virtuelles) Verzeichnis, welches vom Webserver auf dem Relaisboard ausgewertet wird.
Für jedes Relais ist ein Verzeichnis und ein weiteres Unterverzechnis für den Schaltzustand (00 == aus - 01 == ein)

Bei meinem Viel-Kanal Teilchen sieht das dann so aus:
30000/00 bzw. 30000/01
30001/00 bzw. 30001/01
30002/00 bzw. 30001/01
usw.

http://192.168.1.4/30000/01 Adresse Relais-1 an
http://192.168.1.4/30000/00 Adresse Relais-1 aus

Den port und die ip des boards könnte man über das webinterface per browser ändern
Im Datenblatt des Relaisboards ist es so beschrieben hier der link: http://myosuploads3.banggood.com/products/20190218/20190218204717protocol.pdf

30000 ist der port, den muss ich in der adresszeile mit / eingeben sonst funktioniert es nicht!

roadrunner85:
30000 ist der port

NEIN!

bitte schreibe in diesem Zusammenhang nicht von Port.
Port hat eine ganz andere Bedeutung.

funktioniert das Beispiel von my_xy_projekt ?

Wenn nein, was passiert?

OK erstmal sorry für die verwechslung meinerseits mit dem port, hast recht gehabt, war mein fehler.

aber eht klasse der Beispielsketch funktioniert!

Relais 1 wird wechselnd ein und wieder ausgeschaltet, zwar nicht im sekundentakt sondern etwas schneller! Wo könnte ich die zeit noch ändern, wie schnell das relais ein und ausgeschaltet wird?

ergänze mal hier eine Zeile:

  if (millis() - lastmillis > 1000)
  {
    Serial.print (F ("in den Zustand : "));
    Serial.print (schalteNetzwerkRelais());
    Serial.println (F (" geschaltet"));
lastmillis = millis();
  }

roadrunner85:
aber eht klasse der Beispielsketch funktioniert!

oh - komplett blind auf Anhieb - da kann ich mich ja nachher noch belohnen...

Relais 1 wird wechselnd ein und wieder ausgeschaltet, zwar nicht im sekundentakt sondern etwas schneller! Wo könnte ich die zeit noch ändern, wie schnell das relais ein und ausgeschaltet wird?

Indem Du den Sketch so modifizierst, das lastmillis gesetzt wird.

 if (millis() - lastmillis > 1000)
  {
    Serial.print (F ("in den Zustand : "));
    Serial.print (schalteNetzwerkRelais());
    Serial.println (F (" geschaltet"));
lastmillis=millis(); // 
  }
}

Ich wollt Dir ja noch ne Aufgabe lassen....

  • noiasca war schneller ;(

wahnsinn ja komplett auf anhieb! ;D echt irre sowas!

hab den code jetzt mal für mich auf das nötigste reduziert und einfach mal ein paar delays dazwischen gehaut! milis wäre in zukunft aber sicher sinnvoller um auf die delays zu verzichten oder? ansonsten hier mal mein code!

// Forumsketch - ungetestet - nur zur Veranschaulichung
// https://forum.arduino.cc/index.php?topic=714882.msg4802556#msg4802556
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server (192, 168, 0, 200);
IPAddress ip (192, 168, 0, 177);
EthernetClient client;
void setup()
{
  
  Ethernet.begin (mac, ip);
  if (client.connect (server, 80))
  {
    
    Serial.println (client.remoteIP());
  }
  delay (1000);
}
void loop()
{
  client.println ("GET /30000/01 HTTP/1.1");
      delay(1000);
      client.println ("GET /30000/05 HTTP/1.1");
      delay(1000);
      client.println ("GET /30000/44 HTTP/1.1");
      delay(1000);
}

in weiterer folge sollte dann noch eine tasterabfrage mit eingebaut werden, dass wen taster x gedrückt wird relais xy schaltet! ebenso werde ich mich noch mit der milis funktion vertraut machen! Aber vorerst mal vielen dank an euch, ihr wart echt eine große hilfe!

roadrunner85:
wahnsinn ja komplett auf anhieb! ;D echt irre sowas!

Glück gehabt, das ich nichts anderes machen kann ausser Zeit zu vertreiben...

milis wäre in zukunft aber sicher sinnvoller
hier mal mein code!

// Forumsketch - ungetestet - nur zur Veranschaulichung

in weiterer folge sollte dann noch eine tasterabfrage mit eingebaut werden, dass wen taster x gedrückt wird relais xy schaltet! ebenso werde ich mich noch mit der milis funktion vertraut machen! Aber vorerst mal vielen dank an euch, ihr wart echt eine große hilfe!

Ja.

Dein Code "- ungetestet -" ? :wink:

Und genau weil ich mir das schn gedacht habe, hatte ich die Schaltübergabe in eine Funktion gepackt.
Die hat nämlich noch mehr Möglichkeiten, wenn Du Parameter übergibst!
z.B. so:
schalteNetzwerkRelais(Relais, Zustand)

Aber gut - lern das mit den millis() dann bist einen ganz weiten Schritt nach vorn - wenn Du es blind kannst und das für mehr als eine Wartezeit.

Noch ne Bitte - schreib mal in Dein erstes Post in die Betreffzeile ein [gelöst] rein. damit lässt sich das später evtl. schneller wiederfinden.

noiasca:

  • kannstschonsomachen.jpg

Du hast ihn verschreckt…
Ich hab auf die Frage mit der Übergabe gewartet - jetzt ist meine Wartezeit vorbei.
Daher mein - ungetesteter - Vorschlag, wie sowas aussehen könnte…

// Forumsketch basiert auf https://forum.arduino.cc/index.php?topic=714882.msg4802669#msg4802669
// erweitert nach https://forum.arduino.cc/index.php?topic=714882.msg4802727#msg4802727
// Darüber hinaus die "Umschaltsekunde" etwas genauer gemacht
// UNGETESTET - Wird nachgeholt
// HINWEIS: Nach dem übernehmen einfach mal STRG-T drücken, meine Formatierung weicht vom Regelfall ab 
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server (192, 168, 0, 100);
IPAddress ip (192, 168, 0, 177);
EthernetClient client;

const byte tasterPIN = 2;
unsigned long intervall;
bool relaisMerker[15] = {}; // Hier die Anzahl der Relais merken

const unsigned long startmillis = 0;
void setup()
{
  Serial.begin (115200);
  Serial.println (F ("Start.."));
  pinMode (tasterPIN, INPUT_PULLUP); // Taster soll nach GND schalten!
  Ethernet.init();
  Serial.println ("Initialize Ethernet with DHCP:");
  if (Ethernet.begin (mac) == 0)
  {
    Serial.println ("Failed to configure Ethernet using DHCP");
  }
  Ethernet.begin (mac, ip);
  if (client.connect (server, 80))
  {
    Serial.print ("connected to ");
    Serial.println (client.remoteIP());
  }
  delay (1000);
  Serial.println (F ("Ende Setup"));
}

void loop()
{
  const unsigned long sekunde = 1000;
  if (millis() - startmillis >= intervall)
  {
    Serial.print (F ("in den Zustand : "));
    relaisMerker[0] = schalteNetzwerkRelais (0);
    Serial.print (relaisMerker[0]);
    Serial.println (F (" geschaltet"));
    intervall += sekunde;
  }
  tasterabfrage();
}

void tasterabfrage()
{
  // Achtung die folgende Zeit bestimmt (auch) die Wiederholrate der Tastaturabfrage
  // das Beispiel ist hier sehr vereinfacht!!
  const int debouncetime = 500;
  static unsigned long lastmillis;
  if ((millis() - lastmillis > debouncetime) &&  (!digitalRead (tasterPIN)))
  {
    relaisMerker[1] = schalteNetzwerkRelais (1); // nachtraeglich geaendert auf das zweite relais
    lastmillis = millis();
  }
}

bool schalteNetzwerkRelais (const int relaisNumber)
{
  bool output = !relaisMerker[relaisNumber];
  if (client.connect (server, 80))
  {
    Serial.print ("connected to ");
    Serial.println (client.remoteIP());
    // Make a HTTP request:
    client.print ("GET /3000");
    switch (relaisNumber)
    {
      case 0:
        {
          client.print ("00/");
        }
        break;
      case 1:
        {
          client.print ("01/");
        }
        break;
      default:
        {
          Serial.println (F ("Es fehlt an einer Zuweisung!"));
        }
        break;
    }
    if (output)
    {
      client.print ("01");
    }
    else
    {
      client.print ("00");
    }
    client.println (" HTTP/1.1");
    client.println ("Host: 192.168.0.100");
    client.println ("Connection: close");
    client.println();
  }
  return (output);
}

noiasca:
wenn 85 auf sein Geburtsjahr schließen lässt, dann darf man das schon so schreiben :wink:

Da hast recht.

Au, so eine Annahme kann für komische Gedanken sorgen.
Frag mal wno158.
SCNR

Hallo Leute,

Ich suche wieder mal eure Hilfe!!!

Bin gerade dabei meinem Code eine Tasterabfrage hinzuzufügen, das soll so ablaufen, dass

an pin 2 der taster gedrückg wird und dann die ip adresse von relais 1 aufgerufen und das relais geschaltet wird.

Hier mal der code wie ich es versucht habe,

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server (192, 168, 0, 200);
IPAddress ip (192, 168, 0, 177);
EthernetClient client;
void setup()
{
  
  Ethernet.begin (mac, ip);
  if (client.connect (server, 80)){
   
    Serial.println (client.remoteIP());}
    delay (1000);}
void loop()
{

 if (digitalRead(2)) {
    client.println (GET /30000/01 HTTP/1.1);
  }
 
}

bekomme beim kompilieren aber nur die fehlermeldung
arduino_client_sketch:19:21: error: ‘GET’ was not declared in this scope

client.println (GET /30000/01 HTTP/1.1);

^~~

Bibliothek SPI in Version 1.0 im Ordner: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI wird verwendet

Bibliothek Ethernet in Version 2.0.0 im Ordner: C:\Program Files (x86)\Arduino\libraries\Ethernet wird verwendet

exit status 1

‘GET’ was not declared in this scope

ohne eine if bedingung funktioniert der code einwandfrei

Könnte mir jemand bitte weiterhelfen?

Funktionen wie println() erwarten als Argument eine Zeichenkette.
Hier hast Du ein paar Anführungszeichen - die darfst Du gerne verwenden:

""""""""""

Tatsache so ein einfacher fehler Danke Walter :wink:

Ok kompilieren hat funktioniert, nun habe ich den code mit einer if bedingung modifiziert und hochgeladen aber beim drücken vom taster an pin 2 passiert nichts!
ein beispiel mit relais 1 sekunde an und dann 1 sekunde aus hat ja bereits funktioniert
Den taster habe ich an Gnd und an 5V versucht, beides hat nicht funktioniert pullup habe ich auch versucht

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server (192, 168, 0, 200);
IPAddress ip (192, 168, 0, 177);
EthernetClient client;

void setup() {
   Ethernet.begin (mac, ip);
  if (client.connect (server, 80))
  {
   
    Serial.println (client.remoteIP());
  }
  delay (1000);
  pinMode(2, INPUT_PULLUP);
  pinMode(2, INPUT);
  digitalRead(2);

}

void loop() {
  if (!( digitalRead(2) )) {
    client.println ("GET /30000/01 HTTP/1.1");
  }
  else {
    client.println ("GET /30000/44 HTTP/1.1");
  }
}