Arduino Ethernet-Shield W5100 Funduino reagiert nicht mehr

Begonnen von abc2006, 21 Oktober 2017, 14:16:00

Vorheriges Thema - Nächstes Thema

abc2006

Hi,

ich habe zuhause eine Arduino-Zucht (4 Stück, einmal uno, dreimal nano) mit Ethernetshield (der Uno mit original-shield zum stecken, die nanos haben den Funduino W5100.

Ein nano läuft als 8-fach Onewire-Busmaster und aktualisiert über HTTP-Aufrufe Dummy-Variablen in FHEM.
Dieser und nur dieser funktioniert einwandfrei (wenn jemand Interesse hat, stell ichs auch gern ins wiki)

Bei allen anderen arduinos hab ich das Problem, dass das Ethernet-Shield irgendwann aufhört, auf Anfragen (arp,UDP usw.) zu antworten. Der Arduino läuft weiter (serielle Konsole gibt weiterhin Infos aus).

Hat von euch schonmal jemand sowasgehabt?

https://forum.fhem.de/index.php/topic,15780.msg269747.html#msg269747
Hier hat jemand ein ähnliches Problem gehabt, bei mir sind die Zeitspannen bis zum aufhängen unterschiedlich.

Mein Sketch:

#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


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x5F
};
IPAddress server(192,168,0,30);
IPAddress ip(192, 168, 0, 95);
EthernetClient client;

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,

unsigned int pinRelais[4]= { 5, 6, 7, 8 };
unsigned long ulDauerR[4]= { 0, 0, 0, 0};
unsigned int uiRState[4]= { HIGH, HIGH, HIGH, HIGH };
unsigned long ulROff[4]= {0, 0, 0, 0};

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long alive_previousMillis = 0;

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)
const long alive_interval = 60000;

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
/*  If you are using an Arduino Ethernet shield you cannot use the following pins on
/ *  the following boards. Firmata will ignore any requests to use these pins:
*
*  - Arduino Uno or other ATMega328 boards: (D4, D10, D11, D12, D13)
*  - Arduino Mega: (D4, D10, D50, D51, D52, D53)
*  - Arduino Leonardo: (D4, D10)
*  - Arduino Due: (D4, D10)
*  - Arduino Zero: (D4, D10)
//*/
void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
  // deaktiviere SPI:
  // http://forum.arduino.cc/index.php?topic=90133.msg760960#msg760960
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  // TI: Initialisieren
  //int i= 0;
  for(int i= 0; i < 4; i++)
  {
    pinMode(pinRelais[i], OUTPUT);
    digitalWrite(pinRelais[i], HIGH);
  }
 
  Serial.println("Hello, this is");
  Serial.println("HV_TIM_V02_UDP_UNO_4Relais_Millis");
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
//  Serial.println("my MAC Adress is:");
//  Serial.println(mac);
  Serial.println("my Port is: ");
  Serial.println(localPort);
}

void loop() {
  String url;

  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.println(packetSize);
    //IPAddress remote = Udp.remoteIP();
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE * sizeof(char));
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println(packetBuffer);
   
   
    // TI:
  // -48: ( 48 = '0'), sonst wandelt er in den ASCII-Code der Zahl um
  // -1: Index von Relais 1 ist 0 (Relais1, Relais2, Relais3, Relais4 ist jetzt Relais[0], Relais[1], Relais[2], Relais[3])
  int iRelais= (int)packetBuffer[0] - 48 - 1;
 
 
  // Dauer wird auch mehrfach gebraucht, also schon an dieser Stelle extrahieren
  // das macht die Funktion atol für uns, allerdings soll erst der Buffer ab Stelle '2' gewandelt werden
  unsigned long ulDauer = abs(atol((&packetBuffer[2])));

  Serial.print(" - ");
    //delay(10);

    // wir senden die Antwort erst nach der Fehlerüberprüfung:
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(packetBuffer);
    Udp.endPacket();



   
    if(iRelais > 3)
    {
      Serial.print("Relais-Index out of Range!");
      // hier noch irgendwas machen?
    }
    else
    {
          ulDauerR[iRelais]= ulDauer;
          uiRState[iRelais]= LOW;
          digitalWrite(pinRelais[iRelais], uiRState[iRelais]);
     
          //aktuelle Zeit:
          Serial.print("on: ");
          Serial.println(millis());
     
          // und wann müssen wir wieder ausschalten?
          ulROff[iRelais]= millis() + ulDauerR[iRelais];
   
    }
   
  } // end if (packetSize)

  for(int i= 0; i < 4; i++)
  {
    // TI: Wichtig: erst den State abfragen, dann die Zeit vergleichen.
    // Wenn die State-Abfrage FALSE ist, wird die Zeit gar nicht erst verglichen
    // Da für den Zeitvergleich jedesmal ein Funktionsaufruf erfolgt, ist dieser Vergleich
    // zeit- und rechenintensiver. Das macht für Deine Heizungssteuerung vermutlich keinen merkbaren
    // Unterschied, aber generell ist das Best-Practice (falls Du später mal eine Rakete steuern möchtets, oder so ;-)
    if((uiRState[i] == LOW) && (millis() > ulROff[i]))
    {
      uiRState[i]= HIGH;
      digitalWrite(pinRelais[i], uiRState[i]);
      Serial.print("off: ");
      Serial.println(millis());
    }
   
   
  }
 
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    // save the last time of execution
    Serial.print("##");
    Serial.print(millis());
    Serial.println("##");
  }
  if (currentMillis - alive_previousMillis >= alive_interval)
    {
      // save the last time of execution
      alive_previousMillis = currentMillis;
      if (client.connect(server, 8083)) {
        client.print("GET /fhem?cmd=setreading%20DF_controlVL%20");
        client.print(Ethernet.localIP());
        client.print("%20");
        client.print(millis());
        client.println("&XHR=1");
        client.println("Connection: close");
        client.println();
        Serial.println("Heartbeat transmitted");
        //delay(500); // give fhem time to work, at least a little
        // close any connection before send a new request.
        // This will free the socket on the WiFi shield
        client.stop();
      }
    }
} // end loop


Bin für alle Ideen dankbar, die mir helfen, das stabil zum laufen zu bekommen. Wenn das Ding dauernd abstürzt, hab ich leider nix gewonnen...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Beta-User

Helfen kann ich nicht, aber verschiebe den Thread doch mal in die Bastelecke.
Den Bezug zu PI & Co kann ich jedenfalls nicht erkennen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

abc2006

Kein Problem, verschiebe ich in die Bastelecke ...

Zu Raspi nicht, aber das Forum heisst ja auch nicht "raspberry pi" ...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Beta-User

Zitat von: abc2006 am 21 Oktober 2017, 15:54:58
Zu Raspi nicht, aber das Forum heisst ja auch nicht "raspberry pi" ...
Auf die Idee bin ich gekommen, weil es in der Übersicht zum Forum heißt:
FHEM auf Einplatinencomputern (z.B. Raspberry Pi, Beagle Bone, etc.)
Arduino ist zwar auch eine Art Minirechner, aber sowas ist eben erfahrungsgemäß hier im Forum eher in der Bastelecke zu finden. Aber wie immer: jeder wie er mag ;)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

abc2006

Kein Problem, immer dahin, wo es die meisten lesen, die helfen könnten ...

Nur: Ich darf leider nicht verschieben. Admin? Oder soll ich hier schließen und einen neuen aufmachen?


Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Beta-User

nee, ersten Beitrag im Thread editieren, dann sollte es gehen (unten links, soweit ich mich erinnere)...

Siehe auch die Hinweise in dem in meiner Signatur verlinkten Thread.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files