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..? ![]()
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? ![]()
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