Überprüfung ob Lankabel angeschlossen ist

Gibt es eine möglichkeit permanent zu prüfen ob das Lankabel angeschlossen ist oder ob nicht?
möchte eine fehlermeldung ausgeben wenn die verbindung zum Rooter unterbrochen wurde.

Sowas?

genau er soll immer überprüfen ob das lankabel angeschlossen ist und wenn nicht soll mir das als signal via led angezeigt werden.

leider funktioniert das nicht wie es soll. es zeigt mir immer an das kein kabel angeschlossen ist.

void loop() {
  
  if(client.available()){
    pixels.setPixelColor(0, pixels.Color(0,0,10));
    pixels.setPixelColor(1, pixels.Color(0,0,20));
    pixels.setPixelColor(2, pixels.Color(0,0,40));
    pixels.setPixelColor(3, pixels.Color(0,0,80));
    pixels.setPixelColor(4, pixels.Color(0,0,160));
    pixels.show();
  }
  if (!client.connected()) {
    pixels.setPixelColor(0, pixels.Color(10,0,0));
    pixels.setPixelColor(1, pixels.Color(20,0,0));
    pixels.setPixelColor(2, pixels.Color(40,0,0));
    pixels.setPixelColor(3, pixels.Color(80,0,0));
    pixels.setPixelColor(4, pixels.Color(160,0,0));
    pixels.show();
  }
.....
}

psyqjo:
Gibt es eine möglichkeit permanent zu prüfen ob das Lankabel angeschlossen ist oder ob nicht?
möchte eine fehlermeldung ausgeben wenn die verbindung zum Rooter unterbrochen wurde.

Mit dem W5100 auf dem standardmäßigen Ethernet-Shield kannst Du keinen echten "Kabel eingesteckt" Test durchführen. Das soll wohl mit den Chips W5200 und W5500 möglich sein, die auf einigen wenigen, alternativen Ethernet-Shields verbaut sind, und die andere Ethernet-Libraries benötigen.

Mit dem normalen W5100 Ethernet-Shield kannst Du allenfalls prüfen, ob irgendein Gerät in Deinem Netzwerk erreichbar ist, z.B. Dein Router. Du könntest z.B. ein ICMP ECHO Paket an die IP-Adresse Deines Routers senden, und testen, ob innerhalb einer bestimmten (kurzen) Zeit das Echo zurückkommt.

Allerdings würdest Du damit nicht nur testen, ob das Kabel am Ethernet-Shield eingesteckt ist, sondern der Test würde nur dann erfolgreich sein, wenn auch das Kabel am Ehternet-Router eingesteckt ist und der Router auch eingeschaltet ist und funktioniert.

Zum Senden von ICMP Echo Requests mit einem Arduino gibt es beispielsweise die ICMP Ping Library von Blake Foster.

Da sollten wir nochmal genauer auseinandernehmen: Willst du nur wissen, ob generell Verbindung zum Ethernet besteht oder soll auch geprüft werden, ob da auch einer zuhört?

Ersteres ist z.B. bereits dann der Fall, wenn das Kabel einfach nur in einem Switch steckt. Letzteres erfordert tatsächlich eine "stehende" TCP-Verbindung, einen PING oder die Antwort eines Partners z.B. auf eine UDP-Message ...

Ob einfach nur das Kabel drin ist, müsste sich aus dem Ethernet-Shield auslesen lassen, denn der schaltet schliesslich mehrere LEDs ein und aus - das sollte sich irgendwie ermitteln lassen.

Morgen erstmal, also im grunde möchte ich mit dem verbindungstest nur Prüfen ob das Kabel zwischen rooter und arduino verbunden ist. in dem fall wenn es verbunden ist soll die funktion noSig() ofgerufen werden, anderenfalls die funktion noLan().

Wenn jetzt wärend der vorhandenen verbindung kein signal in form von Artnet protokoll gelesen wird soll die funktion von colorwire() zu noSig() springen, das im grunde funktioniert derzeit schon recht gut.

nur wenn jetzt die verbindung auf noSig() springt, soll auch überprüft werden warum also ist kein Lan kabel angeschlossen oder ob einfach nur kein Artnet Protokoll gesendet wird. um falle das kein Lan kabel angeschlossen wird soll dann in die funktion noLan gewechselt werden.

soweit eigendlich die erklärung wie was geht, hier nun der Code dazu im nächsten post.

#include <DMXSerial.h>

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#include <ICMPPing.h>

#include <Adafruit_NeoPixel.h>
#define PIN            8
#define NUMPIXELS      5
unsigned long interval=100;  // the time we need to wait
unsigned long previousMillis=0;
unsigned long blinkM=0;
uint16_t Online = false;
unsigned long timeout=0;

// current Color in case we need it
uint16_t currentPixel = 0;// what pixel are we operating on
uint16_t rev = 0;
uint16_t Err = 0;
uint16_t blinkMillis = false;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define ARTNET_UNIVERSE 0
#define ARTNET_SUBNET 0

#define ARTNET_PORT 0x1936
#define ARTNET_BUFFER_MAX 600
#define ARTNET_REPLY_SIZE 239
#define ARTNET_ADDRESS_OFFSET 18
#define ARTNET_ARTDMX 0x5000
#define ARTNET_ARTPOLL 0x2000

//#define DMX_PIN 3



#define IP_A 192
#define IP_B 168
#define IP_C 178
#define IP_D 46

//network addresses
byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
IPAddress ip(IP_A, IP_B, IP_C, IP_D);
IPAddress gateway(IP_A, IP_B, IP_C, 1);
IPAddress subnet(255, 0, 0, 0);
IPAddress broadcast_ip(10, 255, 255, 255);
IPAddress pingAddr(IP_A, IP_B, IP_C, 1);
// buffer
unsigned char packetBuffer[ARTNET_BUFFER_MAX];
SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));



EthernetUDP eUDP;


int verbose = 0;


int monitorstate = LOW;
int monitorpin = 5;


EthernetClient test;


void setup() {
  pixels.begin();
  pixels.setPixelColor(0, pixels.Color(0,0,0));
  pixels.show();
  Ethernet.begin(mac,ip, gateway, gateway, subnet);
  
  
  currentPixel = 0;
  testLan();


  
  
  
 
  eUDP.begin(ARTNET_PORT);
  
 
   DMXSerial.init(DMXController);
  
  
  pinMode(monitorpin, OUTPUT);
  digitalWrite(monitorpin, monitorstate);
  
  delay(1000);
  
  sendArtNetReply();
}

/* artDMXReceived checks the universe and subnet then
   reads the first three dimmer levels and sets the
   analog level of the output pins.                   */

void artDMXReceived(unsigned char* pbuff) {
  if ( (pbuff[14] & 0xF) == ARTNET_UNIVERSE ) {
    if ( (pbuff[14] >> 8) == ARTNET_SUBNET ) {
      int numberOfDimmers = pbuff[16]*256 + pbuff[17];  //number of dimmers hi byte first
      int i;
      for (i=0; i<numberOfDimmers; i++) {
        
         DMXSerial.write(i+1, pbuff[ARTNET_ADDRESS_OFFSET+i]);       
        
      }
    }
  }
  if ( monitorstate == LOW ) {
    monitorstate = HIGH;
  } else {
    monitorstate = LOW;
  }
  digitalWrite(monitorpin, monitorstate);
}



void sendArtNetReply() {
  unsigned char  replyBuffer[ARTNET_REPLY_SIZE];
  int i;
  for ( i=0; i<ARTNET_REPLY_SIZE; i++ ) {
    replyBuffer[i] = 0;
  }
  replyBuffer[0] = 'A';
  replyBuffer[1] = 'r';
  replyBuffer[2] = 't';
  replyBuffer[3] = '-';
  replyBuffer[4] = 'N';
  replyBuffer[5] = 'e';
  replyBuffer[6] = 't';
  replyBuffer[7] = 0;
  replyBuffer[8] = 0;        //op code lo-hi
  replyBuffer[9] = 0x21;      
  replyBuffer[10] = IP_A;      //ip address
  replyBuffer[11] = IP_B;
  replyBuffer[12] = IP_C;
  replyBuffer[13] = IP_D;
  replyBuffer[14] = 0x36;    // port lo first always 0x1936
  replyBuffer[15] = 0x19;
  replyBuffer[16] = 0;      //firmware hi-lo
  replyBuffer[17] = 0;
  replyBuffer[18] = 0;      //subnet hi-lo
  replyBuffer[19] = 0;
  replyBuffer[20] = 0;      //oem hi-lo
  replyBuffer[21] = 0;
  replyBuffer[22] = 0;      //ubea
  replyBuffer[23] = 0;      //status
  replyBuffer[24] = 'x';    //     ESTA Code 'lx' = Claude Heintz Design
  replyBuffer[25] = 'l';    //     seems DMX workshop reads these bytes backwards
  replyBuffer[26] = 'A';    //short name
  replyBuffer[27] = 'r';
  replyBuffer[28] = 'd';
  replyBuffer[29] = 'u';
  replyBuffer[30] = 'i';
  replyBuffer[31] = 'n';
  replyBuffer[32] = 'o';
  replyBuffer[33] = 0;
  replyBuffer[44] = 'A';    //long name
  replyBuffer[45] = 'r';
  replyBuffer[46] = 'd';
  replyBuffer[47] = 'u';
  replyBuffer[48] = 'i';
  replyBuffer[49] = 'n';
  replyBuffer[50] = 'o';
  replyBuffer[51] = 0;
  replyBuffer[173] = 1;    //number of ports
  replyBuffer[174] = 128;  //can output from network
  replyBuffer[182] = 128; //good output... change if error
  replyBuffer[190] = ARTNET_UNIVERSE + 16*ARTNET_SUBNET;
  
  eUDP.beginPacket(broadcast_ip, ARTNET_PORT);
  int test = eUDP.write(replyBuffer,ARTNET_REPLY_SIZE);
  eUDP.endPacket();
}

/*  artNetOpCode checks to see that the packet is actually Art-Net
    and returns the opcode telling what kind of Art-Net message it is.  */

int artNetOpCode(unsigned char* pbuff) {
  String test = String((char*)pbuff);
  if ( test.equals("Art-Net") ) {
    if ( pbuff[11] >= 14 ) {            //protocol version [10] hi byte [11] lo byte
      return pbuff[9] *256 + pbuff[8];  //opcode lo byte first
    }
  }
  
  return 0;
}



void loop() {
  int packetSize = eUDP.parsePacket();


  
  if( packetSize )
  {

   

    
    eUDP.read(packetBuffer,ARTNET_BUFFER_MAX);
    
    int opcode = artNetOpCode(packetBuffer);
    
    Err =0;
    if(Err==0){
      Online = true;
    }
    
    if ((unsigned long)(millis() - previousMillis) >= interval) {
        previousMillis = millis();
        colorWipe();
        timeout= millis();
        }
    if ( opcode == ARTNET_ARTDMX ) {
      artDMXReceived(packetBuffer);
    } else if ( opcode == ARTNET_ARTPOLL ) {
      sendArtNetReply();
    }
  }
  else{
    if ((unsigned long)(millis() - timeout) >= 3000) {
        Err=1;
        
        if(Err== 1 && (unsigned long)(millis() - timeout) >= 3000){
          testLan();
        }
        }
        if(Err==1 && Online == true){
          if ((unsigned long)(millis() - previousMillis) >= interval*3) {
        previousMillis = millis();
        noSig();
        
        timeout= millis();
        }
        if ((unsigned long)(millis() - blinkMillis) >= interval*4) {
        blinkMillis = millis();
        
        blinkSig();
        
        }
        }
        if(Err==1 && Online == false){
          if ((unsigned long)(millis() - previousMillis) >= interval*2) {
        previousMillis = millis();
        noLan();
        
        timeout= millis();
        }
        }
  }
    
}


void colorWipe(){
  
  if(rev==1){
    pixels.setPixelColor(currentPixel,0,0,20);
  pixels.show();
  currentPixel++;
  if(currentPixel == NUMPIXELS){
    currentPixel = 0;
    rev=0;
  }
  }
  else{
  pixels.setPixelColor(currentPixel,0,0,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == NUMPIXELS){
    currentPixel = 0;
    rev=1;
}
}
}
  

void colorWipe1(){
  
  if(rev==1){
    pixels.setPixelColor(currentPixel,100,0,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == NUMPIXELS){
    currentPixel = 0;
    rev=0;
  }
  }
  else{
  pixels.setPixelColor(currentPixel,0,0,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == NUMPIXELS){
    currentPixel = 0;
    rev=1;
}
}
}


void colorWipe2(){
  
  
    pixels.setPixelColor(currentPixel,0,0,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == NUMPIXELS){
    currentPixel = 0;
    rev=0;
  }
  }
  
void noSig(){
  //blinkMillis
  if(rev==1){
    pixels.setPixelColor(3,0,0,0);
    pixels.setPixelColor(4,0,0,0);
    pixels.setPixelColor(currentPixel,0,50,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == 3){
    currentPixel = 0;
    rev=0;
  }
  }
  else{
  pixels.setPixelColor(currentPixel,0,0,0);
  pixels.show();
  currentPixel++;
  if(currentPixel == 3){
    currentPixel = 0;
    rev=1;
}
}
}

void noLan(){
  
  if(rev==1){
    pixels.setPixelColor(0,50,0,0);
    pixels.setPixelColor(1,50,0,0);
    pixels.setPixelColor(2,0,0,0);
    pixels.setPixelColor(3,50,0,0);
    pixels.setPixelColor(4,50,0,0);
  pixels.show();
  rev=0;
  
  }
  else{
  pixels.setPixelColor(0,0,0,0);
    pixels.setPixelColor(1,0,0,0);
    pixels.setPixelColor(2,50,0,0);
    pixels.setPixelColor(3,0,0,0);
    pixels.setPixelColor(4,0,0,0);
  pixels.show();
  rev=1;
}
}
void blinkSig(){
  if(blinkM == 0){
    pixels.setPixelColor(3,0,0,0);
    blinkM=1;
  pixels.show();
  }
  else{
    pixels.setPixelColor(3,0,0,50);
    blinkM=0;
  pixels.show();
  }
  
}



void testLan(){
  ICMPEchoReply echoReply = ping(pingAddr, 2);
  if (echoReply.status == SUCCESS)
  {
    Online = true;
    
  }
  else
  {
    Online = false;
  }
  
}
/*
    Revision History
    v1.0 initial release January 2014
    v1.1 added monitor LED to code and circuit

*/

nun leider besteht das Problem immernch, aber hätte evtl einen neuen ansatz, könnte man die status led am Ethernet shield einfach abfragen? die leuchtet ja sobald ein Lankabel angeschlossen ist, bzw eine verbindung zu irgend einem gerät esteht.
Sprich kann man die Link led abfragen?

Irgendwer obzw. irgendwas schaltet die LED ja ein. Wenn die Ethernet-Lib darauf keinen Zugriff gibt, gehts z.B. mit Assembler ganz bestimmt. Das Problem: Du musst genau wissen, was du tust, quasi mit dem Ethernet-Controller auf unterster Ebene “reden” - technisch ganz bestimmt machbar, ist aber mit viel Detailwissen verbunden.

Du könntest auch “das Brett an der dünnsten Stelle bohren” - :slight_smile:

Variante a) lege einfach eine Verbindung von einem Anschluss der Ethernet-LED zu einem freien Arduino-Pin (der auf Eingabe steht) … Musst halt checken, ob die LED gegen Plus oder Minus geschaltet wird … eigentlich kannst du dabei Nichts kaputt machen (evtl. Vorwiderstand 1k). Wenn der Signalhub für einen Digitalpin nicht reicht - an einem ADC-Eingang merkst du in jedem Falle eine Änderung.

Variante b) ersetze die LED durch einen Optokoppler, den kannst du in jedem Falle auswerten …

hi,

Variante b) ersetze die LED durch einen Optokoppler, den kannst du in jedem Falle auswerten ...

oder Du mißt die helligkeit der LED mit einem lichtempfindlichen widerstand, da mußt Du nix am shield ändern.

gruß stefan

also doch löten, dann würde ich einfach versuchen eine leitung vom minuspol der led zu löten und sie an einem der Analog In pins zu verbinden.

oder ich löte einfach ein dünnes kabel an den pluspol der led in der rj45 buchse. die beginnt auch zu leuchten wenn ich das kabel einstecke.
am ende lese ich das ein mit:

void setup() {
  
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  
}

hi,

nein, ich meinte eben nicht löten, sondern einfach einen lichtempfindlichen widerstand über die led und den messen.

gruß stefan

Und ich meinte das auch nicht!

hi,

Und ich meinte das auch nicht!

womit? finde Deinen post nicht…

gruß stefan

Eisebaer:
hi,
womit? finde Deinen post nicht...

gruß stefan

Dir kann geholfen werden!

hi,

aaah, der andere thread. verwirrende sache...

gruß stefan

Eisbaer, hast du mir zu deinem ansatz denn eine bauteilbezeichnung? also eine nummer unter der ich solch einen lichtempfindlichen wiederstand im inet finde oder beim elektrofachmarkt um die ecke besorgen kann?

Ich hab das problem jetzt einfach mit kurzem löten von einem kleinen lötpunkt am minus pol der 100M led erledigt, dort habe ich ein kleines kabel angelötet welches auf die unterseite führt und die verbindung mittels 1k Wiederstand an den A0 Port vollendet. das hat dem board und mir nicht weh getan und funktioniert 1A. jetzt messe ich einfach für meine funktion den Stromwert des am A0 anliegend stroms der 100M led.
Dabei habe ich gemerkt, dass wenn die led leuchtet ein strom von ca. 0,1V fliest. wenn aber die led aus ist fliest ein strom höher als 3V. das kann ich mir nun zu nutze machen und dementsprechend die werte an meine Variablen senden.