ethernet Relaissteuerung

hallo
habe hier einen Temperatur Relais Script, mit welchen ich Probleme hab.

#include <SPI.h>
#include <Ethernet.h>             // library for ethernet functions
#include <DallasTemperature.h>    // library for temperature sensors
#include <OneWire.h>              // library for the onewire bus
 
OneWire  ds(2);                         // pin für Temperatursensoren
 
//DeviceAdressen der einzelnen ds1820 Temperatursensoren.
DeviceAddress sensor1 = { 0x28, 0x2D, 0x6D, 0x3C, 0x5, 0x0, 0x0, 0x70 };
DeviceAddress sensor2 = { 0x28, 0xE2, 0x86, 0x3C, 0x5, 0x0, 0x0, 0x61 }; 
 
//ETHERNET-SETTINGS
byte mac[] = { 0x88, 0x87, 0x17, 0x87, 0xD6, 0x67 }; // MAC-Adresse des Arduino
byte ip[] = { 192, 168, 178, 28 }; // IP-Adresse des Arduino
//byte gateway[] = { 192, 168, 178, 1 }; // Gateway
//byte subnet[] = { 255, 255, 255, 0 }; // SubNet
byte server[] = { 95, 143, 172, 134 }; // IP-Adresse des Servers

EthernetClient client;
char host[] = "ihrewaesche.de"; // Domain
char url[] = "/ARDUINO/Temperatur/SaveTempToMySQL.php"; // Pfad zur PHP-Datei
char key[] = "MEINPASSWORT123"; // Kennwort aus PHP-Datei
char c; // Variable für Rückgabe des Servers 
long Interval = 60; // Upload-Interval in Minuten
DallasTemperature sensors(&ds);
int numSensors; // Variable zum speichern der Anzahl der Temperatur-Sensoren
float temp1,temp2; // Temperaturwerte der Sensoren

// #define Heizunganforderung 4
#define Kessel_ein 5
#define Ladepumpe_ein 6  //Kesselladepumpe
#define Heizkreis_ein 7
#define Mischer_AUF 8
#define Mischer_ZU 9
#define Umschaltventil_ein 10  //für die rücklaufanhebung Hydraulische weiche
#define WW_Ladepume_ein 11    

//-------------------------------------------------------------------------------------
int tempsoll = 20;
int Aussentemp;
int Vorlauftemp;
int Vorlauftemp_soll;
int Puffer;
int Puffertemp=20;        //mindest Puffertemperatur oben - Temp drunter --> Kessel an
// int Ladepumpe=30000;   //warte Zeit nach "Kessel an" bis zum einschalten der Ladepumpe
int Ladetemp=30;          //Temperatur bis wieviel Grad der Puffer vom Kessel geladen werden soll
int hyst = 2;             //Hysterse Mischerkreis
unsigned long MischenA;    
unsigned long WartenA,WartenB;


void setup()
{
  delay(1000);
  Serial.begin(9600);
  Serial.flush();
  delay(200);
  Serial.println("Arduino TemperaturLogger");
  Serial.println("Ethernet initialisieren...");
  Ethernet.begin(mac, ip);
  Interval = Interval * 1000 * 60; // Das in Minuten angegebene Interval in Millisekunden umrechnen
  delay(1000); // warten, bis Ethernet gestartet
  //Sensoren abfragen
  sensors.begin();
  Serial.println("Temperatur-Sensoren ermitteln...");
  numSensors = sensors.getDeviceCount(); // Anzahl der angeschlossenen Sensoren in numSensors speichern
  if(numSensors > 0) // Es wurde mindestens 1 Sensor gefunden
  {
    Serial.print(numSensors);
    Serial.println( " Temperatur-Sensoren gefunden.");
    sensors.setResolution(sensor1, 10);
    sensors.setResolution(sensor2, 10);
  }
  else // Es wurde kein Sensor gefunden
  {
    Serial.println("Keine Temperatur-Sensoren gefunden.");
  }
}
void loop()
{
	MISCHEN();
  sensors.requestTemperatures();
  temp1 = sensors.getTempC(sensor1);
  temp2 = sensors.getTempC(sensor2);
  if (temp1 == -127.00) Serial.print("Fehler Sensor1");
  else {
    Serial.print("Temp1: ");  
    Serial.println(temp1);
  }
  if (temp2 == -127.00) Serial.print("Fehler Sensor2");
  else {
    Serial.print("Temp2: ");  
    Serial.println(temp1);
  }
  if (temp1!= -127.00 && temp2!=-127.00)  Daten_senden(temp1, temp2); // Temperaturdaten an Server übertragen
  delay(700);
  byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected()) // Antwort des Servers lesen
  {
    delay(1000);
    while (client.available())
    {
      char response = client.read();
      Serial.print(response);
    }
  }
  client.stop();
  Serial.println("Done.");
  client.flush();
  delay(Interval);
}
/******************************
*
* Daten an Server schickenn *
*
*******************************/
void Daten_senden(float T1, float T2)
{
  if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
    Serial.println("Verbunden, Sende Daten...");
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print("?T1=");
    Serial.print("?T1=");
    client.print(T1);
    Serial.println(T1);
    client.print("&T2=");
    Serial.print("&T2=");
    client.print(T2);
    Serial.println(T2);
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(" HTTP/1.1");
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println("User-Agent: Arduino");
    client.println("Connection: close");
    Serial.println("Connection: close");
    client.println();
    Serial.println();
  }
  else
  {
    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}
-----------------------------------------------------
void MISCHEN() {

  WartenA = millis();    // Alle 10 Sekunden den "Regelkreis" starten
  if (WartenA - WartenB > 10000)

  {
    // Abfrage aller Temperaturen für den "Regelkreis"
    
    sensors.requestTemperatures();
     temp[0] = sensors.getTempCByIndex(0);
      temp[1] = sensors.getTempCByIndex(1);
      temp[2] = sensors.getTempCByIndex(2);
      Vorlauftemp = temp[0];
      Puffer = temp[1];
      Aussentemp = temp[2];
 
      
   //Vorlauftemp = sensors.getTempCByIndex(0);
//   Puffer = sensors.getTempCByIndex(1);
//    Aussentemp = sensors.getTempCByIndex(2);
    Serial.print("Puffer:");
    Serial.println(Puffer);
    Serial.print("Vorlauftemp:");
    Serial.println(Vorlauftemp);
    Serial.print("Aussentemp:");
    Serial.println(Aussentemp);
    
    
    //----------------------------------------------------------------------------------
    // Umwandeln der Aussenfühlertemperatur in Vorlauftemperaturen
    
    Vorlauftemp_soll = (Aussentemp + 273);  //Umwandlung der gemessenen Temperatur in Kelvin um positive Werte zu erhalten
    Vorlauftemp_soll = map (Vorlauftemp_soll , 303, 263, 10, 45);
    Serial.print("Vorlauftemp_soll:");
    Serial.println(Vorlauftemp_soll);

    //----------------------------------------------------------------------------------
    // Entscheiden ob der Kessel gestartet wird oder erstmal der Pufferinhalt "genutzt" wird, Heizkreis bei Mindesttemp einschalten.

    if (Puffer <= Ladetemp)
    { 
      digitalWrite(Kessel_ein, HIGH);
      digitalWrite(Ladepumpe_ein, HIGH);
      (Ladetemp = 29);    // Wenn der Kessel anspringen muß, die Puffertemp hoch setzten, damit der Kessel eine gewisse Laufzeit bekommt
      Serial.println ("Puffertemp niedrig, Kessel eingeschaltet");
    }
    else 
    {
      digitalWrite(Kessel_ein, LOW);
      digitalWrite(Ladepumpe_ein, LOW);
      (Ladetemp = 22);    // Muß der Kessel nicht anspringen, kann der Puffer bis zur Mindesttemp leer gefahren werden
      Serial.println ("Puffertemp ausreichend, Kessel aus");  
    }

    if (Puffer >= 25)      // Heizkreis erst einschalten wenn eine gewisse Mindesttemperatur vorhanden ist
    {
      digitalWrite (Heizkreis_ein, HIGH);      
      Serial.println ("Heizkreis Ein");
    }


  //------> MISCHEN Anfang

    if (Vorlauftemp > (Vorlauftemp_soll + hyst)) // Mischer zu - Temperatur runter
    {    
      MischenA = millis();    
      while (millis() - MischenA < ((Vorlauftemp - Vorlauftemp_soll) * 500)) //Differenztemp *500ms = Ansteuerzeit des Mischers
      {  
        digitalWrite(Mischer_ZU, HIGH);
      }
      digitalWrite(Mischer_ZU, LOW);
      Serial.print("Mischzeit ist ");
      Serial.println(((Vorlauftemp - Vorlauftemp_soll) * 500));
      Serial.println("Mischer faehrt ZU");
    }
    if (Vorlauftemp < (Vorlauftemp_soll - hyst)) // Mischer auf - Temperatur erhoehen 
    {    
      MischenA = millis();    
      while (millis() - MischenA < ((Vorlauftemp_soll - Vorlauftemp) * 500)) 
      {    
        digitalWrite(Mischer_AUF, HIGH);
      }
      digitalWrite(Mischer_AUF, LOW);
      Serial.print("Mischzeit ist ");
      Serial.println(((Vorlauftemp_soll - Vorlauftemp) * 500));
      Serial.println("Mischer faehrt AUF");
    }
    WartenB = millis();  
  } //--------MISCHEN Ende-----------------

}      //MISCHER End

Jedes mal wenn Daten übertragen werden, wird die Relaissteuerung unterbrochen.
Wie bekomme ich das hin ohne das nun hin ohne diese Unterbrechung?

Du gehst sehr verschwenderisch mit deinem RAM um. Davon gibt es nicht viel. Alle String Literale werden am Anfang automatisch ins RAM kopiert.

Mach mal überall wo du print() Anweisungen hast (sowohl bei Serial aus auch Client) ein F() um den String. So:
Serial.println(F("String im Flash"));
Dann bleibt das im Flash.

Und lass diesen Blödsinn sein:

client.print("&key=" + String(key));

Mit der String Klasse machst du Schweizer Käse aus deinem RAM. Vor allem bei solchen unnötigen Konkatenierungen. Dem Ethernet Controller ist es völlig egal ob du da zwei print() Anweisungen hintereinander machst oder ob das in einem String steht.

Was du du machst ist folgendes:
1.) Dynamischen Speicher anlegen und "key" da rein kopieren
2.) Noch mehr dynamischen Speicher anlegen und die zwei Strings zusammenfügen
3.) Den ersten Speicherbereich wieder freigeben

Zusätzlich belegen die zwei Strings noch statisch RAM. Statt dessen einfach:

client.print(F("&key="));
client.print(key);

Hallo,
und statt "client.print" sollte man lieber "client.write" verwenden!

Viele Grüße, paulinchen

Mit write() geht allerdings das F-Makro nicht. Dann ist wieder das RAM praktisch voll.

Im Moment sieht es danach aus, dass es standardmäßig nicht ganz voll ist, und der Sketch noch läuft. Es ist aber an der Grenze und wenn dann durch die String Klasse dynamisch Speicher angelegt wird, ist es voll und der Controller stürzt aber oder resettet.

OK, ich benutze dazu auch die Flash-Libraries...

also:

      FS_HTML_024.copy(MyFlashString);  //"HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n"    
      MyClient.write(MyFlashString);

paulinchen

danke für die nett hilfe, werde das mal alles umsetzen und mich dann noch mal melden.