Arduino Nano V3.0 + ENC28j60 + Webserver + RC-Switch....

Hi ihr µler :wink:

Ich bin seit ca. 3 Wochen auch dabei und bin begeistert!
Allerdings war mir "damals" nicht bewusst das es verschiedene Netzwerk Chipsätze gibt und bin daher auf den ENC28j60 gekommen.
Jetzt habe ich schon viel Zeit mit der Suche nach einer brauchbaren Lib vertan.....

Habe dann ja auch eine gefunden die mir brauchbar erschien, damit habe ich auch ein kleinen Webserver zum laufen gebracht.
Nun habe ich aber das Problem sobald ich über rc-switch ein Steuersignal ausgebe das sich der Server weghängt da die Variable rec voll gespämmt wird und ich kann es nicht nachzuvollziehen wie das zustande kommt.

Ich hoffe das mir hier Jemand mit mehr Erfahrung helfen kann.

Soo hier der Code:

#include <etherShield.h>
#include <ETHER_28J60.h>
#include <RCSwitch.h>

//Netzwek Conf
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {192, 168, 0, 88};
static uint16_t port = 80;

// RCSwitch Conf
RCSwitch mySwitch = RCSwitch();
int RCTransmissionPin = 12;

ETHER_28J60 e;

void setup()
{ 
  Serial.begin(9600);
  e.setup(mac, ip, port);
  mySwitch.enableTransmit( RCTransmissionPin );
}

void loop()
{
  char* rec;
  int recint;
  if (rec = e.serviceRequest()){
//-----------------------------------------Webseite--------------------------------------//        
        e.print("<html><head><title>Arduino HomeContol</title></head><body>");
        e.print("<center><hr>");
        e.print("<H1><h1>Willkommen bei den Arduino HomeContol</h1></H1>");
        e.print("</center><hr>");
        e.print("</body></html>");
        e.respond();
    
   
   
    recint = atoi(rec);
    if (recint > 0 ){
      Serial.print("Eingehendes Request = " );
      Serial.println (recint);
      Serial.print("Ausgeloeste Funktion: ");
      switch (recint) {
//-------------------------------------Housecode 10000------------------------------------//
	case 110:
          mySwitch.switchOff("10000", 1);
          Serial.println("Dose 1 OFF");
          //ReplyBuffer = "Dose 1 OFF";
        break;
        
	case 111:
          mySwitch.switchOn("10000", 1);
          Serial.println("Dose 1 ON");
          //ReplyBuffer = "Dose 1 ON";
        break;     
//-----------------------------------------------//
        case 120:
          mySwitch.switchOff("10000", 2);
          Serial.println("Dose 2 OFF");
          //ReplyBuffer = "Dose 2 OFF";
        break;
        
        case 121:
          mySwitch.switchOn("10000", 2);
          Serial.println("Dose 2 ON");
          //ReplyBuffer = "Dose 2 ON";
        break;
//-----------------------------------------------//             
        case 130:
          mySwitch.switchOff("10000", 3);
          Serial.println("Dose 3 OFF");
          //ReplyBuffer = "Dose 3 OFF";
        break;
        
        case 131:
          mySwitch.switchOn("10000", 3);
          Serial.println("Dose 3 ON");
          //ReplyBuffer = "Dose 3 ON";
        break;
//-----------------------------------------------//        
        case 140:
          mySwitch.switchOff("10000", 4);
          Serial.println("Dose 4 OFF");
          //ReplyBuffer = "Dose 4 OFF";
        break;
        
        case 141:
          mySwitch.switchOn("10000", 4);
          Serial.println("Dose 4 ON");
          //ReplyBuffer = "Dose 4 ON";
        break;
//-----------------------------------------------//        
        case 150:
          mySwitch.switchOff("10000", 5);
          Serial.println("Dose 5 OFF");
          //ReplyBuffer = "Dose 5 OFF";
        break;
        
        case 151:
          mySwitch.switchOn("10000", 5);
          Serial.println("Dose 5 ON");
          //ReplyBuffer = "Dose 5 ON";
        break;
        
 //-------------------------------------Housecode 11000------------------------------------//
        case 210:
          mySwitch.switchOff("11000", 1);
          Serial.println("Dose 6 OFF");
          //ReplyBuffer = "Dose 6 OFF";
        break;
        
        case 211:
          mySwitch.switchOn("11000", 1);
          Serial.println("Dose 6 ON");
          //ReplyBuffer = "Dose 6 ON";
        break;       
//-----------------------------------------------//        
        case 220:
          mySwitch.switchOff("11000", 2);
          Serial.println("Dose 7 OFF");
          //ReplyBuffer = "Dose 7 OFF";
        break;
        
        case 221:
          mySwitch.switchOn("11000", 2);
          Serial.println("Dose 7 ON");
          //ReplyBuffer = "Dose 7 ON";
        break;
//-----------------------------------------------//       
        case 230:
          mySwitch.switchOff("11000", 3);
          Serial.println("Dose 8 OFF");
          //ReplyBuffer = "Dose 8 OFF";
        break;
        
        case 231:
          mySwitch.switchOn("11000", 3);
          Serial.println("Dose 8 ON");
          //ReplyBuffer = "Dose 8 ON";
        break;        
//-----------------------------------------------//        
        case 240:
          mySwitch.switchOff("11000", 4);
          Serial.println("Dose 9 OFF");
          //ReplyBuffer = "Dose 9 OFF";
        break;
     
        case 241:
          mySwitch.switchOn("11000", 4);
          Serial.println("Dose 9 ON");
          //ReplyBuffer = "Dose 9 ON";
        break;     
//-----------------------------------------------//        
        case 250:
          mySwitch.switchOff("11000", 5);
          Serial.println("Dose 10 OFF");
          //ReplyBuffer = "Dose 10 OFF";
        break;
        
        case 251:
          mySwitch.switchOn("11000", 5);
          Serial.println("Dose 10 ON");
          //ReplyBuffer = "Dose 10 ON";
        break;
        
//-----------------------------------------Stellung A------------------------------------//
	case 810:
          mySwitch.sendTriState("1FFF1FF00001");
          Serial.println("Dose 11 OFF");
          //ReplyBuffer = "Dose 11 OFF";
        break;
        
	case 811:
          mySwitch.sendTriState("1FFF1FF00010");
          Serial.println("Dose 11 ON");
          //ReplyBuffer = "Dose 11 ON";
        break;        
//-----------------------------------------------//
        case 820:
          mySwitch.sendTriState("1FFFF1F00001");
          Serial.println("Dose 12 OFF");
          //ReplyBuffer = "Dose 12 OFF";
        break;
        
	case 821:
          mySwitch.sendTriState("1FFFF1F00010");
          Serial.println("Dose 12 ON");
          //ReplyBuffer = "Dose 12 ON";
        break;        
//-----------------------------------------------//
        case 830:
          mySwitch.sendTriState("1FFFFF100001");
          Serial.println("Dose 13 OFF");
          //ReplyBuffer = "Dose 13 OFF";
        break;
        
	case 831:
          mySwitch.sendTriState("1FFFFF100010");
          Serial.println("Dose 13 ON");
          //ReplyBuffer = "Dose 13 ON";
        break;
        
//-----------------------------------------Stellung B------------------------------------//
	case 910:
          mySwitch.sendTriState("F1FF1FF00001");
          Serial.println("Dose 14 OFF");
          //ReplyBuffer = "Dose 14 OFF";
        break;
        
	case 911:
          mySwitch.sendTriState("F1FF1FF00010");
          Serial.println("Dose 14 ON");
          //ReplyBuffer = "Dose 14 ON";
        break;        
//-----------------------------------------------//
        case 920:
          mySwitch.sendTriState("F1FFF1F00001");
          Serial.println("Dose 15 OFF");
          //ReplyBuffer = "Dose 15 OFF";
        break;
        
	case 921:
          mySwitch.sendTriState("F1FFF1F00010");
          Serial.println("Dose 15 ON");
          //ReplyBuffer = "Dose 15 ON";
        break;        
//-----------------------------------------------//
        case 930:
          mySwitch.sendTriState("F1FFFF100001");
          Serial.println("Dose 16 OFF");
          //ReplyBuffer = "Dose 16 OFF";
        break;
        
	case 931:
          mySwitch.sendTriState("F1FFFF100010");
          Serial.println("Dose 16 ON");
          //ReplyBuffer = "Dose 16 ON";
        break;
        
    }  
    Serial.println("//=============================================//");
//    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
//    Udp.write(ReplyBuffer);
//    Udp.endPacket();
  }
 }

//----------------------------------------------------------



    
  
  delay(10);        
}    



///----------------------------------------------------------

Hier noch Paar Bilder zu den Ding :wink:

Gruß
Shojo

Könnte Dein Problem ectl. sein, das Du den Pin12 für die RC-Switch Lib verwendest? Den Pin12 gehört zum SPI Bus (D11 - D13 (MOSI , MISO und SCK))
Zusätzlich verwendet Dein Shield noch D10 als Chipselect soweit ich weiss.
Verwende mal einen anderen Pin für die RC-Switch Lib.

Mario.

Danke für dein Tipp!

Aber das hatte ich auch schon probiert er liegt normalerweise auf Pin 5 hatte den jetzt nur mal testweise da liegen.

//Edit:
So habe es trotzdem noch mal auf Pin3 gesetzt, hat leider auch nicht gebracht :frowning:

   SI RVA
   SI RVA
   SI RVA
   SI RVA
   SI RVA

Gruß

Funktioniert denn der Sketch wenn Du nicht über die RC-Lib schaltest, sondern nur die Ausgaben auf die serielle Konsole ausgibst?
Poste mal bitte einen Link zu der Ethernet-Lib.

Ja der Fehler kommt nur wenn die RC-Lib zu tragen kommt.....

Hier die Libs http://www.the-intruder.net/filebase/libraries

Niemand mehr eine Idee?

Ich probiere schon die ganzen Tage rum und komme nicht weiter :frowning:

Gruß
Dennis

Nun habe ich aber das Problem sobald ich über rc-switch ein Steuersignal ausgebe das sich der Server weghängt da die Variable rec voll gespämmt wird und ich kann es nicht nachzuvollziehen wie das zustande kommt.

Kannst Du das etwas genauer erklären. Was meinst Du mit "rec" volgespammt? Stehen denn ohne RC-Lib in *rec die per URL übergebenen Parameter drin? Wie sieht denn die URL aus, die Du übermittelst? Und was steht am Ende in *rec? Soweit ich die ENC28J60 Lib verstehe, werden in einem 32-Byte Puffer die an die URL per "?key=value" Paramerter durch die Funktion e.serviceRequest() zurückgeliefert.

mkl0815:
Kannst Du das etwas genauer erklären. Was meinst Du mit "rec" volgespammt? Stehen denn ohne RC-Lib in *rec die per URL übergebenen Parameter drin? Wie sieht denn die URL aus, die Du übermittelst? Und was steht am Ende in *rec? Soweit ich die ENC28J60 Lib verstehe, werden in einem 32-Byte Puffer die an die URL per "?key=value" Paramerter durch die Funktion e.serviceRequest() zurückgeliefert.

Wenn ich die URL 192.168.0.88/110 anfordere wir in rec auch 110 ausgegeben mit Glück läuft das auch einmal sauber aber dann kommt immer nonstop der wert **SI RVA ** rein bis das ding dann abstützt , aber wie gesagt nur wenn die RC-Lib ins spiel kommt .
Ohne die RC-Lib wird der wert auch immer sauber übergeben ohne jeglichen Fehler egal wie oft ich das mache...

Ich bin kurz davor das alles mit meinen Uno + W5100 Ethernet Shield zu machen und das ding in der Grütze zu hauen.....

An welcher Stelle wird denn das "SI RVA" ausgegeben? Durch den folgenden Code:

    if (recint > 0 ){
      Serial.print("Eingehendes Request = " );
      Serial.println (recint);
      Serial.print("Ausgeloeste Funktion: ");

Oder an einer anderen Stelle. Hast Du mal versucht den Code auf nur einen übergebenen Wert zu kürzen? Also sowas wie:

#include <etherShield.h>
#include <ETHER_28J60.h>
#include <RCSwitch.h>

//Netzwek Conf
static uint8_t mac[6] = {
  0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {
  192, 168, 0, 88};
static uint16_t port = 80;

// RCSwitch Conf
RCSwitch mySwitch = RCSwitch();
int RCTransmissionPin = 12;

ETHER_28J60 e;

void setup()
{ 
  Serial.begin(9600);
  e.setup(mac, ip, port);
  mySwitch.enableTransmit( RCTransmissionPin );
}

void loop()
{
  Serial.println("loop start");
  Serial.flush();
  char* rec;
  int recint;
  if (rec = e.serviceRequest()){
    Serial.println("Request recieved");
    Serial.flush();
    //-----------------------------------------Webseite--------------------------------------//        
    e.print("<html><head><title>Arduino HomeContol</title></head><body>");
    e.print("<center><hr>");
    e.print("<H1><h1>Willkommen bei den Arduino HomeContol</h1></H1>");
    e.print("</center><hr>");
    e.print("</body></html>");
    e.respond();

    Serial.println("Respond sent");
    Serial.flush();


    recint = atoi(rec);
    Serial.println("recint parsed");
    Serial.flush();    

    if (recint > 0 ){
      Serial.print("Eingehendes Request = " );
      Serial.println (recint);
      Serial.print("Ausgeloeste Funktion: ");
      Serial.flush();    
      switch (recint) {
        //-------------------------------------Housecode 10000------------------------------------//
      case 110:
        mySwitch.switchOff("10000", 1);
        Serial.println("Dose 1 OFF");
        Serial.flush();    
        //ReplyBuffer = "Dose 1 OFF";
        break;



      }  
      Serial.println("//=============================================//");
    }
  }

  //----------------------------------------------------------


  Serial.println("loop ende");
  Serial.flush();



  delay(10);        
}    



///----------------------------------------------------------

Zusätzlich habe ich mal noch debug-Ausgaben eingebaut. Wenn der Fehler da auftritt, sollte man sehen an welcher Stelle im Code die Ausgabe passiert.
Funktioniert denn die RC-Switch Lib ohne der Webserver? Kannst Du also die Dosen schalten?

Habe zum auslesen des Fehlers noch ein Serial.println gesetzt

void loop()
{
  char* rec;
  int recint;
  if (rec = e.serviceRequest()){ 
//-----------------------------------------Webseite--------------------------------------//        
        e.print("<html><head><title>Arduino HomeContol</title></head><body>");
        e.print("<center><hr>");
        e.print("<H1><h1>Willkommen bei den Arduino HomeContol</h1></H1>");
        e.print("</center><hr>");
        e.print("</body></html>");
        e.respond();
    
   
    Serial.println (rec); // <-----------[b] an dieser stelle lese ich den Fehler aus hattet das in oberen Post nicht mit drinnen.  [/b]
    recint = atoi(rec);

Der Fehler besteht auch im gekürzten Code ....

loop start
loop ende
loop start
loop ende
loop start
loop ende
loop start
Request recieved
Respond sent
recint parsed
Eingehendes Request = 110
Ausgeloeste Funktion: Dose 1 OFF
//=============================================//
loop ende
loop start
loop ende
loop start
loop ende
loop start
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
loop ende
loop start
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
loop ende
loop start
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende
loop start
Request recieved
Respond sent
recint parsed
loop ende

mkl0815:
Funktioniert denn die RC-Switch Lib ohne der Webserver? Kannst Du also die Dosen schalten?

Oh hatte ich glatt überlesen :wink:
Jein ich muss ja irgend wie den Steuerbefehl geben, hatte das ja auf den W5100 Chipse mit udp am laufen das geht ohne Probleme.
Allerdings hatte ich es auch mal via udp mit den enc28j60 probiert gleicher Fehler....

Danke noch mal für deine Untersützung!

Bau doch einefach einen Sketch, der alle 10 Sekunden eine Dose ein und nach 10 Sekunden wieder ausschaltet, oder der die Befehle über die serielle Konsole entgegennimmt.
Hauptsache die ENC28J60 Lib ist nicht im Sketch.

Achso so meiste das ja das läuft

Ich tippe auf überlaufenden RAM. Der ENC28j60 hat keinen TCP-Stack und die Libs fressen entsprechend mehr Speicher. Versuch mal das Script erstmal etwas zu reduzieren, also Serial raus und zunächst nur eine Dose ansteuern.

void setup() { 
  e.setup(mac, ip, port);
  mySwitch.enableTransmit( RCTransmissionPin );
}

void loop() {
	char* rec;
	if (rec = e.serviceRequest()){
        e.print("Willkommen...");
        e.respond();

		if (strcmp(rec, "110") == 0) {
			mySwitch.switchOff("10000", 1);
		} else if (strcmp(rec, "111") == 0) {
			mySwitch.switchOn("10000", 1);
		}
	}
}

PS: Der ENC28j60 ist auch sonst echt schwierig, besorg Dir 'n wiznet :wink:

sui:
PS: Der ENC28j60 ist auch sonst echt schwierig, besorg Dir 'n wiznet :wink:

Habe ich ja alles da liegen blos was mache ich dann mit den ollen enc28j60 :wink:

sui:
Ich tippe auf überlaufenden RAM. Der ENC28j60 hat keinen TCP-Stack und die Libs fressen entsprechend mehr Speicher. Versuch mal das Script erstmal etwas zu reduzieren, also Serial raus und zunächst nur eine Dose ansteuern.

void setup() { 

e.setup(mac, ip, port);
  mySwitch.enableTransmit( RCTransmissionPin );
}

void loop() {
char* rec;
if (rec = e.serviceRequest()){
        e.print("Willkommen...");
        e.respond();

	if (strcmp(rec, "110") == 0) {
		mySwitch.switchOff("10000", 1);
	} else if (strcmp(rec, "111") == 0) {
		mySwitch.switchOn("10000", 1);
	}
}

}

Das war leider auch nichts :frowning: das Blöde Ding will immer noch net ........
Ich glaube ich werde doch das W5100 Shield nehmen

Ich habe das gleiche Shield. Als Library benutze ich diese hier: GitHub - njh/EtherCard: EtherCard is an IPv4 driver for the ENC28J60 chip, compatible with Arduino IDE
Ich habe noch nicht viel damit herumgespielt (habe das Shield erst heute bekommen), aber diese Library scheint wesentlich neuer und weiter entwickelt zu sein, als die, die du weiter oben angegeben hast. Eventuell hast du damit mehr Erfolg. Bei mir läuft es mit dieser Library soweit alles zufriedenstellend.

Jedoch muss man beim initialisieren den csPin parameter für dieses Shield ändern. Per default ist dieser auf Pin 8 gesetzt, für dieses Shield muss aber der Pin auf 10 gesetzt werden. Also in den Beispielscripts muss man

ether.begin(sizeof Ethernet::buffer, mymac)

nach

ether.begin(sizeof Ethernet::buffer, mymac, 10)

ändern.

Hier auch nochmal in der Doku zu dieser Library.
http://jeelabs.net/pub/docs/ethercard/classEtherCard.html#ab195820843fba5f3b465eeaaf7fc9daa

Wo der Post hier gerade nochmal nach oben gerutscht ist... hier noch eine sparsame Minimalversion der RCSwitch Library. Vieleicht sind das ja gerade die entscheidenden Bytes :slight_smile: