Problem beim dbQuery

Hallo Forum,
ich habe mal wieder ein Problem, welches ich nicht ganz verstehe, dabei habe ich eine Funktion die das eingehende Signal meines 433MHz Receivers auswertet (klappt) und eine Funktion die diese Werte in eine DB schreibt(klappt). Kombiniere ich beides (Endziel) dann stürzt der Code immer an der Stelle ab an der die DB-Funktion aufgerufen wird. Mir ist jedoch schleierhaft warum, eventuell kann von euch mal jemand drauf schauen.
mfg
Balli

void klimaausgabe(int sensorID,byte channel, int temp,short int humidity)
{
    zwischenspeicher_array[sensorID]++;
    if(zwischenspeicher_array[sensorID] == 20)
    {
        Serial.print(temp); 
        Serial.print(" ");
        Serial.print(humidity);
        Serial.print(" ");
        Serial.println(channel);
        dbQuery_Klima(sensorID,temp,humidity); //HIER FINDET DER ABSTURZ STATT!!!GEÄNDERT!!!!
        zwischenspeicher_array[sensorID] = 0;
     }
}

void showTempHumi(byte *data)
{
  // is data a ThermoHygro-device?
  if ((data[3] & 0x1f) == 0x1e)
  {
    byte channel, randomId;
    int temp;
    short int humidity;
    // Decode the data
    SensorReceiver::decodeThermoHygro(data, channel, randomId, temp, humidity);
       if(zwischenspeicher_array[0] == 2)
       {
         int sensorID = channel;
         klimaausgabe(sensorID,channel,temp,humidity);  
         zwischenspeicher_array[0] = 0;
       }
       else
       {
         zwischenspeicher_array[0]++;
       }
     } 
}

void dbQuery_Klima(int sensorID, int temp, int luftfeuchtigkeit )
{
  //Verbindung als Client aufbauen - Ziel Homepage
  client_out_klima.connect(serverName, 80);
  if(client_out_klima.connected())
  {
    char buffer[90]; //muss gross genug sein für den kompletten String inkl. der Integerwerte als String
    //umwandeln
    sprintf(buffer,"GET /hc_arduino_php/klima.php?sensor=%d&temp=%d&luft=%d HTTP/1.0",sensorID,temp,luftfeuchtigkeit);  
    Serial.println("bin connected");
    Serial.println(buffer);
    client_out_klima.println(buffer);
    client_out_klima.println("Host: www.hemitheconyx-caudicinctus.de");
    client_out_klima.println();
    Serial.println("habe alles ausgeführt");      
 }
  else
  {
    Serial.println("bin doch gar nicht verbunden");
  }
  client_out_klima.stop(); 
}

Bitte mal den vollständigen Sketch hochladen, wenn der Code eigentlich funktioniert, liegt es vermutlich am Glue-Code der außen drumrum ist.

Okay, ich danke dir mal wieder für deine Hilfe.
Anbei die Datei.

Terrarium_Neu.ino (12.7 KB)

Hi, ich würde die "Downloader" gerne um einen Kommentar bitten, auch warum Sie eventuell nicht in der Lage sind mir zu Helfen. Auch Kommentar wie, ich verstehe deinen Code nicht helfen weiter!
Danke

Ich würde schätzen, Dir geht das RAM aus. Läuft der Code auf einem UNO (oder einem anderen Arduino mit ATmega328)?

Ändere mal alle Aufrufe von *.print() bzw *.println() mit konstanten Strings so ab:

Aus

Serial.println("habe alles ausgeführt");

wird

Serial.println(F("habe alles ausgeführt"));

Damit werden die Strings im Programmspeicher abgelegt und direkt von dort ausgelesen, verschwenden also kein kostbares RAM mehr. Das könnte Dir bereits genügend Luft verschaffen. Alternativ kannst Du das mal auf einem Mega ausführen, der hat deutlich mehr RAM.

Zusätzlich würde ich nur noch einen EthernetClient verwenden, den kannst Du für alle drei Verbindungen nutzen, weil Du ja jedesmal mit connect() eine neue Verbindung aufbaust und diese auch innerhalb der Funktion wieder mit stop() beendest. Somit dürfte es keine Überlagerungen mit gleichzeitig geöffneten Verbindungen geben. Für jeden EthernetClient werden ja auch wieder Strukturen im RAM angelegt.
Dazu kommt, das Deine vielen globalen Integer-Arrays und -Variablen schon grob überschlagen 200 Bytes und damit 10% Speicher belegen. Aus den meisten könnte man sicher Bytes machen.

Okay, also alles Schritt für SchrittG, das einführen eines "F"s reicht also aus um das ganze aus dem RAM zu befreien, werde ich dann einmal tun.
Läuft übrigens auf einem Mega2560Rev.3
Wenn ich meine Integerwerte in bytes umwandeln würde, gewinne ich also auch Speicherplatz, interessant, lese ich mir nachher alles mal durch.
vielen Dank.

Ein Integer benötigt 2 bytes, während ein Byte halt nur ein Byte braucht :slight_smile:
Aber aufpassen, das klappt nur bei Werten die maximal 255 werden.

Das heißt alle Zahlenwerte von 0 bis 254 kann ich ohne problem in bytes umwandeln?

Hi,
ich glaube ich habe das eigentliche Problem entdeckt:
Eine Teil-Funktion funktioniert doch nicht wirklich.

//KLAPPT
void dbQuery_Klima(byte channel,int temp)
{
  char buffer[60]; //muss gross genug sein für den kompletten String inkl. der Integerwerte als String
  sprintf(buffer,"GET /hc_arduino_php/status.php?sensor=%d&temp=%d HTTP/1.0",channel,temp);
  Serial.println(buffer);
}
//KLAPPT NICHT!
void dbQuery_Klima(byte channel,int temp, short int humidity)
{
  char buffer[80]; //muss gross genug sein für den kompletten String inkl. der Integerwerte als String
  sprintf(buffer,"GET /hc_arduino_php/status.php?sensor=%d&temp=%d&luft=%d HTTP/1.0",channel,temp,humidity);
  Serial.println(buffer);
}

okay, es klappt indem ich den Buffer vergrößere, bzw. die Zeichenkette verkürze.

So nun noch das gesamte Query einbinden und dann schaun mer mal.
mfg
Balli

okay, leider klappt mein spaß immer noch nicht, deswegen werde ich heute erstmal alle integer Werte in byte umwandeln.

Ist das dabei das folgende Beispiel korrekt?

int array[2][3]={{8,16,20},{9,20,22}}
//Umgewandelt
byte array[2][3]={{1000,10000,10100},{1001,10100,10110}}

mfg
Balli

Im Prinzip schon, nur bedeutet Byte nicht zwingend binäre Schreibweise, die dazu auch noch falsch ist.

byte array[2][3]={{8,16,20},{9,20,22}}

reicht völlig. Die Werte im Array dürfen ja nur nicht größer als 255 werden, das ist alles.

Aber wenn Du einen Mega2560 hast, sollte der RAM doch eigentlich reichen. Vor allem, wenn Du die ganzen Strings in den Flashspeicher verlegt hast.
Hast Du die EthernetClients mal auf einen einzigen reduziert?

Hi,
erst einmal sehe ich meinen Fehler bei der Umrechnung nicht.
8=>1000
16=>10000
20=>10100
9=>1001
20=>10100
22=>10110
oder liegt es am fehlenden b vor den Binäries?

Ich hatte es getestet, aber es wollte noch nicht so wie ich es wollte. Habe den Code aber gerade deutlich optimiert und werde heute nachmittag seine Funktionalität testen.
mfg
Balli

folgenden Code, werde ich heute Nachmittag ausprobieren, ich denke Fehlerhaft könnten noch die Buffer-Funktionen sein(auf Grund der Übergabe eines char[]).

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;               //Uhr
int zwischenspeicher = 0;
#include <SensorReceiver.h>  //433Mhz-Empfänger
int zwischenspeicher_array[5] ={0,0,0,0,0}; 

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

// MAC und IP Konfiguration
byte mac[] = { 0xDE, 0xAD, 0xBC, 0xAF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
IPAddress gateway(192,168,1, 1);
IPAddress dns(8,8,8,8);
IPAddress subnet(255, 255, 255, 0);

// warten auf port 23
EthernetServer server(23);
char serverName[] = "www.hemitheconyx-caudicinctus.de";
char host[] = "Host: www.hemitheconyx-caudicinctus.de";
EthernetClient client;

int zeitsteuerung[4][3] = {             //Position im Statusarray, Anzeit,Auszeit
                            { 0,10,20},  //Tageslicht von 10 bis 20 Uhr 0 entspricht der Position im Statusarray
                            { 5,20,22},  //IKEA von 20 bis 22
                            {10,20,22},  //Deckenbeleuchtung 20 bis 22
                            { 2,20,22}
                          }; 
int anzahl_intervalle = 4;

int zeitsteuerung2intervalle[4][5] = {            //Position, Anzeit1,Auszeit1,Anzeit2,Auszeit2
                                 {3,15,16,10,12},   //Heizlampen von 17 bis 18 und 10 bis 12 Uhr
                                 {4,15,16,10,12},
                                 {7,22,23, 0, 5},   //IR von 22 bis 23 Uhr und 0 bis 5Uhr
                                 {8,22,23, 0, 5}
                               };
int anzahl_2intervalle = 4;

int beregnung[1][5] = {{6,18,17,0,20}}; //Beregnung Position im Statusarray, An Stundenwert, Minutenwert Sekundean, Sekundaus
int anzahl_beregnung = 1;

int geraeteStatus[11][3] = {              //Pin, ob HIGH oder LOW Geraet anschaltet, Status 0 => off und 1 => on
                            {35,1,0},     //0 Tageslicht
                            {12,0,0},     //1 Höhle unten
                            {11,0,0},     //2 Decke unten
                            {33,1,0},     //3 Heizlampe oben
                            {37,1,0},     //4 Heizlampe unten
                            {31,1,0},     //5 IKEA Aussen LEDs
                            {39,1,0},     //6 Beregnungsanlage
                            { 5,0,0},     //7 IR unten
                            { 6,0,0},     //8 IR oben
                            { 8,0,0},     //9 Höhle oben
                            { 9,0,0}      //10 Decke oben 
                          };    
int anzahl_Geraete = 11;

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    if (! RTC.isrunning())
    {
       Serial.println("RTC is NOT running!");
       RTC.adjust(DateTime("Jul 24 2012", "17:41:00"));
    }
    //Geraete als Output definieren
    for(int i = 0; i<anzahl_Geraete;i++)
    {
      pinMode(geraeteStatus[i][0],OUTPUT);
    }
    //Implementierung des 433Mhz Empfängers 
    SensorReceiver::init(0, showTempHumi);
    //Ethernet starten
    Ethernet.begin(mac, ip, dns, gateway, subnet);
    delay(1000);
    // Server starten
    server.begin();
    delay(3000);
}

void loop () {
  DateTime now = RTC.now();
  int minuten = now.minute();
  int stunden = now.hour();
  int sekunden = now.second();
  if(zwischenspeicher != minuten)
  {
    Serial.print(stunden);
    Serial.print(F(":"));
    Serial.println(minuten);
    zwischenspeicher = minuten;
  }
  uhrzeitauswerten(stunden,minuten,sekunden);
  statusauswerten();
  webInput();
}
//Funktion die die Geräte an oder aus schalltet
void statusauswerten()
{
  for(int i = 0; i<anzahl_Geraete; i++)
  {
    if(geraeteStatus[i][1] == 0)
    {
      if(geraeteStatus[i][2] == 1)
      {
         digitalWrite(geraeteStatus[i][0],HIGH);  //AN bei Geraeten mit HIGH =>On
      }
      else
      {
         digitalWrite(geraeteStatus[i][0],LOW);  //AUS bei Geraeten mit LOW =>Off
      }
    }
    else
    {
      if(geraeteStatus[i][2] == 1)
      {
         digitalWrite(geraeteStatus[i][0],LOW);  //AN bei Geraeten mit LOW =>On
      }
      else
      {
         digitalWrite(geraeteStatus[i][0],HIGH);  //AUS bei Geraeten mit HIGH =>Off
      }
    }
  }
}
//Funktion die in Abhängigkeit der Uhrzeit festlegt ob ein Gerät an oder aus ist
void uhrzeitauswerten(int stunden,int minuten, int sekunden)
{
  /*
  * Zeitsteurerung Stunden basiert zwei Intervalle
  */
  for (int i = 0; i<anzahl_2intervalle; i++)
  {
    if(((stunden >= zeitsteuerung2intervalle[i][1]) && (stunden < zeitsteuerung2intervalle [i][2])) || ((stunden >= zeitsteuerung2intervalle[i][3]) && (stunden < zeitsteuerung2intervalle [i][4])))
    {
      statusan(zeitsteuerung2intervalle[i][0]);
    }
    else
    {
      statusaus(zeitsteuerung2intervalle[i][0]);
    }
  }
  /*
  * Zeitsteurerung Stunden basiert ein Intervall
  */
  for (int i = 0; i<anzahl_intervalle; i++)
  {
    if((stunden >= zeitsteuerung[i][1]) && (stunden < zeitsteuerung [i][2]))
    {
      statusan(zeitsteuerung[i][0]);
    }
    else
    {
      statusaus(zeitsteuerung[i][0]);
    }
  }
  /*
  * Zeitsteurerung beregnung
  */
  for (int i = 0; i<anzahl_beregnung; i++)
  {
    if((stunden == beregnung[i][1]) && (minuten == beregnung [i][2]) && (sekunden >= beregnung[i][3]) && (sekunden <= beregnung[i][4]))
    {
      statusan(beregnung[i][0]);
    }
    else
    {
      statusaus(beregnung[i][0]);
    }
  }
}
void showTempHumi(byte *data)
{
  if ((data[3] & 0x1f) == 0x1e) // is data a ThermoHygro-device?
  {
    byte channel, randomId;
    int temp;
    short int humidity;
    SensorReceiver::decodeThermoHygro(data, channel, randomId, temp, humidity);
       if(zwischenspeicher_array[0] == 2)
       {
         zwischenspeicher_array[channel]++;
         if(zwischenspeicher_array[channel] == 20))//20igster Wert in DB
         {
           dbQuery(klimabuffer(channel,temp,humidity));
           zwischenspeicher_array[channel] = 0;
         }
         zwischenspeicher_array[0] = 0;
       }
       else
       {
         zwischenspeicher_array[0]++;
       }
     } 
}
void dbQuery(char buffer)
{
  client.connect(serverName, 80);
  if(client.connected())
  {
    client.println(buffer);
    client.println(host);
    client.println();    
  }
  else{}   //tue nichts ist nicht verbunden
  client.stop();  
}

void webInput()
{
  client = server.available();
  if (client) {
    char command =client.read();
    client.stop();
    if(command == 'S')
    {
      commandoauswerten(1);
    }
    if(command == 'A')
    {
      commandoauswerten(9);
    }
  }
}

void commandauswerten(int position)
{
  if(geraeteStatus[position][2] == 0)
  {
    geraeteStatus[position][2] = 1;
    dbQuery(geraeteStatus[position][0],1);
  }
  else
  {
    geraeteStatus[position][2] = 0;
    dbQuery(statusbuffer(geraeteStatus[position][0],0));
  }
}

void statusaus(int position)
{
  if(geraeteStatus[position][2] == 1)
  {
    dbQuery_Status(statusbuffer(geraeteStatus[position][0],0));
  }
  geraeteStatus[position][2] = 0;
}

void statusan(int position)
{
  if(geraeteStatus[position][2] == 0)
  {
    dbQuery_Status(geraeteStatus[position][0],1);
  }
  geraeteStatus[position][2] = 1;
}

char klimabuffer(byte sensor,int temp,short int luft)
{
  char buffer[44]; //Achtung Size!!!
  sprintf(buffer,"GET /php/k.php?sensor=%d&t=%d&l=%d HTTP/1.0",sensor,temp,luft);
  return buffer;
}

char statusbuffer(int pin,int status)
{
  char buffer[35]; //Achtung Size!!!
  sprintf(buffer,"GET /php/s.php?p=%d&s=%d HTTP/1.0",pin,status);
  return buffer;
}

Das wird so nicht klappen, Du musst einen Zeiger auf den Puffer übergeben und die Puffer-Funktionen müssen einen Zeiger auf den Puffer zurückliefern.

Hi,
ich habe deine Antwort leider erst eben gesehen und bis dato folgenden Code getestet, doch der scheitert auch daran das die Funktion klimabuffer(), nicht richtig ausgeführt wird.

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
/*********************************************************************************
***************************Terrariensteuerung 0.5*********************************
*    Tim Balschmiter www.hemitheconyx-caudicinctus.de
*    Unterstützung von:
*    mkl0815 ( ethernet, aber mit seinen Beitraegen auch sonst sehr)
*    Marcu W
*    uwefed
*    circuit99
*    cetax (stellte wichtige Fragen)
*    sth77
*    weiter aufzählen
*    alle Fragen ob sie namentlich genannt werden wollen 
*/

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;               //Uhr
int zwischenspeicher = 0;
#include <SensorReceiver.h>  //433Mhz-Empfänger
int zwischenspeicher_array[5] ={0,0,0,0,0}; 

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

// MAC und IP Konfiguration
byte mac[] = { 0xDE, 0xAD, 0xBC, 0xAF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
IPAddress gateway(192,168,1, 1);
IPAddress dns(8,8,8,8);
IPAddress subnet(255, 255, 255, 0);

// warten auf port 23
EthernetServer server(23);
char serverName[] = "www.hemitheconyx-caudicinctus.de";
char host[] = "Host: www.hemitheconyx-caudicinctus.de";
EthernetClient client;

byte zeitsteuerung[4][3] = {             //Position im Statusarray, Anzeit,Auszeit
                            { 0,10,20},  //Tageslicht von 10 bis 20 Uhr 0 entspricht der Position im Statusarray
                            { 5,20,22},  //IKEA von 20 bis 22
                            {10,20,22},  //Deckenbeleuchtung 20 bis 22
                            { 2,20,22}
                          }; 
int anzahl_intervalle = 4;

byte zeitsteuerung2intervalle[4][5] = {            //Position, Anzeit1,Auszeit1,Anzeit2,Auszeit2
                                 {3,15,16,10,12},   //Heizlampen von 17 bis 18 und 10 bis 12 Uhr
                                 {4,15,16,10,12},
                                 {7,22,23, 0, 5},   //IR von 22 bis 23 Uhr und 0 bis 5Uhr
                                 {8,22,23, 0, 5}
                               };
int anzahl_2intervalle = 4;

byte beregnung[1][5] = {{6,18,17,0,20}}; //Beregnung Position im Statusarray, An Stundenwert, Minutenwert Sekundean, Sekundaus
int anzahl_beregnung = 1;

byte geraeteStatus[11][3] = {              //Pin, ob HIGH oder LOW Geraet anschaltet, Status 0 => off und 1 => on
                            {35,1,0},     //0 Tageslicht
                            {12,0,0},     //1 Höhle unten
                            {11,0,0},     //2 Decke unten
                            {33,1,0},     //3 Heizlampe oben
                            {37,1,0},     //4 Heizlampe unten
                            {31,1,0},     //5 IKEA Aussen LEDs
                            {39,1,0},     //6 Beregnungsanlage
                            { 5,0,0},     //7 IR unten
                            { 6,0,0},     //8 IR oben
                            { 8,0,0},     //9 Höhle oben
                            { 9,0,0}      //10 Decke oben 
                          };    
int anzahl_Geraete = 11;

char buffer[50] = "";

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    if (! RTC.isrunning())
    {
       Serial.println("RTC is NOT running!");
       RTC.adjust(DateTime("Jul 24 2012", "17:41:00"));
    }
    //Geraete als Output definieren
    for(int i = 0; i<anzahl_Geraete;i++)
    {
      pinMode(geraeteStatus[i][0],OUTPUT);
    }
    //Implementierung des 433Mhz Empfängers 
    SensorReceiver::init(0, showTempHumi);
    //Ethernet starten
    Ethernet.begin(mac, ip, dns, gateway, subnet);
    delay(1000);
    // Server starten
    server.begin();
    delay(3000);
}

void loop () {
  DateTime now = RTC.now();
  int minuten = now.minute();
  int stunden = now.hour();
  int sekunden = now.second();
  if(zwischenspeicher != sekunden)
  {
    Serial.print(stunden);
    Serial.print(F(":"));
    Serial.println(minuten);
    zwischenspeicher = minuten;
  }
  uhrzeitauswerten(stunden,minuten,sekunden);
  statusauswerten();
  webInput();
}
//Funktion die die Geräte an oder aus schalltet
void statusauswerten()
{
  for(int i = 0; i<anzahl_Geraete; i++)
  {
    if(geraeteStatus[i][1] == 0)
    {
      if(geraeteStatus[i][2] == 1)
      {
         digitalWrite(geraeteStatus[i][0],HIGH);  //AN bei Geraeten mit HIGH =>On
      }
      else
      {
         digitalWrite(geraeteStatus[i][0],LOW);  //AUS bei Geraeten mit LOW =>Off
      }
    }
    else
    {
      if(geraeteStatus[i][2] == 1)
      {
         digitalWrite(geraeteStatus[i][0],LOW);  //AN bei Geraeten mit LOW =>On
      }
      else
      {
         digitalWrite(geraeteStatus[i][0],HIGH);  //AUS bei Geraeten mit HIGH =>Off
      }
    }
  }
}
//Funktion die in Abhängigkeit der Uhrzeit festlegt ob ein Gerät an oder aus ist
void uhrzeitauswerten(int stunden,int minuten, int sekunden)
{
  /*
  * Zeitsteurerung Stunden basiert zwei Intervalle
  */
  for (int i = 0; i<anzahl_2intervalle; i++)
  {
    if(((stunden >= zeitsteuerung2intervalle[i][1]) && (stunden < zeitsteuerung2intervalle [i][2])) || ((stunden >= zeitsteuerung2intervalle[i][3]) && (stunden < zeitsteuerung2intervalle [i][4])))
    {
      statusan(zeitsteuerung2intervalle[i][0]);
    }
    else
    {
      statusaus(zeitsteuerung2intervalle[i][0]);
    }
  }
  /*
  * Zeitsteurerung Stunden basiert ein Intervall
  */
  for (int i = 0; i<anzahl_intervalle; i++)
  {
    if((stunden >= zeitsteuerung[i][1]) && (stunden < zeitsteuerung [i][2]))
    {
      statusan(zeitsteuerung[i][0]);
    }
    else
    {
      statusaus(zeitsteuerung[i][0]);
    }
  }
  /*
  * Zeitsteurerung beregnung
  */
  for (int i = 0; i<anzahl_beregnung; i++)
  {
    if((stunden == beregnung[i][1]) && (minuten == beregnung [i][2]) && (sekunden >= beregnung[i][3]) && (sekunden <= beregnung[i][4]))
    {
      statusan(beregnung[i][0]);
    }
    else
    {
      statusaus(beregnung[i][0]);
    }
  }
}
void showTempHumi(byte *data)
{
  if ((data[3] & 0x1f) == 0x1e) // is data a ThermoHygro-device?
  {
    byte channel, randomId;
    int temp;
    short int humidity;
    SensorReceiver::decodeThermoHygro(data, channel, randomId, temp, humidity);
       if(zwischenspeicher_array[0] == 2)
       {
         zwischenspeicher_array[channel]++;
         if(zwischenspeicher_array[channel] == 1)//20igster Wert in DB
         {
           klimabuffer(channel,temp,humidity);
           dbQuery();
           zwischenspeicher_array[channel] = 0;
         }
         zwischenspeicher_array[0] = 0;
       }
       else
       {
         zwischenspeicher_array[0]++;
       }
     } 
}
void dbQuery()
{
  Serial.println(buffer);
  client.connect(serverName, 80);
  if(client.connected())
  {
    client.println(buffer);
    client.println(host);
    client.println();    
  }   // nicht verbunden
  client.stop();  
}

void webInput()
{
  client = server.available();
  if (client)
  {
    char command =client.read();
    client.stop();
    if(command == 'S')
    {
      commandoauswerten(1);
    }
    if(command == 'A')
    {
      commandoauswerten(9);
    }
  }
}

void commandoauswerten(int position)
{
  if(geraeteStatus[position][2] == 0)
  {
    geraeteStatus[position][2] = 1;
    statusbuffer(geraeteStatus[position][0],1);
    dbQuery();
  }
  else
  {
    geraeteStatus[position][2] = 0;
    statusbuffer(geraeteStatus[position][0],0);
    dbQuery();
  }
}

void statusaus(int position)
{
  if(geraeteStatus[position][2] == 1)
  {
    statusbuffer(geraeteStatus[position][0],0);
    dbQuery();
  }
  geraeteStatus[position][2] = 0;
}

void statusan(int position)
{
  if(geraeteStatus[position][2] == 0)
  {
    statusbuffer(geraeteStatus[position][0],0);
    dbQuery();
  }
  geraeteStatus[position][2] = 1;
}

void klimabuffer(byte sensor,int temp,short int luft)
{
  Serial.println(F("KLIMA"));
  sprintf(buffer,"GET /php/k.php?sensor=%d&t=%d&l=%d HTTP/1.0",sensor,temp,luft);
}

void statusbuffer(int pin,int statuswert)
{
  Serial.println(F("SENSOR"));
  sprintf(buffer,"GET /php/s.php?p=%d&s=%d HTTP/1.0",pin,statuswert);
}

ich werde jetzt mal die Syntax für Pointer durchgehen.
mfg
Balli

Der Buffer ist zu klein. Schon ohne Werte stehen da 40 Bytes in Deiner sprintf Zeile in der Funktion klimabuffer() und Du schreibst noch 3 Zahlen in den String. Dazu muss ja zusätzlich noch das abschliessende 0-Byte. Mach mal den Puffer 80 oder 100 Bytes lang. Ansonsten sollte das schon so funktionieren. Ein weiterer Vorteil ist, das Du nur einmal den RAM für den Puffer verbrauchst. Allerdings musst Du aufpassen, weil jede Funktion den Inhalt jeweils überschreibt.

Danke für die Info,
das mit dem abschließenden \0 -Byte habe ich noch nicht ganz verstanden (also die Funktionsweise schon).

void klimabuffer(byte sensor,int temp,short int luft)
{
  sprintf(buffer,"GET /php/k.php?sensor=%d&t=%d&l=%d HTTP/1.0",sensor,temp,luft);
}

void statusbuffer(int pin,int status)
{
  sprintf(buffer,"GET /php/s.php?p=%d&s=%d HTTP/1.0",pin,status);
}

Wäre es denn hier jetzt besser gleich

void klimabuffer(byte sensor,int temp,short int luft)
{
  sprintf(buffer,"GET /php/k.php?sensor=%d&t=%d&l=%d HTTP/1.0\0",sensor,temp,luft);
}

void statusbuffer(int pin,int status)
{
  sprintf(buffer,"GET /php/s.php?p=%d&s=%d HTTP/1.0\0",pin,status);
}

zu schreiben?
mfg
Balli

Die Funktionen müssen char* zurückliefern, nur "char" liefert ein einzelnes Zeichen, nicht den ganzen String. Außerdem ist es keine gute Idee, den Zeiger auf einen Speicherbereich zurück zu liefern, der nur innerhalb der Funktion verwendet wird. Theoretisch müßte das gehen, da der Speicher für den jeweiligen Buffer reserviert bleibt, es ist aber kein guter Stil.