Hilfe meine Funktion frisst eine Variable auf.

hi ich schon wieder

ich habe ein Problem im Arduino Sender Code. Dort wird in der Funktion next_t_button eine Variable “geschrottet”. Die Variable wird eingelesen. Und in void loop stimmt sie noch (habe sie mir seriel ausgeben lassen). Wenn der Arduino nun in die genante next_t_button funktion geht bleibt die Variable anfangs noch korrekt, in dem moment wo er wieder in void loop zurück geht ist sie plötzlich ein anderer wert?! :’( :’(

// Project: DIY Thermocyler V2.0 Arduino
// Creator: Tobias and Torben
// Date of Creation: 10.12.16

#include "Nextion.h"

SoftwareSerial HMISerial(10,11); //RX,TX
SoftwareSerial ardserial(4,5); //RX,TX



int cycle = 0;
int cycle_help = 0;
int cycle_temp[] = {};
int cycle_time[] = {}; 
//Variablen fuer debugging
String softser = "";
String softread = "";
//----------------------------------------------------------------------------------------------------------------------
//Nextions Display Buttons

//Home Screen
NexButton start     = NexButton(0,1,"start");
//Nextion Test Mode Buttons
NexButton heat      = NexButton(1,1,"heat");
NexButton cool      = NexButton(1,2,"cool");
NexSlider pwm_heat  = NexSlider(1,6,"pwm_heat");
NexSlider pwm_fan   = NexSlider(1,5,"pwm_fan");
//Nextion Cycle Buttons/Nummber
NexButton check     = NexButton(2,12,"check");
NexNumber n_cycle   = NexNumber(2,16,"n_cycle");
//Nextion Cycle Time Buttons/Nummber
NexButton check_t   = NexButton(5,12,"b11");
NexButton next_t    = NexButton(5,17,"b13");
NexButton back_t    = NexButton(5,16,"b12");
NexNumber n_cycle_t = NexNumber(5,12,"n_cycle");
NexNumber n_cycle_c = NexNumber(5,18,"n0");

//----------------------------------------------------------------------------------------------------------------------
char buffer[100] = {0};

//Button Press abfrage
NexTouch *nex_listen_list[] = {
    
    
    &heat,
    &cool,
    &pwm_heat,
    &pwm_fan,
    &check,
    &check_t,
    &next_t,
    &back_t,
    &start,
    NULL
  
};
//----------------------------------------------------------------------------------------------------------------------
//Arduino Inilisation
void setup() {
 
  nexInit();
  Serial.begin(57600);
  //ardserial.begin(19200);
  while (!Serial){
    
  }
  
  Serial.println("USB-to-PC Connection etablished");  
//----------------------------------------------------------------------------------------------------------------------
//Attach Button Funktions
//Home Screen BUttons
  start.attachPush(start_cycle, &start);

//Attach Test Mode Buttons   
  heat.attachPush(heat_button, &heat);
  cool.attachPush(cool_button, &cool);
  pwm_heat.attachPop(pwm_heat_slider, &pwm_heat);
  pwm_fan.attachPop(pwm_fan_slider, &pwm_fan);

//Attach Cycle Buttons
  check.attachPush(check_cycle_button, &check);
  check_t.attachPush(check_time_button,&check_t);
  next_t.attachPush(next_t_button,&next_t);
  back_t.attachPush(back_t_button,&back_t);
  
//----------------------------------------------------------------------------------------------------------------------
Serial.println("Setup Complet");
}
//Main Loop waiting for actions
void loop() {
 
  
  nexLoop(nex_listen_list);
    
 
}

//----------------------------------------------------------------------------------------------------------------------
//start Cycle
void start_cycle(void *ptr){
  Serial.print("FUCK FUCK");
  sendData();
   
}

//sending data funktion
void sendData(){
  int temp_ok = 0;
  int time_ok = 0;
  int cycle_ok = 0;
  int i = 0;
  while(!ardserial){
    while(cycle_ok == 0){
      ardserial.print("!S"); 
      cycle_ok = ardserial.read(); 
    } 
    ardserial.print(cycle);
    while(temp_ok == 0){ 
      temp_ok  = ardserial.read();
      
    }
    for (byte i = 0; i < (sizeof(cycle_temp)/sizeof(cycle_temp[0])); i++) {
    ardserial.print(cycle_temp[i]);
    }
    i = 0;
    while(time_ok == 0){
      time_ok = ardserial.read();  
    }

    for (byte i = 0; i < (sizeof(cycle_time)/sizeof(cycle_time[0])); i++) {
      ardserial.print(cycle_time[i]);
    }
    delay(100);
    ardserial.print("Finished");
    
  }
  loop();
  
}
//----------------------------------------------------------------------------------------------------------------------
//Read Data from Nextion
void check_cycle_button(void *ptr){
  uint32_t cycle_value_value = 0;
  n_cycle.getValue(&cycle_value_value);
  cycle = cycle_value_value;
  Serial.println(cycle_value_value);
  Serial.println(cycle);
  loop(); 
  
}
//Time of each Cycles
void check_time_button(void *ptr){
  uint32_t cycle_t_value = 0;
  n_cycle_t.getValue(&cycle_t_value);
  cycle_time[cycle_help] = cycle_t_value;
  cycle_help = 0;
  int h = 0;
  for (h = 0; h <sizeof(cycle_time);h++){
    Serial.print(cycle_time[h]);  
  }
  loop(); 
  
}
//Temp for each Cycle
void next_t_button(void *ptr){
  uint32_t cycle_t_value = 0;
  Serial.println("Fucking Cycle: ");
  Serial.print(cycle);
  if (cycle_help == cycle-1){
    n_cycle_t.getValue(&cycle_t_value);
    cycle_time[cycle_help] = cycle_t_value;
    cycle_help = 0;
    n_cycle_c.setValue(cycle_help);
  }else {
    n_cycle_t.getValue(&cycle_t_value);
    cycle_time[cycle_help] = cycle_t_value;
    ++cycle_help;  
    n_cycle_c.setValue(cycle_help);
    n_cycle_t.setValue(0);
 }
 Serial.println(cycle);
  loop(); 
   
}
void back_t_button(void *ptr){
  if (cycle_help == 0){
    cycle_help = cycle;
    n_cycle_t.setValue(cycle_time[cycle_help]);
    n_cycle_c.setValue(cycle_help);
  }else {
    --cycle_help;
    n_cycle_t.setValue(cycle_time[cycle_help]);
    n_cycle_c.setValue(cycle_help);
  }
  loop(); 
   
}
//----------------------------------------------------------------------------------------------------------------------
//Begin Test Mode

void heat_button (void *ptr){
  Serial.println("!T");
  Serial.println("!H"); 
  loop(); 
}
void cool_button (void *ptr){
  Serial.println("!T");
  Serial.println("!C"); 
  loop(); 
}
void pwm_heat_slider (void *ptr){
  uint32_t pwm_heat_value = 0;
  pwm_heat.getValue(&pwm_heat_value);
  Serial.println("!T");
  Serial.println("!V");
  Serial.println(pwm_heat_value); 
  loop(); 
}
void pwm_fan_slider (void *ptr){
  uint32_t pwm_fan_value = 0;
  pwm_fan.getValue(&pwm_fan_value);
  Serial.println("!T");
  Serial.println("!F");
  Serial.println(pwm_fan_value); 
  loop(); 
}

Du rufst loop() innerhalb von anderen Funktionen auf! Was soll das?! Das führt irgendwann zu einem Stack-Überlauf.

Beschäftigte dich mal damit wie Funktionsaufrufe allgemein funktionieren. Das ist unabhängig von der Programmiersprache oder Prozessorarchitektur. Die kehren automatisch wieder dahin zurück wo sie aufgerufen wurden.

Hab die Loop aufrufe entfernt, aber der Fehler tritt immernoch auf

Losspost:
Hab die Loop aufrufe entfernt, aber der Fehler tritt immernoch auf

Bei welcher Variablen tritt der Fehler auf ?

in deiner Funktion next_t_button steht

 cycle_time[cycle_help] = cycle_t_value;

Da cycle_time keine Elemente enthält, ist es egal welchen Wert cycle_help hat: du schreibst immer irgend was kaputt.

Also ich hab jetzt mal ein wenig “getrickst” und nutze nun den Speicher. Ich speicher die werte zwischen und gebe sie dann wieder aus. Ich werde vermutlich gleich wieder beschimpft das das so nicht schön ist :slight_smile: aber es funktioniert.

// Project: DIY Thermocyler V2.0 Arduino
// Creator: Tobias and Torben
// Date of Creation: 10.12.16

#include "Nextion.h"
#include <EEPROM.h>

SoftwareSerial HMISerial(10,11); //RX,TX
SoftwareSerial ardserial(4,5); //RX,TX



int cycle = 0;
int cycle_help = 0;
int cycle_temp[] = {0};
//int cycle_time[] = {0}; 
//Variablen fuer debugging
String softser = "";
String softread = "";
//----------------------------------------------------------------------------------------------------------------------
//Nextions Display Buttons

//Home Screen
NexButton start     = NexButton(0,1,"start");
//Nextion Test Mode Buttons
NexButton heat      = NexButton(1,1,"heat");
NexButton cool      = NexButton(1,2,"cool");
NexSlider pwm_heat  = NexSlider(1,6,"pwm_heat");
NexSlider pwm_fan   = NexSlider(1,5,"pwm_fan");
//Nextion Cycle Buttons/Nummber
NexButton check     = NexButton(2,12,"check");
NexNumber n_cycle   = NexNumber(2,16,"n_cycle");
//Nextion Cycle Time Buttons/Nummber
NexButton check_t   = NexButton(5,12,"b11");
NexButton next_t    = NexButton(5,17,"b13");
NexButton back_t    = NexButton(5,16,"b12");
NexNumber n_cycle_t = NexNumber(5,12,"n_cycle");
NexNumber n_cycle_c = NexNumber(5,18,"n0");

//----------------------------------------------------------------------------------------------------------------------
char buffer[100] = {0};

//Button Press abfrage
NexTouch *nex_listen_list[] = {
    
    
    &heat,
    &cool,
    &pwm_heat,
    &pwm_fan,
    &check,
    &check_t,
    &next_t,
    &back_t,
    &start,
    NULL
  
};
//----------------------------------------------------------------------------------------------------------------------
//Arduino Inilisation
void setup() {
 
  nexInit();
  Serial.begin(57600);
  //ardserial.begin(19200);
  while (!Serial){
    
  }
  
  Serial.println("USB-to-PC Connection etablished");  
//----------------------------------------------------------------------------------------------------------------------
//Attach Button Funktions
//Home Screen BUttons
  start.attachPush(start_cycle, &start);

//Attach Test Mode Buttons   
  heat.attachPush(heat_button, &heat);
  cool.attachPush(cool_button, &cool);
  pwm_heat.attachPop(pwm_heat_slider, &pwm_heat);
  pwm_fan.attachPop(pwm_fan_slider, &pwm_fan);

//Attach Cycle Buttons
  check.attachPush(check_cycle_button, &check);
  check_t.attachPush(check_time_button,&check_t);
  next_t.attachPush(next_t_button,&next_t);
  back_t.attachPush(back_t_button,&back_t);
  
//----------------------------------------------------------------------------------------------------------------------
Serial.println("Setup Complet");
}
//Main Loop waiting for actions
void loop() {
 
  
  nexLoop(nex_listen_list);
    
 
}

//----------------------------------------------------------------------------------------------------------------------
//start Cycle
void start_cycle(void *ptr){
  
  sendData();
   
}

//sending data funktio
void sendData(){
  int temp_ok = 0;
  int time_ok = 0;
  int cycle_ok = 0;
  int i = 0;
  while(!ardserial){
    while(cycle_ok == 0){
      ardserial.print('S'); 
      cycle_ok = ardserial.read(); 
    } 
    ardserial.print(cycle);
    while(temp_ok == 0){ 
      temp_ok  = ardserial.read();
      
    }
    for (byte i = 0; i < (sizeof(cycle_temp)/sizeof(cycle_temp[0])); i++) {
    ardserial.print(cycle_temp[i]);
    }
    i = 0;
    while(time_ok == 0){
      time_ok = ardserial.read();  
    }

    for (byte i = 0; i < cycle; i++) {
      ardserial.print(EEPROM.read(i));
    }
    delay(100);
    ardserial.print("Finished");
    
  }
  
  
}
//----------------------------------------------------------------------------------------------------------------------
//Read Data from Nextion
void check_cycle_button(void *ptr){
  uint32_t cycle_value_value = 0;
  n_cycle.getValue(&cycle_value_value);
  cycle = cycle_value_value;
  Serial.println(cycle_value_value);
  Serial.println(cycle);
  
  EEPROM.write(200,cycle);
  
}
//Time of each Cycles
void check_time_button(void *ptr){
  int cycle_time[cycle] = {0};  

  
  for (int h = 0; h <= cycle;h++){
    cycle_time[h] = EEPROM.read(h);  
  }
  for (int h = 0; h <= cycle+1;h++){
    Serial.print(cycle_time[h]);  
  }
  
  
}
//Temp for each Cycle
void next_t_button(void *ptr){
  uint32_t cycle_t_value = 0;
  cycle = EEPROM.read(200);
  if (cycle_help == cycle){
    n_cycle_t.getValue(&cycle_t_value);
    //cycle_time[cycle_help] = cycle_t_value;
    EEPROM.write(cycle_help,cycle_t_value);
    cycle_help = 0;
    n_cycle.setValue(EEPROM.read(cycle_help));
    n_cycle_c.setValue(cycle_help);
  }else {
    n_cycle_t.getValue(&cycle_t_value);
    //cycle_time[cycle_help] = cycle_t_value;
    EEPROM.write(cycle_help,cycle_t_value);
    ++cycle_help;  
    n_cycle_c.setValue(cycle_help);
    n_cycle_t.setValue(0);
 }

 
  
   
}
void back_t_button(void *ptr){
  if (cycle_help == 0){
    cycle_help = cycle;
    n_cycle_t.setValue(EEPROM.read(cycle_help));
    n_cycle_c.setValue(cycle_help);
  }else {
    --cycle_help;
    
    n_cycle_t.setValue(EEPROM.read(cycle_help));
    n_cycle_c.setValue(cycle_help);
  }
  loop(); 
   
}
//----------------------------------------------------------------------------------------------------------------------
//Begin Test Mode

void heat_button (void *ptr){
  Serial.println('T');
  Serial.println('H'); 
}  
void cool_button (void *ptr){
  Serial.println('T');
  Serial.println('C'); 
  
}
void pwm_heat_slider (void *ptr){
  uint32_t pwm_heat_value = 0;
  pwm_heat.getValue(&pwm_heat_value);
  Serial.println('T');
  Serial.println('V');
  Serial.println(pwm_heat_value); 
  
}
void pwm_fan_slider (void *ptr){
  uint32_t pwm_fan_value = 0;
  pwm_fan.getValue(&pwm_fan_value);
  Serial.println('T');
  Serial.println('F');
  Serial.println(pwm_fan_value); 
  
}

Du nutzt das EEPROM. Das ist eine ganz schlechte Idee

Warum ist das den eine so schlechte Idee :(

Losspost:
Warum ist das den eine so schlechte Idee :frowning:

Da bei einem ständigen Schreibzugriff die Speicherzelle schnell defekt ist.

Warum nimmst du nicht eine globale Variable ?

Das Problem ist das ich ein Globalen Arry brauche, der Variable in der länge ist nur weiß ich nicht wie ich das machen soll`?

Dann wäre wohl eher ein FRAM zu empfehlen. Der behält die Daten ebenfalls beim Ausschalten (>= 150 Jahre), ist schneller als ein EEPROM und läßt sich häufiger beschreiben (10 hoch 14 mal garantiert).

Es gibt einen Thread im Nachbarforum dazu.

Gruß Tommy

Wie wäre es mit einem globalen Array der so groß ist wie der größte der gewünschten variabel langen Arrays? Dazu noch eine Variable die die aktuelle Länge enthält (wenn es kein \0 termierter Text ist...)

Das wäre die Standardherangehensweise.

das könnte theoretisch auch gehen. Aber ich bin auf was gestoßen. Sogenannte Pointer? Bin ich da auf dem richtigen weg oder ist das kompletter unsinn?

Losspost: Sogenannte Pointer?

Bei dem dadurch offenbarten Wissensstand sind pointer/malloc() Lösungen nicht sinnvoll.

Die von mir vorgeschlagene Standardmethode benötigt den geringsten Platz und ist langzeitstabil.

ja das werde ich erstmal umsetzten, ich versuch mich trozdem da mal einzulesen was für zukünftige Projekte sicher nicht schaden kann.

Das ist unbedingt richtig.

Viel Erfolg. :D