Go Down

Topic: WebServer zum Schalten von Funksteckdosen - Ardu hängt sich auf? (Read 3707 times) previous topic - next topic

neovanmatix

Hallo,

ich versuche gerade einen WebServer zu modifizieren (von Poldi/Katsu, http://jleopold.de/2010/08/10/arduino-als-webserver/ ) um damit Funk-Steckdosen zu schalten.
Das Schalten der Steckdose in einem eigenen Sketch mit folgendem Inhalt:
Code: [Select]
/*
  Example for outlets which are configured with two rotary/sliding switches.
 
  http://code.google.com/p/rc-switch/
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  // Transmitter is connected to Arduino Pin #10 
  mySwitch.enableTransmit(2);
 
  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
 
}

void loop() {

  // Switch on:
  // The first parameter represents the setting of the first rotary switch.
  // In this example it's switched to "1" or "A" or "I".
  //
  // The second parameter represents the setting of the second rotary switch.
  // In this example it's switched to "4" or "D" or "IV".
  mySwitch.switchOn('a', 1, 1);

  // Wait a second
  delay(1000);
 
  // Switch off
  mySwitch.switchOff('a', 1, 1);
 
  // Wait another second
  delay(1000);
 
}


funktioniert bestens.

Nun habe ich das besagte WebServer-Script genommen; ein wenig angepasst. Irgendwann lade ich's hoch und stelle fest, dass die Webseite nicht mehr lädt. Der Ardu ist pingbar und akzeptiert auch anfragen (telnet auf 80), aber er lädt leer/weiß/404.

Ich habe dann rumprobiert und festgestellt:
Wenn die Zeile "mySwitch.switchOn('a', 1, 1);" NICHT auskommentiert ist, passiert dieser Fehler. Kommentiere ich alle mySwitch.switchOn/Off-Zeilen aus, lädt die Seite ganz normal.

Und jetzt hört's bei mir auf: Warum ist das so? Ich habe keine Fehlermeldung und nicht die leiseste Ahnung, warum das jetzt passiert :(

Hier mein aktueller Code:
Code: [Select]
/*

Original Version by Poldi
modified by Katsu

the functions readString.append() and readString.contains() where replaced

*/

#include <RCSwitch.h>
#include <SPI.h>  // insert by Katsu
// #include <WString.h> removed by Katsu
#include <Ethernet.h>


byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };  // entspricht einer MAC von 84.85.88.16.0.36
byte ip[]  = { 192, 168, 0, 5 };                  // IP-Adresse
byte gateway[] = { 192, 168, 0, 1 };                // Gateway
byte subnet[]  = { 255, 255, 255, 0 };

EthernetServer server(80);

String readString = String(100);      // string for fetching data from address
boolean RC1 = false;                  // Status flag
boolean RC2 = false;

RCSwitch rcControl = RCSwitch();

void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  // Transmitter is connected to Arduino Pin #10 
  rcControl.enableTransmit(2);
 
  Serial.begin(9600); }

void loop(){

// Create a client connection
EthernetClient client = server.available();

if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
// readString.append(c);  removed by Katsu
readString = readString + c; // insert by Katsu
// very simple but it works...
}

Serial.print(c);  //output chars to serial port

if (c == '\n') {  //if HTTP request has ended

// readString.contains() replaced with readString.indexOf(val) > -1  by Katsu
// indexOf locates a character or String within another String.
// Returns the index of val within the String, or -1 if not found.
if(readString.indexOf("rc1=on") > -1) {
rcControl.switchOn('a', 1, 1);
//Serial.println("Steckdose 1 eingeschaltet!");
//RC1 = true;
}
if(readString.indexOf("rc1=off") > -1){
// rcControl.switchOff('a', 1, 1);
Serial.println("Steckdose 1 ausgeschaltet!");
RC1 = false;
}

if(readString.indexOf("all=Alles+aus") > -1){
// rcControl.switchOff('a', 1, 1);
Serial.println("Alles ausgeschaltet");
RC1 = false;
}
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Arduino Webserver Poldi</title>");

client.println("</head>");

client.print("<body bgcolor='#444444'>");

/* //---Überschrift---
client.println("<br><hr />");

client.println("<h1><div align='center'><font color='#2076CD'>Arduino Webserver 1.0 by Poldi</font color></div></h1>");

client.println("<hr /><br>");
//---Überschrift--- */

//---Ausgänge schalten---
client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Ausg&auml;nge schalten:</font></div>");

client.println("<br>");

client.println("<table border='1' width='500' cellpadding='5'>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Steckdose 1<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=rc1 value='on'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=rc1 value='off'></form></td>");

if (RC1)
   client.println("<td align='center'><font color='green' size='5'>ON");
else
   client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");
   
client.println("</tr>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Steckdose 2<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=rc2 value='on'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=rc2 value='off'></form></td>");

/* if (Pin4ON) */
   client.println("<td align='center'><font color='green' size='5'>ON");
/* else
   client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF"); */
   
client.println("</tr>");

   
client.println("</tr>");

client.println("</table>");


client.println("<br>");

client.println("<form method=get><input type=submit name=all value='Alles aus'></form>");

client.println("</body></html>");

//---Ausgänge schalten---

//clearing string for next read
readString="";

//stopping client
client.stop();
}}}}}

neovanmatix

Das Problem hat sich gelöst...
Ich habe lediglich _jegliche_ HTML-Formatierung von Text (und überflüssige Zeilen) aus dem HTML-Output entfernt; und siehe da: es geht!

Hier:
Code: [Select]
/*

Original Version by Poldi
modified by Katsu

the functions readString.append() and readString.contains() where replaced

*/

#include <RCSwitch.h>
#include <SPI.h>  // insert by Katsu
// #include <WString.h> removed by Katsu
#include <Ethernet.h>


byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };  // entspricht einer MAC von 84.85.88.16.0.36
byte ip[]  = { 192, 168, 0, 5 };                  // IP-Adresse
byte gateway[] = { 192, 168, 0, 1 };                // Gateway
byte subnet[]  = { 255, 255, 255, 0 };

EthernetServer server(80);

String readString = String(100);      // string for fetching data from address
boolean RC1 = false;                  // Status flag
boolean RC2 = false;

RCSwitch rcControl = RCSwitch();

void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  // Transmitter is connected to Arduino Pin #10 
  rcControl.enableTransmit(2);
 
  Serial.begin(9600); }

void loop(){

// Create a client connection
EthernetClient client = server.available();

if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
// readString.append(c);  removed by Katsu
readString = readString + c; // insert by Katsu
// very simple but it works...
}

Serial.print(c);  //output chars to serial port

if (c == '\n') {  //if HTTP request has ended

// readString.contains() replaced with readString.indexOf(val) > -1  by Katsu
// indexOf locates a character or String within another String.
// Returns the index of val within the String, or -1 if not found.
if(readString.indexOf("rc1=on") > -1) {
rcControl.switchOn('a', 1, 1);
Serial.println("Steckdose 1 eingeschaltet!");
RC1 = true;
}
if(readString.indexOf("rc1=off") > -1){
rcControl.switchOff('a', 1, 1);
Serial.println("Steckdose 1 ausgeschaltet!");
RC1 = false;
}

if(readString.indexOf("all=off") > -1){
rcControl.switchOff('a', 1, 1);
Serial.println("Alles ausgeschaltet");
RC1 = false;
}
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Arduino Webserver Poldi</title>");

client.println("</head>");

client.print("<body>");

//---Ausgänge schalten---
client.println("Steckdose 1<br>");

client.println("<form method=get><input type=submit name=rc1 value='on'></form>");

client.println("<form method=get><input type=submit name=rc1 value='off'></form>");

if (RC1)
   client.println("Status: ON");
else
   client.println("Status: OFF");
   
client.println("<br /><br />");


client.println("Steckdose 2<br>");

client.println("<form method=get><input type=submit name=rc2 value='on'></form>");

client.println("<form method=get><input type=submit name=rc2 value='off'></form>");

if (RC1)
   client.println("Status: ON");
else
   client.println("Status: OFF");
   
client.println("<br><br>");


client.println("<form method=get><input type=submit name=all value='off'></form>");

client.println("</body></html>");

//---Ausgänge schalten---

//clearing string for next read
readString="";

//stopping client
client.stop();
}}}}}

uwefed

Der Grund war wahscheinlich zu großer RAM-Verbrauch.
Grüße Uwe

neovanmatix

#3
Sep 18, 2012, 05:37 am Last Edit: Sep 18, 2012, 06:42 am by neovanmatix Reason: 1
Hi Uwe,

ich habe das gleiche Problem gerade wieder, nachdem ich eigenes HTML mit CSS hinzugefügt habe.
Den RAM-Verbrauch kann ich doch bestimmt irgendwo auslesen oder ausgeben, oder?

*Update*
Ich habe nun mal die FreeMemory-Klasse implementiert und lasse mir auf der erzeugten HTML-Seite den freien Arbeitsspeicher ausgeben. Der lag iwo bei 100 byte.

Dann habe ich iwo einen Trick gefunden, um über die Flash-Klasse den HTML-Output statt in den RAM, ihn in den Flash zu speichern - und siehe da: Jetzt habe ich 1000 Byte frei.

Ist es auch irgendwie möglich, die Auslastung des Flash-Speichers mit anzeigen zu lassen? Damit ich da nicht auch in ein Loch reinprogrammiere :)

Go Up