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