Ethernet Library blockiert Pins (außer 13, 12, 11, 10) ?!?!

Hallo…

Ich verzweifle gerade an einen der simpelsten Sachen überhaupt. Ich möchte einfach einen (!!!) Pin auf HIGH / 1 schalten… Doch hieran scheitere ich gerade kläglich… :~

Wenn ich z.B. den blink-Sketch aufspiele und die “blink”-Pins durchwechsel geht alles… ( = keine Pins defekt)

Wenn ich jedoch diesen Code aufspiele, der Ethernet, SD und SPI einbindet, finde ich keinen Pin mehr den ich hochschalten kann??? Das ethernet-Shield ist nichtmal angeschlossen. Geschaltet werden soll der relay Pin… ( Relay breakout board… Mit blink Programm funktioniert es super…)

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

int redPin = 3;
int greenPin = 5;
int bluePin = 6;
int relay = 8;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,178,77);

EthernetServer server(80);

File webFile;

void setup() {
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  digitalWrite(relay, HIGH);
  digitalWrite(10, HIGH);
  if (!SD.begin(4)) {
     return;
  }

  setColour(0,0,0);
}

void loop() {
  int BUFSIZ = 255;
    int index = 0;
    digitalWrite(relay, HIGH);
    char clientline[BUFSIZ];
    EthernetClient client = server.available();
    if (client) {
        boolean currentLineIsBlank = true;
        index = 0;
        while (client.connected()) {
            if (client.available()) { 
                char c = client.read();
                if (c != '\n' && c != '\r') {
                  clientline[index] = c;
                  index++;
                  if (index >= BUFSIZ) 
                    index = BUFSIZ -1;

                  continue;
                }
                clientline[index] = 0;
                char* filename = processFile(clientline);
                Serial.print("Requested: ");
                Serial.println(filename);
                /* Setup AJAX Requests Here:
                 * These are just direct output values that are requested 
                 * with AJAX.
                 */
                if (strstr(clientline, "GET /?rgb=") != 0) {
                  char* rgb;
                  rgb = clientline + 10;

                  char *str;
                  char *p = rgb;
                  int rgbi[3];
                  int index=0;
                  while ((str = strtok_r(p, ",", &p)) != NULL) { // delimiter is the semicolon
                    rgbi[index] = atoi(str);
                    index++;
                    Serial.println(str);
                  }
                  setColour(rgbi[0],rgbi[1],rgbi[2]);
                  //Serial.println(rgb);
                  break;
                }

                if (SD.exists(filename)) {
                   code200(client);
                   webFile = SD.open(filename);
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read());
                       }
                       webFile.close();
                   }
                   break;
                } else {
                    if (strlen(filename) < 2) {
                      webFile = SD.open("index.htm");
                       if (webFile) {
                           while(webFile.available()) {
                               client.write(webFile.read());
                           }
                           webFile.close();
                       }
                    } else {
                      client.println("HTTP/1.1 404 Not Found");
                      client.println("Content-Type: text/html");
                      client.println("Connection: close");
                      client.println();
                      client.println("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>");
                      break;
                    }
                }
                break;
            }
        } 
        delay(1);
        client.stop();
    }
}

void setColour(int r,int g,int b) {
   r = map(r, 0, 255, 255, 0);
   g = map(g, 0, 255, 255, 0);
   b = map(b, 0, 255, 255, 0);
   analogWrite(redPin, r);
   analogWrite(greenPin, g);
   analogWrite(bluePin, b);
}

void code200(EthernetClient client) {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close");
    client.println();
}

char* processFile(char clientline[255]) {
   char *filename;
   filename = clientline + 5;
  (strstr(clientline, " HTTP"))[0] = 0;
  return filename;
}

SD karte und Webserver gehen mit eingestecktem Shield auch ohne Probleme. Kann jemand bitte diesen Code aufspielen und mir vielleicht sagen woran es liegt??

Pins 6,5,3 kann man nicht verwenden, da ich diese für PWM → RGB Steuerung benötige… Angeschlossen zum Relay schalten war nur das breakout board ( breakout-board—> Arduino Uno////VCC–> 5v, GND —> GND, IN2 —> Relay-Pin…, In1–> nicht verwendet.)

schon mal vielen Dank. vielleicht kann mir jemand diesen hoffentlich leichtsinnigen Fehler erläutern… ich bin den Code nun bereits mehrfach durchgegangen und verstehe es solangsam echt nimmer… :fearful:

Grüße

Mir ist nicht klar, wo Dein Problem liegt. Funktioniert dieser Sketch nun oder nicht? Im Sketch schaltest Du ja keinen Pin auf HIGH. Habe ich etwas falsch verstanden? Oder suchst Du einfach einen freien Pin? #2 sollte frei sein, wenn ich das richtig überblicke.

Fehlt nicht die Funktion pinMode(pin , OUTPUT); für das Pin, an dem das Relais angeschlossen ist?? Grüße Uwe

Der Sketch funktioniert, bis auf die Simple Funktion einen Pin dauerhaft, oder sogar nur mal kurz auf High zu schalten..

Danke uwefed, da hast du natürlich recht, jedoch habe ich das auch schon so probiert. pin 10 wird aber auch einfach hochgeschaltet und ist nicht aktiv so definiert (vielleicht in den Libarys? ) daher habe ich es auch mal ohne pinMode probiert. Leider ohne erfolg.

Pin 2 funktioniert leider auch nicht.

Mein Setup: - Arduino Uno - diesen Sketch ink. pinMode und relay-pin = 2 - nur break out board angeschlossen

ha. kleineren Fehler entdeckt.. Wenn kein Ethernet.Shild angeschlossen ist habe ich auch keine SD karte, Und der Programmcode stoppt..

Jetzt habe ich es mal angeschlossen und den digitalWrite Befehl für relay nur im loop reingeschrieben.. was macht er jetzt. Er schaltet den Pin! Juhu.. doch nur leider für geschätzte 50 ms.. dann ist er wieder aus ?!?!?!

Gibt es eine Funktion in diesem Sketch, welche alle pins auf einmal ausschaltet, oder den Arduino so beschäftigt, dass er seine anderen pins "vergisst" ??

Gruß

Pin 10 wird von der SPI Bibliothek verwendet. Pin 4 wird für die SD-Karte verwendet also scheidet der auch aus.

Jetzt habe ich es mal angeschlossen und den digitalWrite Befehl für relay nur im loop reingeschrieben.. was macht er jetzt. Er schaltet den Pin! Juhu.. doch nur leider für geschätzte 50 ms.. dann ist er wieder aus ?!?!?!

Dazu brauchen wir diesen Sketch der Dir diesen Effekt produziert.

Grüße Uwe

Ja das War mir auch bewusst, dass 10 und 4 dadurch geblockt sind.

Mit diesem Code läuft der Pin eine ganze weile. Nach ca 15 min Inaktivität auf der Seite, oder wenn ein anderes Gerät/client auf die Seite zugreift schaltet dieser jedoch wieder aus.

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

int redPin = 3;
int greenPin = 5;
int bluePin = 6;
int relay = 2;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,178,77);
IPAddress dns1(192,168,178,1);
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);

EthernetServer server(80);

File webFile;

void setup() {
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip, dns1, gateway, subnet);
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(relay, OUTPUT);
  //digitalWrite(relay, HIGH);
  digitalWrite(10, HIGH);
  if (!SD.begin(4)) {
     return;
  }

  setColour(0,0,0);
}

void loop() {
  int BUFSIZ = 255;
    int index = 0;
    char clientline[BUFSIZ];
    EthernetClient client = server.available();
    if (client) {
        boolean currentLineIsBlank = true;
        index = 0;
        while (client.connected()) {
            if (client.available()) { 
                char c = client.read();
                if (c != '\n' && c != '\r') {
                  clientline[index] = c;
                  index++;
                  if (index >= BUFSIZ) 
                    index = BUFSIZ -1;

                  continue;
                }
                clientline[index] = 0;
                char* filename = processFile(clientline);
                Serial.print("Requested: ");
                Serial.println(filename);
                /* Setup AJAX Requests Here:
                 * These are just direct output values that are requested 
                 * with AJAX.
                 */
                if (strstr(clientline, "GET /?rgb=") != 0) {
                  char* rgb;
                  rgb = clientline + 10;
                  
                  char *str;
                  char *p = rgb;
                  int rgbi[3];
                  int index=0;
                  while ((str = strtok_r(p, ",", &p)) != NULL) { // delimiter is the semicolon
                    rgbi[index] = atoi(str);
                    index++;
                    Serial.println(str);
                  }
                  setColour(rgbi[0],rgbi[1],rgbi[2]);
                  //Serial.println(rgb);
                  break;
                }
                   digitalWrite(relay, HIGH);

                if (SD.exists(filename)) {
                   code200(client);
                   webFile = SD.open(filename);
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read());
                       }
                       webFile.close();
                   }
                   break;
                } else {
                    if (strlen(filename) < 2) {
                      webFile = SD.open("index.htm");
                       if (webFile) {
                           while(webFile.available()) {
                               client.write(webFile.read());
                           }
                           webFile.close();
                       }
                    } else {
                      client.println("HTTP/1.1 404 Not Found");
                      client.println("Content-Type: text/html");
                      client.println("Connection: close");
                      client.println();
                      client.println("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>");
                      break;
                    }
                }
                break;
            }
        } 
        delay(1);

        client.stop();
    }
}

void setColour(int r,int g,int b) {
   r = map(r, 0, 255, 0, 255);
   g = map(g, 0, 255, 0, 90);
   b = map(b, 0, 255, 0, 100); 

   analogWrite(redPin, r);
   analogWrite(greenPin, g);
   analogWrite(bluePin, b);
}

void code200(EthernetClient client) {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close");
    client.println();
}

char* processFile(char clientline[255]) {
   char *filename;
   filename = clientline + 5;
  (strstr(clientline, " HTTP"))[0] = 0;
  return filename;
}

mrlowalowa:
int BUFSIZ = 255;

char clientline[BUFSIZ];

Du verbrauchst RAM-Speicher als wenn ein UNO davon beliebig viel zur Verfügung hätte.

Sobald Du die SD-Library verwendest, ist mehr als der halbe RAM-Speicher auf einem UNO bereits weg.

D.h. in jedem Sketch, in dem die SD-Library verwendet wird, mußt Du EXTREMES AUGENMERK AUF DEN RAM-VERBRAUCH legen!

Mal eben 255 Bytes für einen Zeilenpuffer?
Stelle das auf den Prüfstand, ob nicht vielleicht auch 80 Zeichen reichen!

Und sowas

client.println("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>");

ist die totale Verschwendung von RAM! Verwende bei print und println mit Textkonstanten als Parameter immer das F-Makro:

client.println(F("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>"));

.

Von den Standard String Funktionen gibt es auch oft _P Versionen, die feste Paramter-Strings im Flash lassen:

if (strstr_P(clientline, PSTR("GET /?rgb=")) != 0)

Das PSTR() Makro deklariert einen String mit PROGMEM

aaaaaah… schande über mich… ich hab das mit dem Ram schon Zoo oft gelesen -.-

Geb zu, dass ich bei ethernet Projekten noch nicht so ganz durchsteige… Die Grundstruktur des Codes habe ich aus dem Projekt hier übernommen: klick mich

Vielen dank für den Tipp! Klar, dass das mein Uno nicht schaffen kann…

meine index.htm ist nur 12 kb groß. Kann ich dann die BUFFSIZE auf sagen wir mal 20 kb runterschrauben?

Doofe frage neben bei… was macht die strstr string Funktion eigentlich…? :smiley:

Meine grobe Vorstellung von Strings: Platzhalter, Bezeichnungen für einen großen Block von Daten?
Und die strstr Funktion sucht dann eben ob der client eine GET-Anfrage gesendet hat? Ist das richtig so?

Und, weil diese gesuchte Konstante immer gleichbleibt kann man diese wo anders speichern, damit der RAM nicht zu viel missbraucht wird?

Hab ich das so grob richtig verstanden? :slight_smile:
Schon mal vielen dank euch! Wollte das schon immer mal kapieren… XD

Mein angepasster Code:

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

int redPin = 3;
int greenPin = 5;
int bluePin = 6;
int relay = 2;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,178,77);
IPAddress dns1(192,168,178,1);
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);

EthernetServer server(80);

File webFile;

void setup() {
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip, dns1, gateway, subnet);
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(relay, OUTPUT);
  //digitalWrite(relay, HIGH);
  digitalWrite(10, HIGH);
  if (!SD.begin(4)) {
     return;
  }

  setColour(0,0,0);
}

void loop() {
  int BUFSIZ = 255;
    int index = 0;
    char clientline[BUFSIZ];
    EthernetClient client = server.available();
    if (client) {
        boolean currentLineIsBlank = true;
        index = 0;
        while (client.connected()) {
            if (client.available()) { 
                char c = client.read();
                if (c != '\n' && c != '\r') {
                  clientline[index] = c;
                  index++;
                  if (index >= BUFSIZ) 
                    index = BUFSIZ -1;

                  continue;
                }
                clientline[index] = 0;
                char* filename = processFile(clientline);
                Serial.print("Requested: ");
                Serial.println(filename);
                /* Setup AJAX Requests Here:
                 * These are just direct output values that are requested 
                 * with AJAX.
                 */
                if (strstr_P(clientline, PSTR("GET /?rgb=")) != 0) {
                  char* rgb;
                  rgb = clientline + 10;
                  
                  char *str;
                  char *p = rgb;
                  int rgbi[3];
                  int index=0;
                  while ((str = strtok_r(p, ",", &p)) != NULL) { // delimiter is the semicolon
                    rgbi[index] = atoi(str);
                    index++;
                    Serial.println(str);
                  }
                  setColour(rgbi[0],rgbi[1],rgbi[2]);
                  //Serial.println(rgb);
                  break;
                }
                   digitalWrite(relay, HIGH);

                if (SD.exists(filename)) {
                   code200(client);
                   webFile = SD.open(filename);
                   if (webFile) {
                       while(webFile.available()) {
                           client.write(webFile.read());
                       }
                       webFile.close();
                   }
                   break;
                } else {
                    if (strlen(filename) < 2) {
                      webFile = SD.open("index.htm");
                       if (webFile) {
                           while(webFile.available()) {
                               client.write(webFile.read());
                           }
                           webFile.close();
                       }
                    } else {
                      client.println(F("HTTP/1.1 404 Not Found"));
                      client.println(F("Content-Type: text/html"));
                      client.println(F("Connection: close"));
                      client.println();
                      client.println(F("<html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>"));
                      break;
                    }
                }
                break;
            }
        } 
        delay(1);

        client.stop();
    }
}

void setColour(int r,int g,int b) {
   r = map(r, 0, 255, 0, 255);
   g = map(g, 0, 255, 0, 90);
   b = map(b, 0, 255, 0, 100); 

   analogWrite(redPin, r);
   analogWrite(greenPin, g);
   analogWrite(bluePin, b);
}

void code200(EthernetClient client) {
    client.println(F("HTTP/1.1 200 OK"));
    client.println(F("Content-Type: text/html"));
    client.println(F("Connection: close"));
    client.println();
}

char* processFile(char clientline[255]) {
   char *filename;
   filename = clientline + 5;
  (strstr(clientline, " HTTP"))[0] = 0;
  return filename;
}

P.S.: Link funktioniert jetzt

Das Problem mit String Konstanten/Literalen ist folgendes:

Der AVR hat eine modifizierte Harvard Architektur. Es gibt getrennte Daten- und Adressbusse für ROM und RAM und die zwei Adressräume sind größtenteils getrennt. Das heißt anders als bei der klassischen von-Neumann Architektur können normale Befehle nicht so einfach ins ROM/Flash greifen. Bei Konstanten wird das dadurch umgangen, dass diese beim Start alle vom Flash ins RAM kopiert werden. Anders als man also vielleicht denkt landen die alle im RAM und davon gibt es auf dem UNO nicht viel.

Auf Assembler-Ebene gibt es aber ein paar Befehle um Daten aus dem Flash auszulesen. Auf C-Ebene stehen dafür Makros wie PSTR() und PROGMEM zur Verfügung. Dazu ein paar Funktionen um Daten aus dem Flash zu kopieren und die _P Version der String Funktionen um direkt Flash Strings zu verarbeiten. Dazu kommt von der Arduino IDE das F() Makro, welches mit print() und println() geht.

Das F() Makro reicht in vielen Fällen um die größten Strings aus dem RAM entfernen, da das eben oft print() Anweisungen sind (geht übrigens auch mit deinen Serial Ausgaben!). Aber man kann hier und da auch weiter optimieren.

Es gibt auch eine Funktion um den freien Speicher anzuzeigen:

int getFreeRAM() 
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Geht aber natürlich nur wenn er noch nicht total voll ist.

Doofe frage neben bei... was macht die strstr string Funktion eigentlich..?

strstr() such einen Teil-String in einem String. Sie gibt NULL zurück wenn der String nicht gefunden wurde und einen Zeiger auf den Anfang des Teil-Strings wenn dieser enthalten ist: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga6a441da9211eb85881d99c60b1003552 http://openbook.galileocomputing.de/c_von_a_bis_z/011_c_arrays_013.htm#mja214ed64e5acc62362ef373f80645ef9 http://www.cplusplus.com/reference/cstring/strstr/

Ersteres ist die AVR libc. Das ist alles was auf dem AVR vorhanden ist. Die zwei anderen Links sind Standard C. Die Standard C Lib ist ähnlich aber nicht 100%ig identisch

Das mit dem Zeiger auf den Teil-String wird hier ausgenutzt:

(strstr(clientline, " HTTP"))[0] = 0;

Sowie ich das verstehe terminiert das den String am Anfang des "HTTP". Alternativ könnte man den Zeiger auch mit * dereferenzieren. Das ist hier etwas verwirrend geschrieben, da der Zeiger den die Funktion liefert nicht extra abgespeichert wird.

okay. Langsam wird das Bild deuuuutlich klarer :slight_smile:

und im Flash ist doch der ProgrammCode gespeichert oder?

Das mit dem F() Makro merk ich mir aufjedenfall mal vor. String-Befehle versteh ich dank dir schon um einiges mehr aber ich werde trotzdem versuchen diese zu vermeiden, wenn es möglich ist :stuck_out_tongue: Nach dem Abi schau ich die mir mal genauer an… XD
is ja nimmer lang… :slight_smile:

eine kleine frage hätte ich dann noch… wie kann ich die Funktion einbauen? ^^
Funktion so außerhalb von anderen Funktionen einbauen. Aber wie gebe ich die dann über den Serial-Monitor aus?
So? :

Serial.print(F(getFreeRAM()));

bzw. kann ich das F()- Makro so überhaupt verwenden? Das geht wahrscheinlich nur, wenn ich vorgefertigte Textblöcke o.ä. habe und diese immer wieder verwende. Variable Werte kann man so wahrscheinlich nicht im Flash ablegen? :slight_smile:

Gruß

und im Flash ist doch der ProgrammCode gespeichert oder?

Ja. Speichertechnisch sieht es so aus, dass erst die PROGMEM Konstanten kommen und danach der Programmcode

Das F-Makro geht nur mit String Konstanten. Der Wert muss zur Compile-Zeit feststehen. Du hast da erstens einen int und zweitens keine Konstante.

Das geht:

Serial.println(getFreeRAM());

Liefert den freien Speicher in Bytes

Also mit den hier angesprochenen Verbesserungen Spuckt mir deine Funktion den Wert 848 aus und mit dem Code von oben lediglich 650. Aber das klärt das jetzt, wieso ich einen Pin nicht mehr auf High schalten konnte??

und in welchen Wertespektrum kann ich diese Werte einordnen? Gibt es irgendwo eine "Ampel"Skala hierzu? 0-400 = really bad; 400-600 = Stricted; 600-800= Good; 800= 1028 = Brilliant? :smiley:

das war jetzt einfach mal so ins blaue geraten… :DD

1839 bekomme ich wenn ich die Funktion quasi ohne alle über serial ausgeben lasse.

Gruß

P.S.: ach hups… unter deinem Code fehlt steht ja schon die Antwort… ^^ Danke! :slight_smile: Bytes also… Aber reichen 650 Bytes nicht um einen Pin zu schalten? :stuck_out_tongue:

Hallo,

in den Kommentaren von Deinem Link, der übrigens falsch verlinkt ist, wo du den Code her hast, steht im letzten Eintrag auch etwas von einem Problem mit Pins schalten. Irgendwas stimmt damit nicht. Probiere mal die Bsp. der Ethernet Library durch. Quasi die originale. Wenn die funktionieren, kannste immer noch vergleichen was anders ist.

mrlowalowa: meine index.htm ist nur 12 kb groß. Kann ich dann die BUFFSIZE auf sagen wir mal 20 kb runterschrauben?

Welchen BUFFSIZE welchen Buffers? Arduino UNO hat 2kB RAM!!!!

mrlowalowa: Also mit den hier angesprochenen Verbesserungen Spuckt mir deine Funktion den Wert 848 aus und mit dem Code von oben lediglich 650. Aber das klärt das jetzt, wieso ich einen Pin nicht mehr auf High schalten konnte??

Wenn Du zuviel RAM verbrauchst werden Systemvariablen und Stack überschrieben. Der Arduino hängt sich praktisch auf oder bestimmte Funktionen funktionieren nicht mehr. Die Effekte sind unvorhersehbar.

Grüße Uwe

Doc_Arduino: in den Kommentaren von Deinem Link, der übrigens falsch verlinkt ist, wo du den Code her hast, steht im letzten Eintrag auch etwas von einem Problem mit Pins schalten. Irgendwas stimmt damit nicht. Probiere mal die Bsp. der Ethernet Library durch. Quasi die originale. Wenn die funktionieren, kannste immer noch vergleichen was anders ist.

ehm.. ja... :D könnte daran liegen, dass der Kommentar von mir ist.. :D aber trotzdem danke ^^ Link funktioniert jetzt richtig ;)

@uwefed:

ja ich glaub ich hab das mit dem BUFFSIZ falsch verstanden.. Dieser ist dafür da die "Anfrage" vom Client zwischen zuspeichern, bzw die länge hierfür zu begrenzen. 255 sind keine kb sondern wahrscheinlich eine Angabe von 0 bis 255 auf die 2 KB bezogen??

Aaaaah, wenn ich quasi 2 clients oder mehr gleichzeitig habe, entsteht so ein Fehler.. Ja das ergibt wirklich Sinn.. :) Problem Gelöst! :))

LETZE frage (dann ist auch erstmal Schluss) ^^ :

Ich will jetzt den Vorhanden Code um die PWM Ausgabe "ärmer" machen aber um eine 433 MHz Übermittlung der r, g, b Pins an einen anderen Arduino "reicher" machen. Dies würde ich am besten über die VirtualWire.h lib realisieren wollen.

die Frage ist nun: - Wo soll die Sendung der Variablen im Code stattfinden? Am besten gleich in der Subroutine oder nach der vollendeten Subroutine? - Wie übertrage ich die Daten? (Plan mittels itoa() werte für die Übermittlung aufbereiten und dann atoi() um sie am anderen Arduino wieder lesbar zu machen)

Nur wie mache ich klar, welche werte für welchen integer sind? alles zusammen wie es auf der Website ankommt? also im GET format oder kann man diese in einem String schön darstellen? eventuell ein Array? aber lässt sich ein Array in einen String und wieder zurück umwandeln??

Bin offen für allmögliche Ideen, Vorschläge und vorallem Ratschläge :)

Grüße! Und übrigens einen Happy Arduino Day euch allen :))

mrlowalowa: 255 sind keine kb sondern wahrscheinlich eine Angabe von 0 bis 255 auf die 2 KB bezogen?? ... Grüße! Und übrigens einen Happy Arduino Day euch allen

255 ist die Größe des Arrays. Die verbrauchten Bytes im RAM hängt vom verwendeten Variablentyp ab. BYTE, CHAR 1 BYTE, INT 2 BYTE, LONG und FLOAT 4 Byte.

Übrigens: 0 bis 255 sind 256 Zahlen!!1

Der Arduino Tag war am 29. März.

Grüße Uwe

uwefed: 255 ist die Größe des Arrays. Die verbrauchten Bytes im RAM hängt vom verwendeten Variablentyp ab. BYTE, CHAR 1 BYTE, INT 2 BYTE, LONG und FLOAT 4 Byte.

...

Der Arduino Tag war am 29. März.

Aha! Vielen dank für die Übersicht :) kann man sich nun deutlich besser vorstellen, wie3 es zu einem Überlaufen des Rand kommen kann.

Das mit dem Arduino Day, war keine Absicht, hat das Arduino Team erst gestern eben noch auf Twitter gepostet! twitter-Tweet

Gruß

mrlowalowa: also im GET format oder kann man diese in einem String schön darstellen? eventuell ein Array? aber lässt sich ein Array in einen String und wieder zurück umwandeln??

In C sind Strings nichts anderes als Null-terminierte char Arrays: http://openbook.galileocomputing.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64 (das ist C Code für den PC. Das printf() geht auf dem Arduino nicht so wie es da steht)

http://www.c-howto.de/tutorial-strings-zeichenketten.html http://www.c-howto.de/tutorial-strings-zeichenketten-nullterminiert.html

Bei Arduino Code findest du gerade bei Anfänger Sachen oft die String Klasse, aber auf diese solltest du verzichten. Die verursacht weit mehr Probleme als sie löst.

Hallo,

Bei Arduino Code findest du gerade bei Anfänger Sachen oft die String Klasse, aber auf diese solltest du verzichten. Die verursacht weit mehr Probleme als sie löst.

da muß ich auch nachfragen. Wenn man String-Klassen nicht verwenden soll - was dann? Irgendwie stehe ich da auch gerade auf dem Schlauch.