Ethernet-shield...progmem code-problem

hallo liebes forum :slight_smile:

ich habe ein problem meine im flash speicher abgelegten string arrays im browser auszugeben.

zur überprüfung ob ich überhaupt in den "if (c == '\n') {..." fall komme, gebe ich die string arrays einmal mit Serial.println und einmal mit client.println aus

das komische ist, dass er es seriell sendet, aber wenn ich in den browser gehe und meine IP eintippe nichts angezeigt bekomme

ich hoffe irgendjemand kann mir helfen

danke im voraus HasiFlo :slight_smile:

//mein code
#include <SPI.h> // insert by Katsu
#include <Ethernet.h>
#include <avr/pgmspace.h>

byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
byte ip[] = { 10, 0, 0, 15 }; // IP-Adresse

Server server(80);

prog_char string_00[] PROGMEM = "HTTP/1.1 200 OK";
prog_char string_01[] PROGMEM = "Content-Type: text/html";
prog_char string_02[] PROGMEM = "";
prog_char string_03[] PROGMEM = "Arduino Webserver HasiFlo";
prog_char string_04[] PROGMEM = "";
prog_char string_05[] PROGMEM = "";
prog_char string_06[] PROGMEM = "


"; prog_char string_07[] PROGMEM = "

Arduino Webserver 2.0 by HasiFlo

"; prog_char string_08[] PROGMEM = "
Ausgänge schalten:
"; prog_char string_09[] PROGMEM = "
"; prog_char string_10[] PROGMEM = " ";

PROGMEM const char *web_str[]=
{ string_00,
string_01,
string_02,
string_03,
string_04,
string_05,
string_06,
string_07,
string_08,
string_09,
string_10
};
char buffer [80];

int Pin3 = 3;
int Pin4 = 4;
int Pin5 = 5;
int Pin6 = 6;

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

void setup(){
Ethernet.begin(mac, ip);
server.begin();
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);

Serial.begin(9600); }

void loop(){

// Create a client connection
Client 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

for (int i = 0; i < 10; i++)
{
strcpy_P(buffer, (char*)pgm_read_word(&(web_str*))); // Necessary casts and dereferencing, just copy.*

  • client.println( buffer );*
  • delay( 500 );*
  • } *
    for (int i = 0; i < 10; i++)
  • {*
    strcpy_P(buffer, (char*)pgm_read_word(&(web_str*))); // Necessary casts and dereferencing, just copy.
    _
    Serial.println( buffer );_
    _
    delay( 500 );_
    _
    } _
    _
    //clearing string for next read*_
    readString="";
    //stopping client
    client.stop();
    }}}}}

Hallo

du möchtest etwas ausgeben und lässt das board als client ? Um deinen Browser zu erreichen sollte da ein Server sein. Mag sein dass ich im Überfliegen deiner Angaben etwas übersehen habe

:wink:

mein plan wäre übers internet einige leds und steckdosen zu schalten

als vorlage dafür habe ich den code von poldi (Arduino als Webserver – Poldis Homepage) verwendet
da aber mit seiner methode der Ram schnell zu klein wird musste ich etwas ändern

mit ist nicht wichtig,dass der code genau die struktur hat
für andere vorschläge/methoden dies zu lösen wäre ich auch sehr dankbar!!!!

mfg

Ich habe auch mit dem Webserver experimentiert und auf PROGMEM umgestellt. Hier meine Version, durch die Library besser lesbarer Code:

/*

http://jleopold.de/2010/08/10/arduino-als-webserver/

Original Version by Poldi
modified by Katsu
the functions readString.append() and readString.contains() where replaced

modified by RaKa 2011 for FLASH Library (PROGMEM) to save RAM
*/

#include <SPI.h>  // insert by Katsu
#include <Ethernet.h>
#include <Flash.h>   // Mikal Hart PROGMEM Library, http://arduiniana.org/libraries/flash/
                     //I use the F() macro (F for “Flash”)


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

Server server(80);

int Pin3 = 3;
int Pin4 = 4;
int Pin5 = 5;
int Pin6 = 6;

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


void setup()
{
    Ethernet.begin(mac, ip, gateway, subnet);
    server.begin();
    pinMode(Pin3, OUTPUT);
    pinMode(Pin4, OUTPUT);

    Serial.begin(9600); 

}

void loop()
  {

  // Create a client connection
  Client 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("3=einschalten") > -1) 
            {
              digitalWrite(Pin3, HIGH);
              Serial.println("Pin 3  eingeschaltet!");
              Pin3ON = true;
            }
            
          if(readString.indexOf("3=ausschalten") > -1)
            {
              digitalWrite(Pin3, LOW);
              Serial.println("Pin 3 ausgeschaltet!");
              Pin3ON = false;
            }
          
          if(readString.indexOf("4=einschalten") > -1) 
            {
              digitalWrite(Pin4, HIGH);
              Serial.println("Pin 4 eingeschaltet!");
              Pin4ON = true;
            }
          
          if(readString.indexOf("4=ausschalten") > -1)
          { 
             digitalWrite(Pin4, LOW);
             Serial.println("Pin 4 ausgeschaltet!");
             Pin4ON = false;
          }

          if(readString.indexOf("all=Alles+aus") > -1)
          {
            digitalWrite(Pin3, LOW);
            digitalWrite(Pin4, LOW);
            Serial.println("Alles ausgeschaltet");
            Pin3ON = false;
            Pin4ON = false;
          }
          
          //--------------------------HTML------------------------
          client << F("HTTP/1.1 200 OK\n");

          client << F("Content-Type: text/html\n\n");

         

          client << F("<html><head>");

       
          client << F("<title>Arduino Webserver</title>");

          client << F("</head>\n");

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

          //---Überschrift---
          client << F("
<hr />\n");

          client << F("<h1><div align='center'><font color='#2076CD'>Arduino Webserver 1.0 by Poldi RaKa Version</font color></div></h1>\n");

          client << F("<hr />
\n");
          //---Überschrift---

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

          client << F("
\n");

          client << F("<table border='1' width='500' cellpadding='5'>\n");

          client << F("<tr bgColor='#222222'>\n");

          client << F("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 3
</font></td>\n");
 
          client << F("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='einschalten'></form></td>\n");
 
          client << F("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='ausschalten'></form></td>\n");
 
          if (Pin3ON)
             client << F("<td align='center'><font color='green' size='5'>ON\n");
          else
             client << F("<td align='center'><font color='#CFCFCF' size='5'>OFF\n");
   
          client << F("</tr>\n");

          client << F("<tr bgColor='#222222'>\n");

          client << F("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 4
</font></td>\n");
 
          client << F("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='einschalten'></form></td>\n");
 
          client << F("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='ausschalten'></form></td>\n");
 
          if (Pin4ON)
             client << F("<td align='center'><font color='green' size='5'>ON\n");
          else
             client << F("<td align='center'><font color='#CFCFCF' size='5'>OFF\n");
   
          client << F("</tr>\n");

   
          client << F("</tr>\n");

          client << F("</table>\n");


          client << F("
\n");

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

          client << F("</body></html>\n");

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

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

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

danke !!!!!! :slight_smile:

dein beitrag hat mir sehr geholfen

jetzt kann ich endlich weiter arbeiten und werde nicht mehr durch mangelden speicher gestört :slight_smile:

ja RaKa, vielen dank,

anbei meine version mit neuem layout,

übrigens eine interessante spielerei zusaetzlich,
http://www.editgrid.com/user/kll/webserver_read
da lese ich meinen webserver aus in ein online excel sheet
und kann messwerte rechnerisch weiterverwenden.
dieses sheet ist öffentlich und ihr könnt ( in die gelben zellen) eigene werte eingeben.
( warnung, REGEX macht einen crazy )

webserver_flash.zip (168 KB)

Hallo kllsamui
wie sehen die daten aus die vom Ardu geschickt werden.
Kann das der Text sein der auf der Webseite angezeig wird oder muss das in irged einer Sprache gemacht werden PHP oder ähnlich
Gruß

Der ARDUINO code um eine webseite zu machen ist ein PRINT Befehl,
der Inhalt ist TEXT / HTML.
Abgesehen von den ( variablen ) Messwerten sollten die statischen HTML Texte im FLASH abgelegt sein.
client.print(F(" HTML "));
Aber es ist moeglich viel mehr in eine HTML Seite zu packen als man im ersten Moment denkt:
BILDER: wenn Bilder im Internet abgelegt sind, sendet Arduino webserver nur einen Link.
JAVA code: auch sehr aufwendige Bedienelemente in einer Webseite sind realisierbar,
der code wird aber nicht mitgeschickt sondern wieder nur per LINK.
Beispiel: RGB slider
http://kll.byethost7.com/kll_en7/news.php?readmore=28
siehe Bilder und download code ( fuer WIFI Arduino )

Um Messwerte im Internet abzulegen muss ARDUINO kein server sondern client sein und eine
geeignete webseite bedienen ( dort laeuft dann PHP / SQL / HTML ).
dies kann ueber ethernet/WIFI oder GPRS modem erfolgen.
ein gutes Projekt ist Home | OpenEnergyMonitor