Program crash on http request interruption

In line 79 I have an array DATA defined.
During startup I set input 16 (START DATA). It starts up and fill in data into array DATA.

The input is still high so I end up in line 879. All good so far. Because of DATA values it now goes into line 997 part.
From about line 1023 I have a http request giving me a simple number from 0-9 in line 1029.

Now if I set input 16 BUTTON_START_DATA to low then data in DATA is damaged and I can't read it out anymore. But sometimes it doesn't damage the data.
What causes this problem? It seems to be a problem when I interrupt the http data request. What can I do to avoid this?

//After first load Båtomat must connect to Internet to have eeprom updated.

// INPUT
// I15 - D15 start stand alone
// I4  - D4 start homepage data
// I17 - TX2

// OUTPUT
// O12 - D12 horn (relay)
// O27 - D27 device is on and ready after setup (red)
// O25 - D25 stand alone running (green)
// O32 - D32 kapsejlads data running (blue)

// når den ikke kører, så skal den hver 5 s hente Kap data, dette sikrer at data altid er opdateret.
#include <EEPROM.h>       // Save stand alone settings in eeprom
#include <WiFi.h>         // Replace with WiFi.h for ESP32
#include <WebServer.h>    // Replace with WebServer.h for ESP32
#include <AutoConnect.h>  // For AutoConnect Wifi
#include <time.h>         // For NTP time
#include <ArduinoJSON.h>  // For reading JSON data

// For display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// DISPLAY
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 32  // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
#define OLED_RESET 4         // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int KLUBID = 13; //club id horn belongs to

// DISPLAY
int x, minX;
IPAddress ip;

// OUTPUTS
int HORN = 12;            // Output for horn
int LED_AUTO_ALONE = 27;  // Output for LED, program in stand alone
unsigned long LED_AUTO_ALONE_pms = 0; // pms = previous millis
int LED_AUTO_DATA = 25;   // Output for LED, program running homepage data
unsigned long LED_AUTO_DATA_pms = 0; // pms = previous millis
int LED_HANDLE = 32;          // Output for LED, device is on
unsigned long LED_HANDLE_pms = 0; // pms = previous millis

// INPUTS
int START_ALONE = 15;  // Input to start stand alone
int START_DATA = 16;   // Input to start with homepage data
int START_NO_WIFI = 18;   // Input to start with homepage data
int BUTTON_START_ALONE = LOW;
int BUTTON_START_DATA = LOW;
int BUTTON_NO_WIFI = LOW;

//EEPROM
#define EEPROM_SIZE 15  //30 bytes can be saved i eeprom


// SETABLE VARIABLES FROM WEB
int BENYTTESFORKLUBID=KLUBID;
int ALONE_BETWEEN_START = 0;
int ALONE_NUMBER_OF_STARTS = 0;
int ALONE_STARTTIME = 0;
int HORN_SHORTTIME = 1000;
int HORN_LONGTIME = 3000;
int HORN_GOALTIME = 250;
int HORN_TESTTIME = 50;
int DATA_BETWEEN_START = 5;
int DATA_NUMBER_OF_STARTS = 10;
int DATA_STARTTIME = 8;
int NUMBER_OF_STARTS = 0;
const char* DATA[100][12]; 
int TEXTLEN1;
int TEXTLEN2;
int TEXTLEN3;

// CONST TO RUN PROGRAM
int BLINKTIME = 500;        // Time for blinking
int BLINKTIMEFAST = 250;        // Time for blinking
uint32_t STARTDELAY = 0;         //
uint32_t STARTDELAYCD = 0;         //
int BETWEEN_START_DELAY = 0;
int STARTNUM = 0;
int FIVEMIN = 0;              // Time elapsed by 5 min
int FOURMIN = 1 * 60 * 1000;  // Time elapsed by 4 min
int ONEMIN = 4 * 60 * 1000;   // Time elapsed by 1 min
int ZEROMIN = 5 * 60 * 1000;  // Time elapsed by start

// AUTOCONNECT
WebServer Server;  // Replace with WebServer for ESP32
AutoConnect Portal(Server);
AutoConnectConfig Config;

// OK VALUES
String NtpOK="";
String SettingsOK="";
String DataOK="";
String AllDataOK="";
String EepromOK="";

// TIMING VALUES
//signal states 0=not running=allow run, 1=activate/running, 2=output, 3=finished
uint32_t delaystart_t=0; //start time for delay
int delay_s=0; //delay state
uint32_t test_t=2000; //time after startup until testsignal activated
uint32_t hornteststart_t=0; //timer for running test signal function
uint32_t testseq_t=0; //timer for running test signal function
int testseq_s=0; //test signal state
uint32_t startonedelay_t=0; //timer for delay until first count down
int startonedelay_s=0; //first count down timer state
uint32_t startseq_t=0; //timer for running start sequence
int startseq_s=0; //number representing the state of the start sequence.
uint32_t hornsig_t=0; //timer for running horn signal function
int hornsig_s=0; //horn signal state
uint32_t betweenstart_t=0; //timer for delay between starts
int betweenstart_s=0; //between start state
uint32_t blink_t=0; //timer for delay between starts
int blink_s=0; //between start state
uint32_t startmilli=0;  //counter in blink_auto function
int cd_s=0; //count down state
uint32_t cd_t=0; //timer for count down
int goal_s=0; //in goal state
uint32_t goal_t=0; //timer for in goal
uint32_t horn_t=0; //timer for in goal
int numberingoal=0;
int LED_STATE = LOW;
uint32_t onesec = 0;
int Reset_data=1;
int Reset_respit=1;
int Reset_alone=1;
int Reset_test=1;
char Startup_finished=0;
uint32_t respittime=0;
int respitlines=0;
int respitno=0;
String serverpathloeburl;
String serverName = "https://kapsejlads.nu/hide-horn-esp.php";
WiFiClientSecure client;  // Use https
HTTPClient http; 


uint32_t starttimer_t=0;

// Webside fra ESP
// void rootPage(String test) {
//   char content[] = "<!DOCTYPE html><HTML><HEAD></HEAD><BODY>"
//   "<h1>Kapsejlads.nu - HORN</h1>"
//   "<span style=\"color:red\">Afsted med dem!</span>"
//   "</BODY></HTML>";
//   Server.send(200, "text/html", test);
// }
void rootPage() {
  char content[] = "<!DOCTYPE html><HTML><HEAD></HEAD><BODY>"
  "<h1>Kapsejlads.nu - HORN</h1>"
  "<span style=\"color:red\">Afsted med dem!</span>"
  "</BODY></HTML>";
  Server.send(200, "text/html", content);
}
String text1 = "Dette er frank1 ";
String text2 = "Dette er frank2 ";
String text3 = "Dette er frank3 ";
String text4 = text1+text2+text3;

// PRINT NTP TIME
void printLocalTime() {
  struct tm timeinfo;            // skriv tiden til timeinfo som tidskode
  if (!getLocalTime(&timeinfo))  // kontroller om tid er modtaget
  {
    Serial.println("  Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");  // skriv tid til monitor
}

// SET TIMEZONE
void setTimezone(String timezone) {
  Serial.printf("  Setting Timezone to %s\n", timezone.c_str());  // skriv til monitor
  setenv("TZ", timezone.c_str(), 1);                              //  Now adjust the TZ.  Clock settings are adjusted to show the new local time. Indstil til CPH
  tzset();                                                        // indstil tidszonen
}

// GET NTP TIME FROM EUROPE
void initTime(String timezone) {
  struct tm timeinfo;  // write time to "timeinfo"

  Serial.println("  Setting up time");
  configTime(0, 0, "europe.pool.ntp.org");  // First connect to NTP server, with 0 TZ offset. Ingen tidszone eller sommertidskorrektion
  if (!getLocalTime(&timeinfo))             // If can't get NTP time
  {
    Serial.println("  Failed to obtain time");
    NtpOK = "NO";
    return;
  }
  Serial.println("  Got the time from NTP");  // NTP has been received
  NtpOK = "yes";
  // Now we can set the real timezone
  setTimezone(timezone);  // Set timezone 
}


unsigned long Blink_LED(unsigned long  prevMillis, int BLINKTIME, int LED1, int LED2, int LED3){
    // Serial.println("cur"+String(millis()));
    // Serial.println("prev"+String(prevMillis));
  
  if (millis() - prevMillis >= BLINKTIME) {
    prevMillis = millis();
    if (LED_STATE == LOW) {
      LED_STATE = HIGH;
    } else {
      LED_STATE = LOW;
    }
    
    digitalWrite(LED1, LED_STATE);    
    digitalWrite(LED2, LED_STATE);    
    digitalWrite(LED3, LED_STATE);    
    // Serial.println(millis());
    // Serial.println(prevMillis);
    // Serial.println(BLINKTIME);
    // Serial.println(LED1);
    // Serial.println(LED2);
    // Serial.println(LED_STATE);
    
  }
  return prevMillis;
}


String secondsToHMS(unsigned long seconds, const char ms){
  //Serial.println(String(ms));
  int tme=0;
  if(ms == 'y'){                          // If value is millis (milliseconds)
    tme = seconds / 1000;
  } else {
    tme = seconds;
  }
  int hr = tme/3600;                        //Number of seconds in an hour
  int mins = (tme-hr*3600)/60;              //Remove the number of hours and calculate the minutes.
  int sec = tme-hr*3600-mins*60;            //Remove the number of hours and minutes, leaving only seconds.
  
  char toTMS[8];                                //Define char to time
  sprintf(toTMS,"%02d:%02d:%02d",hr,mins,sec);  //Format time
  String hrMinSec = String(toTMS);              //Put time to string.
  // Serial.print("  String Time: ");Serial.println (String(hrMinSec));
  return hrMinSec;
}

String secondsToMS(unsigned long seconds, const char ms){
  //Serial.println(String(ms));
  int tme=0;
  if(ms == 'y'){                          // If value is millis (milliseconds)
    tme = seconds / 1000;
  } else {
    tme = seconds;
  }
  int hr = tme/3600;                        //Number of seconds in an hour
  int mins = (tme-hr*3600)/60;              //Remove the number of hours and calculate the minutes.
  int sec = tme-hr*3600-mins*60;            //Remove the number of hours and minutes, leaving only seconds.
  
  char toTMS[8];                                //Define char to time
  sprintf(toTMS,"%02d:%02d",mins,sec);  //Format time
  String MinSec = String(toTMS);              //Put time to string.
  // Serial.print("  MS string time:");
  // Serial.println(String(MinSec));
  return MinSec;
}

uint32_t HMStoSec(String HMS){
  String hr = String(HMS).substring(0,2);
  String min = String(HMS).substring(3,5);
  String sec = String(HMS).substring(6);
  unsigned long  hrint = hr.toInt() * 60 * 60; // convert to int and calc seconds
  unsigned long  minint = min.toInt() * 60;
  unsigned long  secint = sec.toInt();
  unsigned long  secsint = hrint + minint + secint; // add all seconds

  return secsint;
}



void CountDown(uint32_t cd_t, int sec, int number){
  uint32_t msec_rest;
  uint32_t msec_stop = cd_t + (sec+1) * 1000; //add 1 sec to show time correct, time is rounded down
  String sec_rest;
  if(cd_t==millis()){ //set onesec first time
    onesec=millis();
    // Serial.println(" Onesec first time="+String(onesec));
  }
  // Serial.println(" Onesec="+String(onesec));

  if(millis()>onesec+200){ //only update display 5 times pr sec
    // Serial.println(" Onesec in if="+String(onesec));
    msec_rest=msec_stop - millis();
    sec_rest=secondsToMS(msec_rest,'y');    
    display.setTextSize(3);            // font size
    display.setTextColor(WHITE);       // text color
    display.setTextWrap(false);        // dont make lines break
    display.clearDisplay();            // clear display
    display.setCursor(0, 10);          // start position
    if(number<100){
      display.print(sec_rest+" "+number);  // set time and startnumber
    } 
    if(number==100) {
      display.print(sec_rest+" P");          // set time and pause(P)
    }
    if(number==101) {
      display.print(sec_rest+" S");          // set time and pause(P)
    }
    if(number==102) {
      display.print(sec_rest+" R");          // set time and pause(P)
    }
    if(number==103) {
      display.print(sec_rest+" H");          // set time and pause(P)
    }
    display.display();                 // write to display
    onesec=millis();
  }
}



void setup() {
  Serial.begin(115200);
  Serial.println("SETUP START");

  //DISPLAY STARTUP
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  // delay(2000); // Pause for 2 seconds
  display.setTextSize(1);            // font size
  display.setTextColor(WHITE);       // text color
  display.setTextWrap(false);        // dont make lines break
  display.clearDisplay();            // clear display
  display.setCursor(0, 10);          // start position
  display.print("Kapsejlads.nu startup");    // sæt tekst
  display.setCursor(0, 20);          // ny position
  display.print("by Frank Larsen");  // sæt tekst
  display.display();                 // skriv til display
  x = display.width();               // sæt x = display bredde.
  delay(2000);
  Serial.println("DISPLAY OK");


  // Input Output
  pinMode(START_ALONE, INPUT);
  pinMode(START_DATA, INPUT);
  pinMode(START_NO_WIFI, INPUT);
  pinMode(HORN, OUTPUT);
  pinMode(LED_HANDLE, OUTPUT);
  pinMode(LED_AUTO_ALONE, OUTPUT);
  pinMode(LED_AUTO_DATA, OUTPUT);
  Serial.println("I/O OK");

  // AUTOCONNECT
  Config.apid = "Kapsejlads-horn";
  Config.psk = "Kapsejlads.nu";
  Config.autoReconnect = true;
  Portal.config(Config);
  Serial.println("AUTO CONNECT OK");

  BUTTON_START_DATA = digitalRead(START_DATA);
  Serial.print("  BUTTON_START_DATA = ");
  Serial.println(BUTTON_START_DATA);
  if(BUTTON_START_DATA==HIGH){
    //WAIT 30 s IF IT CAN'T FIND NETWORK. 
    //SHOW AUTOCONNECT SCREEN //(OFF with button during startup)
    Server.on("/", rootPage);
    if (Portal.begin()) { //SWITCH ON NETWORK MAN SCREEN
      Serial.println("  WiFi connected: " + WiFi.localIP().toString());
    }
    Serial.println("ROOTPAGE OK");
    Serial.println(text4);
  }
  Serial.println("BUTTON WIFI START OK");


  delay(1000); // Wait 1 s until wifi is ready
  if (WiFi.status() == WL_CONNECTED) {
    // GET NTP TIME
    initTime("CET-1CEST,M3.5.0,M10.5.0/3");  // Get time for Copenhagen, https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
    Serial.println("  NtpOK= "+String(NtpOK));
    Serial.println("NTP OK");



  
    // SET SERVER NAME AND FILE
    // String serverName = "https://kapsejlads.nu/hide-horn-esp.php";
    // Serial.println("SERVERNAME OK");

    // CONNECT TO KAPSEJLADS HOMEPAGE 
    // WiFiClientSecure client;  // Use https
    // HTTPClient http; 
    client.setInsecure();  // Get data without certificate
    Serial.println("KAPSEJLADS CONNECT OK");    

    /*      String serverPath = serverName + "?klubid=13"; //Set server and request data
      Serial.println(serverPath); //Print server path

      //GET CLUB NAME
      http.begin(client, serverPath.c_str()); //Begin request
      int httpResponseCode = http.GET(); //Get data

      if (httpResponseCode>0) { //If http runs OK
        Serial.print("HTTP Response code: "); //Print http code
        Serial.println(httpResponseCode);
        String payload1 = http.getString(); //Read http response
        Serial.println(payload1); //Print http response
      }
      else {
        Serial.print("Error code: "); //Else print http error code
        Serial.println(httpResponseCode);
      }

      //GET HORN SETTINGS STRING
      serverPath = serverName + "?klubid=13&hornset=J"; //Set server and request data
      Serial.println(serverPath); //Print server path

      http.begin(client, serverPath.c_str()); //Begin request
      httpResponseCode = http.GET(); //Get data

      if (httpResponseCode>0) { //If http runs OK
        Serial.print("HTTP Response code: "); //Print http code
        Serial.println(httpResponseCode);
        String payload2 = http.getString(); //Read http response
        Serial.println(payload2); //Print http response
      }
      else {
        Serial.print("Error code: "); //Else print http error code
        Serial.println(httpResponseCode);
      }

      // Free resources
      http.end(); //End http request


      //GET CLUB NAME AND HORN SETTINGS
      String serverPath3 = serverName + "?klubid=13"; //Set server and request data
      String serverPath4 = serverName + "?klubid=13&hornset=J"; //Set server and request data
      http.begin(client, serverPath3.c_str()); //Begin request
      httpResponseCode = http.GET(); //Get data
      if (httpResponseCode>0) { //If http runs OK
        String CLUBNAME = http.getString(); //Read http response
        Serial.println(CLUBNAME); //Print http response
        http.begin(client, serverPath4.c_str()); //Begin request
        String payload4= http.getString(); //Read http response
        Serial.println(payload4); //Print http response
      }
      http.end(); //End http request



 */

    // GET HORN_SETTINGS DATA FORMATTED AS JSON
    String serverPathSettings = serverName + "?klubid=13&hornset=J";  // Set server and request data
    Serial.print("  ");
    Serial.println(serverPathSettings);
    http.begin(client, serverPathSettings.c_str());      // Begin request
    int httpResponseCode = http.GET();            // Get data
    if (httpResponseCode > 0) {                   // If http runs OK
      Serial.print("  JSON HTTP Response code: ");  // Print http code
      Serial.println(httpResponseCode);
      String payload1 = http.getString();  // Read http response
      Serial.print("  ");
      Serial.println(payload1);            // Print http response

      //https://arduinojson.org/ --> Assistent menu, to generate json code without nested elements
      StaticJsonDocument<512> doc; // Define statid JSON
      //DynamicJsonDocument doc(2048); // Define dynamic JSON
      DeserializationError error = deserializeJson(doc, payload1);
      if (error) {
        Serial.print("  deserializeJson() failed: ");
        Serial.println(error.c_str());
        return;
      }
      JsonArray nested = doc.as<JsonArray>();

      String BENYTTESFORKLUBIDstr = nested[0][F("BENYTTESFORKLUBID")].as<String>();
      String TIDMLSTART_EEPROM = nested[0][F("TIDMLSTART")].as<String>();
      String ANTALSTART_EEPROM = nested[0][F("ANTALSTART")].as<String>();
      String MINFORSTART_EEPROM = nested[0][F("MINFORSTART")].as<String>();
      String KORTHORN_EEPROM = nested[0][F("KORTHORN")].as<String>();
      String LANGHORN_EEPROM = nested[0][F("LANGHORN")].as<String>();
      String MAALHORN_EEPROM = nested[0][F("MAALHORN")].as<String>();
      String TESTHORN_EEPROM = nested[0][F("TESTHORN")].as<String>();
      BENYTTESFORKLUBID = String(BENYTTESFORKLUBIDstr).toInt();
      int TIDMLSTART_EEPROM_INT = TIDMLSTART_EEPROM.toInt();
      int ANTALSTART_EEPROM_INT = ANTALSTART_EEPROM.toInt();
      int MINFORSTART_EEPROM_INT = MINFORSTART_EEPROM.toInt();
      int KORTHORN_EEPROM_INT = (KORTHORN_EEPROM.toInt()) / 100;
      int LANGHORN_EEPROM_INT = (LANGHORN_EEPROM.toInt()) /100;
      int MAALHORN_EEPROM_INT = (MAALHORN_EEPROM.toInt()) /10;
      int TESTHORN_EEPROM_INT = (TESTHORN_EEPROM.toInt()) /10;
      Serial.print("  DB BENYTTES FOR = ");
      Serial.println(BENYTTESFORKLUBID);
      Serial.print("  DB TIDMLSTART = ");
      Serial.println(TIDMLSTART_EEPROM_INT);
      Serial.print("  DB ANTALSTART = ");
      Serial.println(ANTALSTART_EEPROM_INT);
      Serial.print("  DB MINFORSTART = ");
      Serial.println(MINFORSTART_EEPROM_INT);
      Serial.print("  DB KORTHORN = ");
      Serial.println(KORTHORN_EEPROM_INT);
      Serial.print("  DB LANGHORN = ");
      Serial.println(LANGHORN_EEPROM_INT);
      Serial.print("  DB MAALHORN = ");
      Serial.println(MAALHORN_EEPROM_INT);
      Serial.print("  DB TESTHORN = ");
      Serial.println(TESTHORN_EEPROM_INT);
      if(TIDMLSTART_EEPROM_INT>0 && ANTALSTART_EEPROM_INT>0 && MINFORSTART_EEPROM_INT>0 && KORTHORN_EEPROM_INT>0 && LANGHORN_EEPROM_INT>0 && TESTHORN_EEPROM_INT>0){
        SettingsOK="yes";
      } else {
        SettingsOK="no";
      }
      Serial.print("  SettingsOK = ");
      Serial.println(SettingsOK);
      Serial.println("HORN SETTINGS DATA OK");

      //SAVE HORNSETTINGS TO EEPROM
      // Can max write value up to 255
      EEPROM.begin(EEPROM_SIZE);
      EEPROM.write(0, TIDMLSTART_EEPROM_INT);   //Position 0 = 5 min between start
      EEPROM.write(1, ANTALSTART_EEPROM_INT);  //Position 1 = 10 starts
      EEPROM.write(2, MINFORSTART_EEPROM_INT);   //Position 2 = activate 8 min before start
      EEPROM.write(3, KORTHORN_EEPROM_INT);   //Position 3 = Short horn signal time ms
      EEPROM.write(4, LANGHORN_EEPROM_INT);  //Position 4 = Long horn signal time ms
      EEPROM.write(5, TESTHORN_EEPROM_INT);   //Position 5 = Test horn signal time ms
      EEPROM.write(6, MAALHORN_EEPROM_INT);   //Position 6 = Goal horn signal time ms
      EEPROM.commit();
      Serial.println("EEPROM WRITE OK");

    }

    // GET HORN DATA FORMATTED AS JSON
    String serverPathData = serverName + "?klubid=13&horndata=J";  // Set server and request data
    Serial.print("  ");
    Serial.println(serverPathData);
    http.begin(client, serverPathData.c_str());      // Begin request
    httpResponseCode = http.GET();            // Get data
    if (httpResponseCode > 0) {                   // If http runs OK
      Serial.print("  JSON HTTP Response code: ");  // Print http code
      Serial.println(httpResponseCode);
      String payload2 = http.getString();  // Read http response
      Serial.print("  ");
      Serial.println(payload2);            // Print http response

      //https://arduinojson.org/ --> Assistent menu, to generate json code without nested elements
      //StaticJsonDocument<512> doc; // Define statid JSON
      DynamicJsonDocument doc(5000); // Define dynamic JSON
      DeserializationError error = deserializeJson(doc, payload2);
      if (error) {
        Serial.print("  deserializeJson() failed: ");
        Serial.println(error.c_str());
        return;
      }
      JsonArray nested = doc.as<JsonArray>();

  
      //NUMBER OF LINES IN JSON
      int arrayLength = doc.size();
      respitlines= doc.size();
      Serial.print("  JSON lines = ");
      Serial.println(arrayLength);

      //PRINT EACH KLUBID IN JSON
      int i = 0;
      for (JsonObject item : nested) {
          const char* SERIE = item["H_SERIE"];
          const char* LOEBNR = item["H_LOEBNR"];
          const char* ANTALBAADE = item["H_ANTALBAADE"];
          const char* TIDMLSTART = item["H_TIDMLSTART"];
          const char* ANTALSTART = item["H_ANTALSTART"];
          const char* RESPITSTART = item["H_RESPITSTART"];
          const char* RESPITSEK = item["H_RESPITSEK"];
          const char* RESPITDIFF = item["H_RESPITDIFF"];
          const char* AAR = item["H_AAR"];
          const char* SERIEID = item["H_SERIEID"];
          DATA[i][0] = item["H_SERIE"];
          DATA[i][1] = item["H_LOEBNR"];
          DATA[i][2] = item["H_ANTALBAADE"];
          DATA[i][3] = item["H_TIDMLSTART"];
          DATA[i][4] = item["H_ANTALSTART"];
          DATA[i][5] = item["H_RESPITSTART"];
          DATA[i][6] = item["H_RESPITSEK"];
          DATA[i][7] = item["H_RESPITDIFF"];
          DATA[i][8] = item["H_DATO"];
          DATA[i][9] = item["H_STARTTID"];
          DATA[i][10] = item["H_AAR"];
          DATA[i][11] = item["H_SERIEID"];
          Serial.print("  Serie arr = ");
          Serial.println(DATA[i][0]);
          Serial.print("  Loebnr arr = ");
          Serial.println(DATA[i][1]);
          Serial.print("  Antal baade arr = ");
          Serial.println(DATA[i][2]);
          Serial.print("  Tidmlstart arr = ");
          Serial.println(DATA[i][3]);
          Serial.print("  Respitstart arr = ");
          Serial.println(DATA[i][5]);
          Serial.print("  Respitsek arr = ");
          Serial.println(DATA[i][6]);
          Serial.print("  Dato arr = ");
          Serial.println(DATA[i][8]);
          Serial.print("  Starttid arr = ");
          Serial.println(DATA[i][9]);
          Serial.print("  Aar arr = ");
          Serial.println(DATA[i][10]);
          Serial.print("  Serieid arr = ");
          Serial.println(DATA[i][11]);
          i++;
      }

      if(arrayLength>0 && String(DATA[0][3])!=NULL && String(DATA[0][4])!=NULL && String(DATA[0][9])!=NULL){
        DataOK="yes";
      } else {
        DataOK="no";            
      }          
        
      Serial.print("  DataOK = ");
      Serial.println(DataOK);
      Serial.println("DATA OK");


      if(NtpOK=="yes" && SettingsOK=="yes" && DataOK=="yes"){
        AllDataOK="yes";
      } else {
        AllDataOK="no";
      }     
      Serial.print("ALL DATA OK = ");
      Serial.println(AllDataOK);

      //Print start time
      String starthr = String(DATA[0][9]).substring(0,2); // get hours from DATA time
      String startmin = String(DATA[0][9]).substring(3,5); // get mins from DATA time
      String startsec = String(DATA[0][9]).substring(6); // get secs from DATA time
      unsigned long  starthrint = starthr.toInt() * 60 * 60; // convert to int and calc seconds
      unsigned long  startminint = startmin.toInt() * 60;
      unsigned long  startsecint = startsec.toInt();
      unsigned long  startsecs = starthrint + startminint + startsecint; // add all seconds
      Serial.println("  Start: " + starthr + ":" + startmin + ":" + startsec); // print start time
      Serial.println("  Start secs : " + String(startsecs)); // print start seconds (time of day in seconds)
      Serial.println("  Start secs : " + String(HMStoSec(DATA[0][9]))); //print start time in secs with function

      //Print local time
      struct tm timeinfo; // define tm
      getLocalTime(&timeinfo); //get local time
      // Convert to HH:MM:SS
      char locTime[9]; //define locTime for the time
      sprintf(locTime, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); // set hour min sec from tm as char
      Serial.print("  Local time now: "); //print time string
      Serial.println(locTime);
      unsigned long lochrint = String(locTime).substring(0,2).toInt() * 60 *60; // get hours from local time tm and calc to seconds
      unsigned long locminint = String(locTime).substring(3,5).toInt() * 60; // get min from local time tm and calc to seconds
      unsigned long locsecint = String(locTime).substring(6).toInt(); // get sec from local time tm and calc to seconds
      unsigned long locsecsint = lochrint + locminint + locsecint; // add all seconds
      Serial.println("  Local secs now: " + String(locsecsint)); //print local secs
      
      // Compare time strings
      if (strcmp(locTime,DATA[0][9]) == 0) { //compare strings
        Serial.println("  Time is equal"); // print if equal
      }
      Serial.println("TID SAMMENLIGNING OK"); 

    } else {
      Serial.print("  Error code: ");  // Else print http error code
      Serial.println(httpResponseCode);
    }
    http.end();

  } else {
    Serial.println("  WiFi Disconnected");
  }

  //READ EEPROM DATA
  EEPROM.begin(EEPROM_SIZE);
  ALONE_BETWEEN_START = EEPROM.read(0);
  ALONE_NUMBER_OF_STARTS = EEPROM.read(1);
  ALONE_STARTTIME = EEPROM.read(2);
  HORN_SHORTTIME = (EEPROM.read(3))*100;
  HORN_LONGTIME = (EEPROM.read(4))*100;
  HORN_TESTTIME = (EEPROM.read(5))*10;
  HORN_GOALTIME = (EEPROM.read(6))*10;
  Serial.println("  ALONE_BETWEEN_START_EPROM= " + String(ALONE_BETWEEN_START));
  Serial.println("  ALONE_NUMBER_OF_STARTS_EPROM= " + String(ALONE_NUMBER_OF_STARTS));
  Serial.println("  ALONE_STARTTIME_EPROM= " + String(ALONE_STARTTIME));
  Serial.println("  HORN_SHORTTIME_EPROM= " + String(HORN_SHORTTIME));
  Serial.println("  HORN_LONGTIME_EPROM= " + String(HORN_LONGTIME));
  Serial.println("  HORN_TESTTIME_EPROM= " + String(HORN_TESTTIME));
  Serial.println("  HORN_GOALTIME_EPROM= " + String(HORN_GOALTIME));
  if(ALONE_BETWEEN_START>0 && ALONE_NUMBER_OF_STARTS>0 && ALONE_STARTTIME>0 && HORN_SHORTTIME>0 && HORN_LONGTIME>0 && HORN_GOALTIME>0 && HORN_TESTTIME>0){
    Serial.println("EEPROM READ OK");
    EepromOK="yes";
  } else {
    Serial.println("EEPROM READ FAILED");
    EepromOK="no";
  }  

  serverpathloeburl = serverName + "?klubid=13&loeburl="+DATA[0][10]+"-"+DATA[0][11]+"-"+DATA[0][1]; //Set server and request data



}



void loop() {
  // Show ESP homepage
  Portal.handleClient();
  // Serial.println(millis());
// NtpOK="no";
// DataOK="no";
// AllDataOK="no";
// EepromOK="no";


  // Read input
  BUTTON_START_ALONE = digitalRead(START_ALONE);
  BUTTON_START_DATA = digitalRead(START_DATA);
  // BUTTON_START_ALONE = HIGH;
  // BUTTON_START_DATA = HIGH;
  // Serial.print(BUTTON_START_ALONE);
  // Serial.print(BUTTON_START_DATA);
  // Serial.println(BUTTON_NO_WIFI);


  // WITH WIFI, NOT STARTET, ROLLING TEXT
  if (WiFi.status() == WL_CONNECTED && BUTTON_START_ALONE==LOW && BUTTON_START_DATA==LOW) {

    //Reset programs
    Reset_data=1;
    Reset_alone=1;
    Reset_test=1;
    startonedelay_s=0; //reset start one
    startseq_s=0; //reset group start



    // Get local time from ESP (OFF when no wifi)
    struct tm timeinfo;
    getLocalTime(&timeinfo);

    // display rolling text
    int L1=0;
    int L2=0;
    int L3=0;
    int L4=0;
    int L5=0;
    int L6=0;
    char message[] = "Dette er min tekst";  // Text
    // minX=-12*strlen(message); //Calculate length of text string
    display.setTextSize(2);                            // Font size. Max is 3
    display.clearDisplay();                            // Clear the display
    display.setCursor(x, 10);                          // Set cursor in position
    if(AllDataOK=="yes" && EepromOK=="yes"){           // Display fail or ok
      display.print("OK - "); // Display ok IF all data ok 
      L1 = 5; // text length 1      
    } else {
      display.print("FEJL - ");
      L1 = 8; // text length 1      
    }
    if(DataOK=="yes"){
      display.print("KLUB "+String(BENYTTESFORKLUBID)+" - "); // Display club id
      L2 = 13; // text length 2      
      display.print(String(DATA[0][4])+"G "+String(DATA[0][3])+"M - "); // Display number number of groups and time between starts
      L3 = strlen(DATA[0][4]) + strlen(DATA[0][3]) + 6; // text length 2      
      display.print(String(DATA[0][0])+" "+String(DATA[0][1])+" kl. "+String(DATA[0][9])+" - "+String(DATA[0][2])+" Baade - "); // Display start time and number of boats
      L4 = strlen(DATA[0][0]) + strlen(DATA[0][1]) + strlen(DATA[0][2]) + strlen(DATA[0][9]) + 18; // text length 3  
      if(String(DATA[0][5])=="J"){ //Display RESPIT if respit start
        display.print("RESPIT - ");
        L5 = 9;
      }
    } else {
      display.print("DATA FEJL - ");
      L2 = 13;     
    }  
    if(EepromOK=="yes"){
      display.print("  MANUEL:"+String(ALONE_NUMBER_OF_STARTS)+"G "+String(ALONE_BETWEEN_START)+"M - "); //Display MAN number of starts and time between
      L6 = 19;  // text length 5
    } else {
      display.print("  EEPROM FEJL - "); //Display MAN number of starts and time between
      L6 = 16;  // text length 5
    }      
    TEXTLEN1 = L1+L2+L3+L4+L5+L6;
   
    display.print(WiFi.localIP().toString() + " - ");  // Put IP to display
    TEXTLEN2 = 18;
    if(NtpOK=="yes"){
      display.print(&timeinfo, "%H:%M:%S");              // Put time to display
    } else {
      display.print("TID FEJL");
    }  
    TEXTLEN3 = 8;
    //display.print(message); //Display text
    display.display();  // Show in display
    minX = -12 * (TEXTLEN1 + TEXTLEN2 + TEXTLEN3)+10;  // Set string length
    x = x - 1;          // Move on display
    if (x < minX) {
      x = display.width();
    }

    //CONTROL LED
    if(AllDataOK=="yes" && EepromOK=="yes"){
      digitalWrite(LED_HANDLE, LOW); // Set LED OFF
      digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
      digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
    } else if(AllDataOK!="" && EepromOK=="yes"){
      digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
      LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);
      // Serial.println("Blink Handle+Data");
    } else if(AllDataOK=="yes" && EepromOK!="yes"){
      digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
      LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);
      // Serial.println("Blink Handle+Alone");
    } else if(AllDataOK!="yes" && EepromOK!="yes"){
      LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_DATA);
      // Serial.println("Blink Handle+Alone+Data");
    }
    Serial.println(String(millis())+" - "+ String(DATA[0][10]) );

  } //end if wifi
  
  
  
  
  // NO WIFI, NOT STARTET, ROLLING TEXT
  if(WiFi.status() != WL_CONNECTED && BUTTON_START_ALONE==LOW && BUTTON_START_DATA==LOW){

    //Reset programs
    Reset_data=1;
    Reset_alone=1;
    Reset_test=1;

    // display rolling text
    // char message[] = "NO WIFI";  // Text
    display.setTextSize(2);                            // Font size. Max is 3
    display.clearDisplay();                            // Clear the display
    display.setCursor(x, 10);                          // Set cursor in position
    if(EepromOK=="yes"){                               // Display fail or ok
      display.print("OK - " + String(ALONE_NUMBER_OF_STARTS)+"G "+String(ALONE_BETWEEN_START)+"M - NO WIFI");
      TEXTLEN1 = 22;      
    } else {
      display.print("FEJL EEPROM");
      TEXTLEN1 = 10;
    }
    //display.print(WiFi.localIP().toString() + " - ");  // Put IP to display
    //display.print(&timeinfo, "%H:%M:%S");              // Put time to display
    // display.print(message); //Display text
    display.display();  // Show in display
    minX = -12 * (TEXTLEN1);  // Set string length
    x = x - 1;          // Move on display
    if (x < minX) {
      x = display.width();
    }

    //CONTROL LED
    if(EepromOK=="yes"){
      digitalWrite(LED_HANDLE, LOW); // Set LED OFF
      digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
    } else {
      Serial.println(String(EepromOK));
      LED_AUTO_ALONE_pms = Blink_LED(LED_AUTO_ALONE_pms, BLINKTIMEFAST, LED_AUTO_ALONE,LED_HANDLE,LED_HANDLE);
    }


  } //end if no wifi




  // DATA STARTET
  if (BUTTON_START_DATA==HIGH && BUTTON_START_ALONE==LOW){ 

    //Reset programs
    Reset_alone=1;
    Reset_test=1;

   //reset start values
    if(Reset_data==1){
      Reset_data=0;
      startonedelay_s=0;
      startseq_s=0;
      goal_s=0;
      STARTNUM=0;
    }

    //CONTROL LED_AUTO_DATA
    if(AllDataOK!="yes" || EepromOK!="yes"){
      display.setTextSize(2);            // font size
      display.setTextColor(WHITE);       // text color
      display.setTextWrap(false);        // dont make lines break
      display.clearDisplay();            // clear display
      display.setCursor(0, 10);          // start position
      if(NtpOK!="yes"){
        display.print("TID FEJL");          // set text
      } else if (DataOK!="yes"){
        display.print("DATA FEJL");          // set text
      } else if (EepromOK!="yes"){
        display.print("EPROM FEJL");          // set text
      }
      display.display();                 // write to display

      //CONTROL LED
      if(AllDataOK=="yes" && EepromOK=="yes"){
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
        digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
        digitalWrite(LED_AUTO_ALONE, LOW); // Set LED OFF
      } else if(AllDataOK!="" && EepromOK=="yes"){
        digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
        LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);
        // Serial.println("Blink Handle+Data");
      } else if(AllDataOK=="yes" && EepromOK!="yes"){
        digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
        LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);
        // Serial.println("Blink Handle+Alone");
      } else if(AllDataOK!="yes" && EepromOK!="yes"){
        LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIMEFAST, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_DATA);
        // Serial.println("Blink Handle+Alone+Data");
      }

    } else {

      //CALCULATIONS
      DATA_BETWEEN_START=String(DATA[0][3]).toInt();
      if(DATA_BETWEEN_START > 5){
        BETWEEN_START_DELAY=(DATA_BETWEEN_START-5)*60*1000;
      } else {
        BETWEEN_START_DELAY=0;
      }
      if (String(DATA[0][5])=="J"){
        NUMBER_OF_STARTS=1;
      } else {
        NUMBER_OF_STARTS=String(DATA[0][4]).toInt();
      }

      //WHAT TO START
 
      //DELAY UNTIL FIRST START
      if(startonedelay_s==0 && STARTNUM<NUMBER_OF_STARTS){
        Serial.println(String(millis()) + " Number of starts:" + String(NUMBER_OF_STARTS));  
        Serial.println(String(millis()) + " Min between start:" + String(DATA_BETWEEN_START));  

        struct tm timeinfo; // define tm
        getLocalTime(&timeinfo); //get local time
        char locTime[9]; //define locTime for the time
        sprintf(locTime, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); // set hour min sec from tm as char
        uint32_t nowsec=HMStoSec(String(locTime));

        uint32_t starttimesec = String(HMStoSec(DATA[0][9])).toInt();        
        
        STARTDELAY = (starttimesec - nowsec - 300)*1000;
        STARTDELAYCD = starttimesec - nowsec - 300;
        // Serial.println(starttimesec);       
        // Serial.println(nowsec);       

        Serial.println(String(millis()) + " Time to start: "+ String(STARTDELAYCD));
        // Serial.println(String(millis()) + " Time to start: "+ String(secondsToHMS(STARTDELAYCD,'n')));

        if(STARTDELAY>0 && STARTDELAY<3600000){ //if startdelay is within 1 hour
          startonedelay_s=1;  //activate start delay
          startonedelay_t=millis();  //set timer for start delay
          cd_t=millis(); //set timer for dount down
          Serial.println(String(millis()) + " START ONE DELAY");
        } else {
          startonedelay_s=2;
          startseq_s=30;
          goal_s=1;
          STARTNUM=NUMBER_OF_STARTS;
          Serial.println(String(millis()) + " START TOO LATE");
        }
      }    
      if(startonedelay_s==1 && millis()<startonedelay_t+STARTDELAY && STARTNUM<NUMBER_OF_STARTS){ //within time for one start delay
        // Serial.println(String(millis()) + " START ONE RUNNING");
        CountDown(cd_t,STARTDELAYCD,101); // display count down, 101 = S text
        // Serial.println(String(millis()) + "  count down"); 
        if(startonedelay_s==1 && millis()<startonedelay_t+STARTDELAY-5000){ //until last 5000 ms
          digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
          digitalWrite(LED_AUTO_ALONE, LOW); // Set LED OFF
          digitalWrite(LED_HANDLE, HIGH); // Set LED ON
        } else {
          LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA); //blink LED
        }
      }
      if(startonedelay_s==1 && millis()>startonedelay_t+STARTDELAY && STARTNUM<NUMBER_OF_STARTS){ //after startdelay end start one delay
        startonedelay_s=2;  //stop start delay
        Serial.println(String(millis()) + " START ONE DELAY FINISHED");
      }      


      //GOAL HORN
      if(goal_s==1){ //Start goal program
        goal_t=millis();
        goal_s=2;

        display.setTextSize(3);            // font size
        display.setTextColor(WHITE);       // text color
        display.setTextWrap(false);        // dont make lines break
        display.clearDisplay();            // clear display
        display.setCursor(20, 10);         // start position
        display.print("MAAL");             // set text
        display.display();                 // write to display

        // WiFiClientSecure client;  // Use https
        // HTTPClient http; 
        client.setInsecure();  // Get data without certificate
        Serial.println("KAPSEJLADS CONNECT OK");    
        http.begin(client, serverpathloeburl.c_str()); //Begin request
        
        Serial.println(String(millis()) + " START GOAL");
        Serial.println(serverpathloeburl); //Print server path
      }
      if(goal_s==2){ //get data
        // Serial.println(String(millis()) + " GOAL DATA START");
        goal_t=millis();

        int httpResponseCode = http.GET(); //Get data

        if (httpResponseCode>0) { //If http runs OK
          // Serial.print("HTTP Response code: "); //Print http code
          // Serial.println(httpResponseCode);
          // String payload1 = http.getString(); //Read http response
          numberingoal = http.getString().toInt();
          // Serial.println(String(numberingoal)); //Print http response
        }
        else {
          Serial.print("Error code: "); //Else print http error code
          Serial.println(httpResponseCode);
        }
                
        Serial.println(String(millis()) + " GOAL DATA FINISHED IN " + String(millis() - goal_t) + " ms. Result: "+String(numberingoal) );
        if(numberingoal<1){
          goal_s=3;        
        } else {
          goal_s=4;
        }

      }

      //DELAY 1 S
      if(goal_s==3){ 
        // Serial.println(String(millis()) + " GOAL STATE 3");
        if(millis()>goal_t+500){ //delay 1 s and get data again
          goal_s=2;
        }
      }
      //ACTIVATE HORN
      if(goal_s==4){
        goal_s=5;
        goal_t=millis();
        horn_t=millis();
      }
      if(goal_s==5 && millis()<goal_t + numberingoal * 2 * HORN_GOALTIME){
        // Serial.println(String(millis()) + " GOAL STATE 4");
        if(millis()<horn_t+HORN_GOALTIME){ //set HORN for short time
          digitalWrite(HORN, HIGH); // Set HORN high
          // Serial.println(String(millis()) + " HORN HIGH");
        } else {
          digitalWrite(HORN, LOW); // Set HORN low
          // Serial.println(String(millis()) + " HORN LOW");
        }
        if(millis()>horn_t+2*HORN_GOALTIME){
          horn_t=millis();          
        }
      }
      if(goal_s==5 && millis()>goal_t + numberingoal * 2 * HORN_GOALTIME){
        goal_s=2; //start getting data again
        Serial.println(String(millis()) + " GOAL STATE 4 NEXT");
      }



    }



  } //end if data start
  
  // STAND ALONE GROUP START
  if (BUTTON_START_DATA==LOW && BUTTON_START_ALONE==HIGH){
    //GROUP START

    //Reset programs
    Reset_data=1;
    Reset_test=1;

    //reset start values
    if(Reset_alone==1){
      Reset_alone=0;
      startonedelay_s=0;
      startseq_s=0;
      STARTNUM=0;
    }

    //EEPROM FAIL
    if(EepromOK!="yes"){
      LED_AUTO_ALONE_pms = Blink_LED(LED_AUTO_ALONE_pms, BLINKTIMEFAST, LED_AUTO_ALONE,LED_HANDLE,LED_HANDLE);
      display.setTextSize(2);            // font size
      display.setTextColor(WHITE);       // text color
      display.setTextWrap(false);        // dont make lines break
      display.clearDisplay();            // clear display
      display.setCursor(0, 10);          // start position
      display.print("EPROM FEJL");          // set text
      display.display();                 // write to display

    } else {

      //CALCULATIONS
      if(ALONE_STARTTIME > 5){
        STARTDELAY=(ALONE_STARTTIME-5)*60*1000;
        STARTDELAYCD=(ALONE_STARTTIME-5)*60;
      } else {
        STARTDELAY=0;
        STARTDELAYCD=0;
      }
STARTDELAY=10000;
STARTDELAYCD=10;
      if(ALONE_BETWEEN_START > 5){
        BETWEEN_START_DELAY=(ALONE_BETWEEN_START-5)*60*1000;
      } else {
        BETWEEN_START_DELAY=0;
      }
      NUMBER_OF_STARTS=ALONE_NUMBER_OF_STARTS;  

      //DELAY UNTIL FIRST START
      if(startonedelay_s==0 && STARTNUM<NUMBER_OF_STARTS){
        startonedelay_s=1;  //activate start delay
        startonedelay_t=millis();  //set timer for start delay
        cd_t=millis(); //set timer for dount down
        Serial.println(String(millis()) + " START ONE DELAY");
      }    
      if(startonedelay_s==1 && millis()<startonedelay_t+STARTDELAY && STARTNUM<NUMBER_OF_STARTS){ //within time for one start delay
        CountDown(cd_t,STARTDELAYCD,101); // display count down, 101 = S text
        // Serial.println(String(millis()) + "  count down"); 
        if(startonedelay_s==1 && millis()<startonedelay_t+STARTDELAY-5000){ //until last 5000 ms
          digitalWrite(LED_AUTO_DATA, LOW); // Set LED ON
          digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
          digitalWrite(LED_HANDLE, HIGH); // Set LED ON
        } else {
          LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE); //blink LED
        }
      }
      if(startonedelay_s==1 && millis()>startonedelay_t+STARTDELAY && STARTNUM<NUMBER_OF_STARTS){ //after startdelay end start one delay
        startonedelay_s=2;  //stop start delay
        Serial.println(String(millis()) + " START ONE DELAY FINISHED");
      }      
    } //end else eeprom fail
  } //end if start alone


  //COMMON START
  if(BUTTON_START_DATA==HIGH || BUTTON_START_ALONE==HIGH){
    //5 MIN BEFORE START 
    if(startonedelay_s==2 && startseq_s==0 && STARTNUM<NUMBER_OF_STARTS){ //after start one delay, activate 5 min
      startseq_s=1; //set sequence number
      //calc 5 min start from pin was set        
      startseq_t=startonedelay_t+STARTDELAY+STARTNUM*300000; //from input is set until after start one delay and x numbers of start
      if(BETWEEN_START_DELAY>0){
        startseq_t=startseq_t+STARTNUM*BETWEEN_START_DELAY;
      }
      if(STARTNUM==NUMBER_OF_STARTS-1){ //after second last group
        BETWEEN_START_DELAY=0; //force to go directly to Last horn signal after last group
      }        
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " START " + String(STARTNUM+1));
      Serial.println(String(millis()) + " 5 MIN");
    }
    if(startseq_s==1 && millis()<startseq_t+60000 && STARTNUM<NUMBER_OF_STARTS){
      CountDown(cd_t,300,STARTNUM+1); // display count down
      if(millis()<startseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      if(millis()<startseq_t+60000-5000){ //until last 5000 ms
        if(BUTTON_START_DATA==HIGH){digitalWrite(LED_AUTO_DATA, HIGH);} // Set LED ON
        if(BUTTON_START_ALONE==HIGH){digitalWrite(LED_AUTO_ALONE, HIGH);} // Set LED ON
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
      } else {
        if(BUTTON_START_DATA==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);} //blink LED
        if(BUTTON_START_ALONE==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);} //blink LED
      }
    }

    //4 MIN BEFORE START
    if(startseq_s==1 && millis()>=startseq_t+60000 && STARTNUM<NUMBER_OF_STARTS){ //after start one delay, activate 4 min
      startseq_s=2; //set sequence number
      startseq_t=startseq_t+60000;
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " 4 MIN");
    }
    if(startseq_s==2 && millis()<startseq_t+180000 && STARTNUM<NUMBER_OF_STARTS){
      CountDown(cd_t,240,STARTNUM+1); // display count down
      if(millis()<startseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      if(millis()<startseq_t+180000-5000){ //until last 5000 ms
        if(BUTTON_START_DATA==HIGH){digitalWrite(LED_AUTO_DATA, HIGH);} // Set LED ON
        if(BUTTON_START_ALONE==HIGH){digitalWrite(LED_AUTO_ALONE, HIGH);} // Set LED ON
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
      } else {
        if(BUTTON_START_DATA==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);} //blink LED
        if(BUTTON_START_ALONE==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);} //blink LED
      }
    }
    
    //1 MIN BEFORE START
    if(startseq_s==2 && millis()>=startseq_t+180000 && STARTNUM<NUMBER_OF_STARTS){ //after start one delay, activate 1 min
      startseq_s=3; //set sequence number
      startseq_t=startseq_t+180000;
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " 1 MIN");
    }
    if(startseq_s==3 && millis()<startseq_t+60000 && STARTNUM<NUMBER_OF_STARTS){
      CountDown(cd_t,60,STARTNUM+1); // display count down
      if(millis()<startseq_t+HORN_LONGTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      if(millis()<startseq_t+60000-5000){ //until last 5000 ms
        if(BUTTON_START_DATA==HIGH){digitalWrite(LED_AUTO_DATA, HIGH);} // Set LED ON
        if(BUTTON_START_ALONE==HIGH){digitalWrite(LED_AUTO_ALONE, HIGH);} // Set LED ON
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
      } else {
        if(BUTTON_START_DATA==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);} //blink LED
        if(BUTTON_START_ALONE==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);} //blink LED
      }
    }

    //BETWEEN START DELAY
    if(startseq_s==3 && millis()>=startseq_t+60000 && BETWEEN_START_DELAY>0 && STARTNUM<NUMBER_OF_STARTS-1 && String(DATA[0][5])!="J"){ //pause time, do not pause after last group
      startseq_s=4; //set sequence number
      startseq_t=startseq_t+60000;
      cd_t=millis(); //set timer for count down
      Serial.println(String(millis()) + " BETWEEN START");
    } 
    if(startseq_s==3 && millis()>=startseq_t+60000 && BETWEEN_START_DELAY>0 && STARTNUM==NUMBER_OF_STARTS-1 && String(DATA[0][5])!="J"){ //start over after last group (no -1)
      startseq_s=0; // start over
      STARTNUM++;        
      Serial.println(String(millis()) + " START OVER AFTER DELAY");
    }
    if(startseq_s==4 && millis()<startseq_t+BETWEEN_START_DELAY && STARTNUM<NUMBER_OF_STARTS-1 && String(DATA[0][5])!="J"){
      CountDown(cd_t,BETWEEN_START_DELAY/1000,100); // display count down
      if(millis()<startseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      if(millis()<startseq_t+BETWEEN_START_DELAY-5000){ //until last 5000 ms
        if(BUTTON_START_DATA==HIGH){digitalWrite(LED_AUTO_DATA, HIGH);} // Set LED ON
        if(BUTTON_START_ALONE==HIGH){digitalWrite(LED_AUTO_ALONE, HIGH);} // Set LED ON
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
      } else {
        if(BUTTON_START_DATA==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);} //blink LED
        if(BUTTON_START_ALONE==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);} //blink LED
      }
    }
    //START OVER IF AFTER DELAY
    if(startseq_s==4 && String(DATA[0][5])!="J" && millis()>=startseq_t+BETWEEN_START_DELAY && BETWEEN_START_DELAY>0 && STARTNUM<NUMBER_OF_STARTS-1 && String(DATA[0][5])!="J"){
      startseq_s=0; // start over
      STARTNUM++;
      Serial.println(String(millis()) + " START OVER AFTER DELAY");
    }

    //START OVER IF NO DELAY
    if(startseq_s==3 && String(DATA[0][5])!="J" && millis()>=startseq_t+60000 && BETWEEN_START_DELAY==0 && STARTNUM<NUMBER_OF_STARTS){
      startseq_s=0; // start over
      STARTNUM++;        
      Serial.println(String(millis()) + " START OVER WITHOUT DELAY");
    }

    //LAST HORN SIGNAL 
    if(startonedelay_s==2 && startseq_s==0 && STARTNUM==NUMBER_OF_STARTS){ //last start signal if not respit start
      startseq_s=10; //set sequence number
      startseq_t=millis();
      Serial.println(String(millis()) + " SLUT");
    } 
    if(startseq_s==10 && STARTNUM==NUMBER_OF_STARTS){
      if(millis()<startseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      display.setTextSize(3);            // font size
      display.setTextColor(WHITE);       // text color
      display.setTextWrap(false);        // dont make lines break
      display.clearDisplay();            // clear display
      display.setCursor(20, 10);          // start position
      display.print("SLUT");          // set text
      display.display();                 // write to display

      // Serial.println(String(millis()) + " SLUT TEXT");
    }



    //RESPIT STARTS
    if(startonedelay_s==2 && startseq_s==3 && millis()>=startseq_t+60000 && STARTNUM==0 && String(DATA[0][5])=="J"){ //last start signal if respit start
      respitno=0;      
      startseq_s=20; //set sequence number
      respittime=String(DATA[respitno][6]).toInt();
      Serial.print(respittime);
      startseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " RESPIT START");
      // Serial.println(String(millis()) + " respitno: "+String(respitno));  
      // Serial.println(String(millis()) + " respitlines: "+String(respitlines));  
    }
    if(startseq_s==20 && millis()<startseq_t+respittime*1000 && respitno<respitlines){
      CountDown(cd_t,respittime,102); // display count down
      if(millis()<startseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      if(millis()<startseq_t+respittime*1000-5000){ //until last 5000 ms
        if(BUTTON_START_DATA==HIGH){digitalWrite(LED_AUTO_DATA, HIGH);} // Set LED ON
        if(BUTTON_START_ALONE==HIGH){digitalWrite(LED_AUTO_ALONE, HIGH);} // Set LED ON
        digitalWrite(LED_HANDLE, HIGH); // Set LED ON
      } else {
        if(BUTTON_START_DATA==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_DATA,LED_AUTO_DATA);} //blink LED
        if(BUTTON_START_ALONE==HIGH){LED_HANDLE_pms = Blink_LED(LED_HANDLE_pms, BLINKTIME, LED_HANDLE,LED_AUTO_ALONE,LED_AUTO_ALONE);} //blink LED
      }
    }      
    if(startseq_s==20 && millis()>=startseq_t+respittime*1000 && respitno<respitlines){
      respitno++;
      respittime=String(DATA[respitno][6]).toInt() - String(DATA[respitno-1][6]).toInt();
      startseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " RESPIT NEXT" + String(respittime));
    }  
    if(startseq_s==20 && millis()>=startseq_t+respittime*1000 && respitno==respitlines){
      startseq_s=0;
      STARTNUM++;
      Serial.println(String(millis()) + " START OVER RESPIT");
    }  

  
  } //end common start

  
  
  //TEST HORN
  if (BUTTON_START_DATA==HIGH && BUTTON_START_ALONE==HIGH){
  
    //Reset programs
    Reset_data=1;
    Reset_alone=1;
    startonedelay_s=0;
    startseq_s=0;

    if(Reset_test==1){
      Reset_test=0;
      testseq_s=0;
      Serial.println("Reset test");
    }
    if(testseq_s==0){
      testseq_s=1; // start delay
      testseq_t=millis(); // delay from now
      digitalWrite(LED_AUTO_DATA, HIGH); // Set LED ON
      digitalWrite(LED_AUTO_ALONE, HIGH); // Set LED ON
      digitalWrite(LED_HANDLE, HIGH); // Set LED ON

      display.setTextSize(3);            // font size
      display.setTextColor(WHITE);       // text color
      display.setTextWrap(false);        // dont make lines break
      display.clearDisplay();            // clear display
      display.setCursor(20, 10);          // start position
      display.print("TEST");          // set text
      display.display();                 // write to display
      
      Serial.println(String(millis()) + " TEST START");
    }
    if(testseq_s==1 && millis()>testseq_t+2000){ //active horn
      testseq_s=2; 
      testseq_t=millis();
      digitalWrite(HORN, HIGH); // Set HORN high
    }
    if(testseq_s==2 && millis()>testseq_t+HORN_TESTTIME){ //deactivate horn
      testseq_s=3; 
      testseq_t=millis();
      digitalWrite(HORN, LOW); // Set HORN low
    }
    if(testseq_s==3 && millis()>testseq_t+HORN_TESTTIME){ //activate horn
      testseq_s=4; 
      testseq_t=millis();
      digitalWrite(HORN, HIGH); // Set HORN high
    }
    if(testseq_s==4 && millis()>testseq_t+HORN_TESTTIME){ //deactivate horn
      testseq_s=5; 
      testseq_t=millis();
      digitalWrite(HORN, LOW); // Set HORN low
      Serial.println(String(millis()) + " TEST FINISHED");
    }
    if(testseq_s==5 && millis()>testseq_t+HORN_TESTTIME){ //delay start
      testseq_s=6; 
      testseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " DELAY START");
    }
    if(testseq_s==6 && millis()>testseq_t){ //count down
      CountDown(cd_t,10,103); // display count down
      Serial.println(String(millis()) + " COUNT DOWN HORN");
    }
    if(testseq_s==6 && millis()>testseq_t+10000){ //dount down
      testseq_s=7; 
      testseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " HORN LONG START");
    }
    if(testseq_s==7 && millis()>testseq_t){ //count down
      CountDown(cd_t,5,103); // display count down 5 sec
      if(millis()<testseq_t+HORN_LONGTIME){ //set HORN for long time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      // Serial.println(String(millis()) + " HORN LONG");
    }
    if(testseq_s==7 && millis()>testseq_t+5000){ //dount down
      testseq_s=8; 
      testseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " DELAY SHORT START");
    }
    if(testseq_s==8 && millis()>testseq_t){ //count down
      CountDown(cd_t,5,103); // display count down 5 sec
      if(millis()<testseq_t+HORN_SHORTTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      // Serial.println(String(millis()) + " HORN SHORT");
    }
    if(testseq_s==8 && millis()>testseq_t+5000){ //dount down
      testseq_s=9; 
      testseq_t=millis();
      cd_t=millis(); //set timer for dount down
      Serial.println(String(millis()) + " DELAY GOAL START");
    }
    if(testseq_s==9 && millis()>testseq_t){ //count down
      CountDown(cd_t,2,103); // display count down 5 sec
      if(millis()<testseq_t+HORN_GOALTIME){ //set HORN for short time
        digitalWrite(HORN, HIGH); // Set HORN high
      } else {
        digitalWrite(HORN, LOW); // Set HORN low
      }
      // Serial.println(String(millis()) + " HORN SHORT");
    }
    if(testseq_s==9 && millis()>testseq_t+2000){ //dount down
      testseq_s=11; 
      testseq_t=millis();

      display.setTextSize(2);            // font size
      display.setTextColor(WHITE);       // text color
      display.setTextWrap(false);        // dont make lines break
      display.clearDisplay();            // clear display
      display.setCursor(0, 10);          // start position
      display.print("TEST SLUT");        // set text
      display.display();                 // write to display

      Serial.println(String(millis()) + " ALL HORN TEST FINISHED");
    }
 
  } //end test horn


  
} //end void loop

Professionals call such code "spaghetti code". You should try to find specific tasks and put them into separated subroutines. A good rule of thumb is one routine shouldn't have more than about 60-100 lines of code.

if(AllDataOK!="yes" || EepromOK!="yes"){

You shouldn't use strings as flags. C++ has the bool type for this purpose.

Why do you think that request was interrupted?

Saving the JSON content as char * is only valid while the JSON object exists. Once that object is destroyed the memory isn't guaranteed to hold that content anymore.
You shouldn't mix pointers and dynamically allocated objects. If you want to use pointers you should know that you as the programmer are responsible for memory allocation and de-allocation.

When I dim out the http request everything works fine. That's why I think the interruption of the http request makes it crash.

You were right about the JSON data. This is damaged when I start to request http data. Now I place the data in different variables.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.