Go Down

Topic: Keenso Ethernet Relais mit Arduino Steuern!!! (Read 308 times) previous topic - next topic

roadrunner85

Nov 22, 2020, 12:51 pm Last Edit: Nov 29, 2020, 03:51 pm by roadrunner85
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


michael_x

#1
Nov 22, 2020, 01:17 pm Last Edit: Nov 22, 2020, 01:18 pm by michael_x
Quote
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.

noiasca

der Webclient müsste schon passen.


auf was hast du das geändert:
Code: [Select]

//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?
Code: [Select]

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


am besten postest du deinen Code.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

roadrunner85

Code: [Select]

/*
  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?

noiasca

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
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

my_xy_projekt

#5
Nov 22, 2020, 03:08 pm Last Edit: Nov 22, 2020, 03:15 pm by my_xy_projekt Reason: ünnötige leerräume entfernt
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....
Code: [Select]

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

Quote
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.

roadrunner85

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!





noiasca

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?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

roadrunner85

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?


noiasca

ergänze mal hier eine Zeile:

Code: [Select]

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


how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

my_xy_projekt

aber eht klasse der Beispielsketch funktioniert!
oh - komplett blind auf Anhieb - da kann ich mich ja nachher noch belohnen...

Quote
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.
Code: [Select]

 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 ;(

roadrunner85

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!



Code: [Select]

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

my_xy_projekt

#13
Nov 22, 2020, 04:29 pm Last Edit: Nov 22, 2020, 04:31 pm by my_xy_projekt
wahnsinn ja komplett auf anhieb! ;D echt irre sowas!
Glück gehabt, das ich nichts anderes machen kann ausser Zeit zu vertreiben...

Quote
milis wäre in zukunft aber sicher sinnvoller
hier mal mein code!
Code: [Select]

// 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 -" ? ;)

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

Quote
und einfach mal ein paar delays dazwischen gehaut!


how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Go Up