Untitled

 avatar
unknown
c_cpp
a year ago
68 kB
27
Indexable
//////////////////////////////////////////////////////////////////////////////////////////////////////// Bibliotheken

#include <Adafruit_SSD1327.h>
#include <Adafruit_GFX.h>
#include <FlashStorage.h>
#include <Adafruit_SharpMem.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_BMP280.h>

//////////////////////////////////////////////////////////////////////////////////////////////////////// Definitionen

#define SEALEVELPRESSURE_HPA (pressure)
#define SHARP_SCK 8
#define SHARP_MOSI 10
#define SHARP_SS 7

#define BLACK 0
#define WHITE 1

Adafruit_BMP280 bmp;
Adafruit_SharpMem display(SHARP_SCK, SHARP_MOSI, SHARP_SS, 144, 168);
Adafruit_MPU6050 mpu;

//////////////////////////////////////////////////////////////////////////////////////////////////////// Schriftarten

#include <Fonts\FreeMono9pt7b.h>
#include <Fonts\FreeMono12pt7b.h>
#include <Fonts\FreeMono18pt7b.h>
#include <Fonts\FreeMono24pt7b.h>

#include <Fonts\FreeMonoBold9pt7b.h>
#include <Fonts\FreeMonoBold12pt7b.h>
#include <Fonts\FreeMonoBold18pt7b.h>
#include <Fonts\FreeMonoBold24pt7b.h>

//////////////////////////////////////////////////////////////////////////////////////////////////////// Variablen
//Display
int dh = 144;  //resolution graph vertical
int dw = 168;  //resolution graph horizontal
int dx = 50;   //offset display horizontal

float poti = 0.00;
float poti1 = 0.00;

//Sensor
float pressure = 1013;  //pressure for altimeter
float temp1 = 0.00;     //Sensor temperature
float hum = 0.00;       //Sensor humidity
float alt = 2000;       // Sensor altitude

//Einstellungen
int Hmax;      //upper limit altitude graph
int Hmin;      //lower limit altitude graph
float resalt;  //Resolution altitude m/px
float resaltgap = 1;

float Tmax;     //upper limit temperature graph
float Tmin;     //lower limit temperature graph
float restemp;  //resolution temperature °C/px

//Menü
int page = 1;  // 1 = Temp sinken, 2 = Temp steigen, 3 = Temp sinken/steigen, 4 = G-Force, 5 = Thermal
int menupos = 1;
int valuepos = 6;     // position menu
int settingspos = 0;  //settings menu

bool modeflag = 0;  // 1 = Normal, 2 = Demo
bool settingsflag = 0;
bool menuflag = 0;
bool valueflag = 0;


//Graph
float winkel;

int x;  //graph X-coordinate
int y;  //graph Y-coordinate

int yi;  //y inverted

int xw;  //delta-x angle
int xt;  //delta-x temp

int yp;
int yip;
int xp;
int xwp;
int xtp;

//Höhenlinie
int x01;
int x02;
int y01;
int y02;

int x03;
int x04;
int y03;
int y04;

int x01old;
int x02old;
int y01old;
int y02old;

int x03old;
int x04old;
int y03old;
int y04old;

//Timer
unsigned long currentMillis;
unsigned long seconds;
unsigned long minutes;
unsigned long hours;

unsigned long starttime;
unsigned long ontime;

unsigned long savetimer = 3000;
unsigned long saveinterval = 300000;

float codetime;
float codetime1;
float codetime2;

//Speicher
FlashStorage(flash1, int);            //Hmin
FlashStorage(flash2, float);          //resalt
FlashStorage(flash3, int);            //Tmax
FlashStorage(flash4, float);          //resTeamp
FlashStorage(flash5, float);          //pressure
FlashStorage(flash6, unsigned long);  //Ontime
FlashStorage(flash7, float);          //GLimit
FlashStorage(flash8, unsigned long);  //GForcetimerStartpage
FlashStorage(flash9, bool);           //GForceDisplayMode
//FlashStorage(flash10, unsigned long);
FlashStorage(flash11, float);          //thermaltimerStartpage
FlashStorage(flash12, float);          //varioLimit
FlashStorage(flash14, unsigned long);  //climbmodeinterval
FlashStorage(flash15, int);            //saveinterval
FlashStorage(flash16, bool);           //GForceAutoswitch
FlashStorage(flash17, bool);           //thermalAutoswitch
FlashStorage(flash18, unsigned long);  //GForceInitDuration
FlashStorage(flash19, unsigned long);  //thermalInitDuration

//Demomodus
float alttest;
float temptest;
int altinc = 0;
float tempinc = 0;
float tempdemo;

//Climbmode
unsigned long climbmodetimer = 0;
unsigned long climbmodeinterval;
float altold;

int climbmode = 0;
float climbmodealt;

//Variometer
unsigned long variotimer = 1;
unsigned long variotimerinterval = 1000;
float AltVario = 0.00;

//Array
int drawlinecounter;
int tempsave1[1000];
int tempsave2[1000];
int altsave;
int altload;
float tempsave11;
float tempsave10;
float tempsave22;
float tempsave20;

//GForcepage
float GForce = 1.0;
float GLimit = 2.0;

float currentGForce;
float lastGForce = 1.0;
float lastGForcePrint = 1.0;
float maxGForce = 1.0;

bool GForceAutoswitch = HIGH;
String GForceAutoswitchValue = "ON";

bool GForceDisplayMode = HIGH;
String GForceDisplayModeValue;

signed long GForceInitDuration = 2000;
signed long GforcetimerStartpage = 5000;

bool GForcemodeinit = 0;
bool GForceStatus = 0;

signed long GForceTimeStartInit;
signed long GForceTimeStart;
signed long GForceTimeEndInit;
signed long GForceTimeEnd;

signed long GForceTime = 1;

int GForceAltStartInit;
int GForceAltStart;
int GForceAltEndInit;
int GForceAltEnd;
int GForceAlt;

float divespeed;
float divespeedmax;

//Thermalpage
float vario = 0.00;       //Vario
float varioLimit = 0.00;  //Variolimit for Thermalmode
float varioAlt;
float maxVario;
float avVario;

bool thermalAutoswitch;
String thermalAutoswitchValue;

signed long thermalInitDuration = 2000;  //time for thermalmode start with >variolimit
signed long thermalTimerStartpage = 5000;

bool thermalmodeinit = 0;
bool thermalStatus;

signed long thermalTimeStartInit;
signed long thermalTimeStart;
signed long thermalTimeEndInit;
signed long thermalTimeEnd;

signed long thermalTime = 1;
signed long thermalSeconds;
signed long thermalMinutes;

float thermalAltStartInit;
float thermalAltStart;
float thermalAltEndInit;
float thermalAltEnd;
float thermalAlt;

//pages
int thermalpagedown = 1;
int thermalpageup = 2;
int thermalpageupdown = 3;
int GForcepage = 4;
int thermalpage = 5;
int oldpage = 1;

//Buttons
int buttonpin1 = 1;
int buttonpin2 = 2;
int buttonpin3 = 3;

const unsigned char logo1[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFC,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0xC0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0xF8, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0,
  0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00,
  0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
  0xE0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
  0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0xC0, 0x01, 0xFC, 0x0F, 0xFF, 0xE0,
  0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x3F, 0x80,
  0x00, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
  0x7F, 0xFC, 0x07, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00,
  0x00, 0x01, 0x80, 0x00, 0x0F, 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF,
  0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x00, 0x00,
  0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xF0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x03,
  0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x00,
  0x04, 0x00, 0xFF, 0xC0, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x1F,
  0xF0, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x1F, 0xF8, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x7F, 0x86, 0x00, 0x00, 0x00, 0x11, 0xFE, 0x03, 0xFF, 0xF8, 0x00,
  0x3F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x7F, 0xFC, 0x07, 0x83, 0x00, 0x00, 0x00, 0x21,
  0xE0, 0x3F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0xFF, 0xF1,
  0xC1, 0x80, 0x00, 0x00, 0x43, 0x8F, 0xFF, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x1F, 0xFF, 0xE0, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00, 0x83, 0x1F, 0x00, 0x07, 0xFF, 0xF8, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xE0, 0x1C, 0xE0, 0x60, 0x00, 0x01, 0x07, 0x38,
  0x07, 0xFF, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xCE, 0x60,
  0x20, 0x00, 0x02, 0x06, 0x73, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF,
  0xFF, 0xF8, 0x00, 0x27, 0x30, 0x10, 0x00, 0x06, 0x0C, 0xE4, 0x00, 0x1F, 0xFF, 0xFF, 0xE0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x01, 0x90, 0x08, 0x00, 0x0C, 0x09, 0x80, 0xFF,
  0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xC8, 0x04,
  0x0C, 0x18, 0x13, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
  0x00, 0x00, 0x00, 0x64, 0x02, 0x1E, 0x10, 0x26, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x10, 0x01, 0x3E, 0x20, 0x08, 0x0F, 0xFF, 0xFF,
  0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E,
  0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF,
  0xFF, 0xFF, 0xC0, 0x00, 0x4C, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  0xFC, 0xC1, 0x06, 0x0C, 0x31, 0x07, 0x06, 0x18, 0x03, 0xC3, 0xF0, 0x03, 0x80, 0xF0, 0x0C, 0x30,
  0x78, 0x60, 0xC7, 0xF0, 0x01, 0xFC, 0x81, 0x08, 0x08, 0x21, 0x1F, 0x84, 0x10, 0x0F, 0xC3, 0xF8,
  0x0F, 0xC3, 0xF0, 0x08, 0x21, 0xF8, 0x60, 0xC7, 0xF0, 0x01, 0x00, 0x81, 0x18, 0x08, 0x23, 0x10,
  0xC4, 0x10, 0x08, 0x62, 0x18, 0x08, 0x62, 0x18, 0x08, 0x21, 0x0C, 0x61, 0xC4, 0x00, 0x02, 0x01,
  0x01, 0x90, 0x10, 0x62, 0x20, 0x08, 0x30, 0x10, 0x44, 0x10, 0x10, 0x04, 0x10, 0x10, 0x62, 0x08,
  0xE2, 0x88, 0x00, 0x02, 0x01, 0x01, 0xA0, 0x10, 0x42, 0x20, 0x08, 0x20, 0x10, 0x44, 0x10, 0x10,
  0x04, 0x10, 0x10, 0x42, 0x08, 0xA2, 0x88, 0x00, 0x03, 0xE1, 0x00, 0xC0, 0x1F, 0xC6, 0x63, 0x8F,
  0xE0, 0x30, 0xC7, 0xE0, 0x31, 0xCC, 0x30, 0x1F, 0xC6, 0x18, 0xA4, 0x8F, 0x80, 0x07, 0xE2, 0x00,
  0x80, 0x3F, 0xC4, 0x47, 0x1F, 0xE0, 0x20, 0x8F, 0xC0, 0x23, 0x88, 0x20, 0x3F, 0xC4, 0x11, 0x29,
  0x1F, 0x80, 0x04, 0x02, 0x00, 0x80, 0x20, 0x84, 0x41, 0x10, 0x40, 0x20, 0x88, 0x80, 0x20, 0x88,
  0x20, 0x20, 0x84, 0x11, 0x39, 0x10, 0x00, 0x04, 0x02, 0x01, 0x80, 0x20, 0x8C, 0x43, 0x10, 0x40,
  0x21, 0x08, 0xC0, 0x21, 0x88, 0x40, 0x20, 0x84, 0x21, 0x31, 0x10, 0x00, 0x08, 0x07, 0xF1, 0x00,
  0x41, 0x88, 0x7E, 0x20, 0xC0, 0x3F, 0x10, 0xC0, 0x3F, 0x0F, 0xC0, 0x41, 0x87, 0xE2, 0x22, 0x3F,
  0x80, 0x08, 0x07, 0xF1, 0x00, 0x41, 0x08, 0x38, 0x20, 0x80, 0x1C, 0x10, 0x40, 0x1C, 0x07, 0x00,
  0x41, 0x03, 0x82, 0x02, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup() {
  InitHW();
  Drawlogo();
  LoadSettings();
}

void loop() {
  saveSettings();
  OnTimeCounter();
  Climbmode();
  Displaymode();

  saveTempArray();

  AutoAltArea();

  Vario();

  GForceValues();
  triggerGForcemodeStart();
  triggerGForcemodeEnd();
  triggerStartpageGForce();
  Spiraldata();

  triggerThermalmodeStart();
  triggerThermalmodeEnd();
  triggerStartpageThermal();
  thermalValues();
  varioAlt = vario;

  Codetime();
  pages();

  display.refresh();
  delay(1);  // Pause
  TestValues();
}

void InitHW() {
  Serial.begin(9600);

  //Beschleunigungssensor
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }

  //Display
  display.begin();
  display.clearDisplay();
  display.setRotation(1);
  display.setTextSize(1);
  display.setTextColor(BLACK);

  //Drucksensor
  bmp.begin(0x76);

  //Beschleunigungssensor
  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);

  //Pins
  pinMode(0, INPUT);
  pinMode(1, INPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
}

void Drawlogo() {
  display.drawBitmap(0, 0, logo1, 168, 144, 0);
  display.refresh();
  delay(4000);
  display.clearDisplay();
}

void LoadSettings() {
  Hmin = flash1.read();
  if (Hmin == 0) {
    Hmin = 200;
  }

  resalt = flash2.read();
  if (resalt == 0) {
    resalt = 10;
  }

  Tmax = flash3.read();
  if (Tmax == 0) {
    Tmax = 31;
  }

  restemp = flash4.read();
  if (restemp == 0) {
    restemp = 0.1;
  }

  pressure = flash5.read();
  if (pressure == 0) {
    pressure = 1020;
  }

  starttime = flash6.read();

  GLimit = flash7.read();
  if (GLimit == 0) {
    GLimit = 2;
  }

  GforcetimerStartpage = flash8.read();
  if (GforcetimerStartpage == 0) {
    GforcetimerStartpage = 5000;
  }

  GForceDisplayMode = flash9.read();
  if (GForceDisplayMode == 0) {
    GForceDisplayMode = 1;
  }

  thermalTimerStartpage = flash11.read();
  if (thermalTimerStartpage == 0) {
    thermalTimerStartpage = 5000;
  }

  varioLimit = flash12.read();
  if (varioLimit == 0) {
    varioLimit = 0.5;
  }

  climbmodeinterval = flash14.read();
  if (climbmodeinterval == 0) {
    climbmodeinterval = 5000;
  }

  saveinterval = flash15.read();
  if (saveinterval == 0) {
    saveinterval = 300000;
  }

  GForceAutoswitch = flash16.read();

  thermalAutoswitch = flash17.read();

  GForceInitDuration = flash18.read();
  if (GForceInitDuration == 0) {
    GForceInitDuration = 5000;
  }

  thermalInitDuration = flash19.read();
  if (thermalInitDuration == 0) {
    thermalInitDuration = 5000;
  }
}

void pages() {

  buttons();

  if (page > 5) {
    page = 1;
    ClearSensorArea();
    ClearPlotArea();
  }


  if (settingspos > 11) {
    settingspos = 0;
    settingsflag = LOW;
    ClearSensorArea();
    ClearPlotArea();
  }


  if (menupos > 8) {
    menuflag = LOW;
    ClearSensorArea();
    ClearPlotArea();
    menupos = 0;
  }


  if (valuepos > 6) {
    valuepos = 1;
  }


  if (page == thermalpagedown || page == thermalpageup || page == thermalpageupdown) {
    DrawAltLine();
    ClearSensorArea();
    DisplaySensorData();
    DrawTempLine();
    DrawLines();
    PlotPosMarker();
  }


  if (page == thermalpagedown) {
    DrawDown();
  }


  if (page == thermalpageup) {
    DrawUp();
  }


  if (page == thermalpageupdown) {
    DrawUpDown();
  }


  if (page == GForcepage) {
    ClearSensorArea();
    ClearPlotArea();

    display.setFont(&FreeMono9pt7b);
    display.setCursor(1, 12);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("Time");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(1, 38);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print(GForceTime);

    display.setFont(&FreeMono9pt7b);
    display.setCursor(102, 12);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("Alt.");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(102, 38);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print(GForceAlt);

    display.setFont(&FreeMono9pt7b);
    display.setCursor(53, 12);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("m/s");

    display.setFont(&FreeMonoBold12pt7b);
    display.setCursor(53, 38);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print(divespeedmax, 1);

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(21, 93);
    display.setTextSize(2);
    display.setTextColor(BLACK);
    display.print(GForce, 1);

    display.setFont(&FreeMono9pt7b);
    display.setCursor(11, 112);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("MAX G:");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(5, 138);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print(maxGForce, 1);

    display.setFont(&FreeMono9pt7b);
    display.setCursor(89, 112);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("LAST G:");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(95, 138);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print(lastGForcePrint, 1);

    display.drawLine(49, 0, 49, 44, BLACK);    // vertical
    display.drawLine(100, 0, 100, 44, BLACK);  // vertical
    display.drawLine(84, 100, 84, dh, BLACK);  // vertical
    display.drawLine(0, 100, dw, 100, BLACK);  // horizontal
    display.drawLine(0, 44, dw, 44, BLACK);    // horizontal

    display.setTextSize(1);
    display.setFont();
  }


  if (page == thermalpage) {
    ClearSensorArea();
    ClearPlotArea();

    display.setFont(&FreeMono9pt7b);
    display.setCursor(11, 12);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("max.");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(11, 38);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    if (thermalmodeinit == 0) {
      display.print("0.0");
    } else {
      display.print(maxVario, 1);
    }
    display.setFont(&FreeMono9pt7b);
    display.setCursor(95, 12);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("avrg.");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(95, 38);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    if (thermalmodeinit == 0) {
      display.print("0.0");
    }

    else {
      display.print(avVario, 1);
    }

    if (vario < 0) {
      display.setCursor(-21, 93);
    } else {
      display.setCursor(21, 93);
    }
    display.setFont(&FreeMonoBold18pt7b);
    display.setTextSize(2);
    display.setTextColor(BLACK);
    display.print(vario, 1);

    display.setFont(&FreeMono9pt7b);
    display.setCursor(11, 112);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("Climb:");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(-1, 138);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    if (thermalmodeinit == 0) {
      display.print("0");
    } else {
      display.print(thermalAlt, 0);
    }

    display.setFont(&FreeMono9pt7b);
    display.setCursor(95, 112);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.print("Time:");

    display.setFont(&FreeMonoBold18pt7b);
    display.setCursor(83, 138);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    if (thermalmodeinit == 0) {
      display.print("0");
    } else {
      display.printf("%02d", thermalMinutes);
      display.setCursor(116, 138);
      display.print(":");
      display.setCursor(127, 138);
      display.printf("%02d", thermalSeconds);
    }
    display.drawLine(84, 0, 84, 44, BLACK);    // vertical
    display.drawLine(84, 100, 84, dh, BLACK);  // vertical
    display.drawLine(0, 100, dw, 100, BLACK);  // horizontal
    display.drawLine(0, 44, dw, 44, BLACK);    // horizontal

    display.setTextSize(1);
    display.setFont();
  }


  if (menuflag == 1) {
    ClearSensorArea();
    ClearPlotArea();
    display.setTextSize(2);
    display.setTextColor(BLACK);


    display.setCursor(1, 10);
    if (menupos == 1) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Reset GForce");


    display.setCursor(1, 26);
    if (menupos == 2) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Reset ON-Time");


    display.setCursor(1, 42);
    if (menupos == 3) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Edit Values");


    display.setCursor(1, 58);
    if (menupos == 4) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Del.Graph DN");


    display.setCursor(1, 74);
    if (menupos == 5) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Del.Graph UP");


    display.setCursor(1, 90);
    if (menupos == 6) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Del.Graph");


    display.setCursor(1, 106);
    if (menupos == 7) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Settings");


    display.setCursor(1, 122);
    if (menupos == 8) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print("Demomode");


    display.setFont();
    display.setTextSize(1);
  }


  if (settingsflag == 1) {
    ClearSensorArea();
    ClearPlotArea();

    display.setCursor(2, 1);
    display.setTextColor(BLACK);
    display.println("G-Force Limit:");


    display.setCursor(140, 1);
    if (settingspos == 1) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(GLimit, 1);


    display.setCursor(2, 13);
    display.setTextColor(BLACK);
    display.println("Init Duration G-Force:");


    display.setCursor(140, 13);
    if (settingspos == 2) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(GForceInitDuration / 1000);


    display.setCursor(2, 25);
    display.setTextColor(BLACK);
    display.println("G-Force Display:");
    display.setCursor(140, 25);


    if (settingspos == 3) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(GForceDisplayModeValue);


    display.setCursor(2, 37);
    display.setTextColor(BLACK);
    display.println("Autoswitch G-Forcepage:");


    display.setCursor(140, 37);
    if (settingspos == 4) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(GForceAutoswitchValue);


    display.setCursor(2, 49);
    display.setTextColor(BLACK);
    display.println("Startpagetimer G-Force:");


    display.setCursor(140, 49);
    if (settingspos == 5) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(GforcetimerStartpage / 1000);


    display.setCursor(2, 66);
    display.setTextColor(BLACK);
    display.println("Variolimit:");


    display.setCursor(140, 66);
    if (settingspos == 6) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(varioLimit, 1);


    display.setCursor(2, 78);
    display.setTextColor(BLACK);
    display.println("Init Duration Thermal:");


    display.setCursor(140, 78);
    if (settingspos == 7) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(thermalInitDuration / 1000);


    display.setCursor(2, 90);
    display.setTextColor(BLACK);
    display.println("Autoswitch Thermalpage:");


    display.setCursor(140, 90);
    if (settingspos == 8) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(thermalAutoswitchValue);


    display.setCursor(2, 102);
    display.setTextColor(BLACK);
    display.println("Startpagetimer Thermal:");


    display.setCursor(140, 102);
    if (settingspos == 9) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(thermalTimerStartpage / 1000);


    display.setCursor(2, 119);
    display.setTextColor(BLACK);
    display.println("Climbmodeinterval:");


    display.setCursor(140, 119);
    if (settingspos == 10) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(climbmodeinterval / 1000);


    display.setCursor(2, 131);
    display.setTextColor(BLACK);
    display.println("Saveinterval Ontime:");


    display.setCursor(140, 131);
    if (settingspos == 11) {
      display.setTextColor(WHITE, BLACK);
    } else {
      display.setTextColor(BLACK);
    }
    display.print(saveinterval / 1000);


    if (GForceAutoswitch == LOW) {
      GForceAutoswitchValue = "OFF";
    }


    if (GForceAutoswitch == HIGH) {
      GForceAutoswitchValue = "ON";
    }


    if (thermalAutoswitch == 0) {
      thermalAutoswitchValue = "OFF";
    }


    if (thermalAutoswitch == 1) {
      thermalAutoswitchValue = "ON";
    }
  }
}

void Climbmode() {
  if (climbmodeinterval < (millis() - climbmodetimer)) {
    climbmodealt = alt - altold;
    altold = alt;
    climbmodetimer = millis();
  }

  if (climbmodealt < 0) {
    climbmode = 0;
  }

  if (climbmodealt > 0) {
    climbmode = 1;
  }
}

void AutoAltArea() {
  if (alt > Hmax) {
    resalt = resalt + 1;
  }

  if (alt < Hmin) {
    Hmin = Hmin - 100;
  }
}

void saveSettings() {

  if (flash1.read() != Hmin) {
    flash1.write(Hmin);
  }

  if (flash2.read() != resalt) {
    flash2.write(resalt);
  }

  if (flash3.read() != Tmax) {
    flash3.write(Tmax);
  }

  if (flash4.read() != restemp) {
    flash4.write(restemp);
  }

  if (flash5.read() != pressure) {
    flash5.write(pressure);
  }

  if (saveinterval < (millis() - savetimer)) {
    flash6.write(ontime);
    savetimer = millis();
  }

  if (flash7.read() != GLimit) {
    flash7.write(GLimit);
  }

  if (flash8.read() != GforcetimerStartpage) {
    flash8.write(GforcetimerStartpage);
  }

  if (flash9.read() != GForceDisplayMode) {
    flash9.write(GForceDisplayMode);
  }

  if (flash11.read() != thermalTimerStartpage) {
    flash11.write(thermalTimerStartpage);
  }

  if (flash12.read() != varioLimit) {
    flash12.write(varioLimit);
  }

  if (flash14.read() != climbmodeinterval) {
    flash14.write(climbmodeinterval);
  }

  if (flash15.read() != saveinterval) {
    flash15.write(saveinterval);
  }

  if (flash16.read() != GForceAutoswitch) {
    flash16.write(GForceAutoswitch);
  }

  if (flash17.read() != thermalAutoswitch) {
    flash17.write(thermalAutoswitch);
  }

  if (flash18.read() != GForceInitDuration) {
    flash18.write(GForceInitDuration);
  }

  if (flash19.read() != thermalInitDuration) {
    flash19.write(thermalInitDuration);
  }
}

void saveTempArray() {
  if (modeflag == LOW && climbmode == 0 && millis() > 10000) {
    if (temp1 != tempsave1[altsave]) {
      tempsave1[altsave] = temp1 * 100;
    }
  }

  if (modeflag == LOW && climbmode == 1 && millis() > 10000) {
    if (temp1 != tempsave2[altsave]) {
      tempsave2[altsave] = temp1 * 100;
    }
  }
}

void clearArray1() {
  for (int altsave = 0; altsave < 1000; altsave++) {
    tempsave1[altsave] = 0;
  }

  display.setCursor(80, 134);
  display.setTextColor(BLACK);
  display.println("E R A S E");
}

void clearArray2() {
  for (int altsave = 0; altsave < 1000; altsave++) {
    tempsave2[altsave] = 0;
  }

  display.setCursor(80, 134);
  display.setTextColor(BLACK);
  display.println("E R A S E");
}

void clearArray3() {
  for (int altsave = 0; altsave < 1000; altsave++) {
    tempsave1[altsave] = 0;
  }

  for (int altsave = 0; altsave < 1000; altsave++) {
    tempsave2[altsave] = 0;
  }

  display.setCursor(60, 134);
  display.setTextColor(BLACK);
  display.println("E R A S E  A L L");
}

void ClearSensorArea() {
  display.fillRect(0, 0, dx, dh, WHITE);
}

void ClearPlotArea() {
  display.fillRect(dx, 0, dw, dh, WHITE);
}

void Displaymode() {
  altsave = (alt / 10);
  Tmin = Tmax - ((dw - dx) * restemp);
  Hmax = Hmin + (dh * resalt);
  winkel = (atan((restemp * 125) / resalt) * 180 / PI);

  if (modeflag == LOW) {
    temp1 = bmp.readTemperature();
    alt = 0.9 * alt + 0.1 * bmp.readAltitude(SEALEVELPRESSURE_HPA);
    sensors_event_t a, g, temp;
    mpu.getEvent(&a, &g, &temp);
    GForce = ((sqrt(sq(a.acceleration.x) + sq(a.acceleration.y) + sq(a.acceleration.z))) / 9.81);
    climbmodeinterval = flash14.read();


    //alt = alt + vario / (1000 / codetime);
    //alt = alt - 1;

    //poti = analogRead(0);
    //poti1 = map(poti, 0, 1023, 10, 50);
    //GForce = poti1 / 10;
  }

  if (modeflag == HIGH) {
    temp1 = temptest;
    alt = alttest;
    climbmodeinterval = 1;
    alttest = alttest - altinc;
    temptest = temptest + tempinc;
    tempdemo = tempinc * 10;
  }
}

void DisplaySensorData() {

  display.setCursor(2, 1);
  display.setTextColor(BLACK);
  display.println("A");


  display.setCursor(2, 11);
  display.setTextColor(BLACK);
  display.println("T");


  display.setCursor(2, 21);
  display.setTextColor(BLACK);
  display.println("vs");


  display.setCursor(12, 1);
  if (valuepos == 1 && valueflag == HIGH) {
    display.setTextColor(WHITE, BLACK);
  } else {
    display.setTextColor(BLACK);
  }
  display.print(String(alt, 1));


  display.setCursor(17, 11);
  display.setTextColor(BLACK);
  display.println(String(temp1));


  if (vario >= 0) {
    display.setCursor(23, 21);
  } else {
    display.setCursor(17, 21);
  }
  display.setTextColor(BLACK);
  display.print(vario, 1);


  display.setCursor(2, 36);
  display.setTextColor(BLACK);
  display.print("A");


  display.setCursor(2, 46);
  display.setTextColor(BLACK);
  display.print("L");


  display.setCursor(2, 56);
  display.setTextColor(BLACK);
  display.print("T");


  display.setCursor(17, 36);
  display.setTextColor(BLACK);
  display.print(Hmax);


  display.setCursor(17, 46);
  if (valuepos == 3 && valueflag == HIGH) {
    display.setTextColor(WHITE, BLACK);
  } else {
    display.setTextColor(BLACK);
  }
  if (resalt >= 1) {
    display.print(resalt, 0);
  } else
    display.print(resalt, 1);


  display.setCursor(17, 56);
  if (valuepos == 2 && valueflag == HIGH) {
    display.setTextColor(WHITE, BLACK);
  } else {
    display.setTextColor(BLACK);
  }
  display.print(Hmin);


  display.setCursor(2, 71);
  display.setTextColor(BLACK);
  display.print("T");


  display.setCursor(2, 81);
  display.setTextColor(BLACK);
  display.print("M");


  display.setCursor(2, 91);
  display.setTextColor(BLACK);
  display.print("P");


  display.setCursor(17, 71);
  if (valuepos == 4 && valueflag == HIGH) {
    display.setTextColor(WHITE, BLACK);
  } else {
    display.setTextColor(BLACK);
  }
  display.print(Tmax);


  display.setCursor(23, 81);
  if (valuepos == 5 && valueflag == HIGH) {
    display.setTextColor(WHITE, BLACK);
  } else {
    display.setTextColor(BLACK);
  }
  display.print(restemp);


  display.setCursor(17, 91);
  display.setTextColor(BLACK);
  display.print(Tmin);


  display.setCursor(3, 136);
  display.setTextColor(BLACK);
  display.printf("%02d", hours);


  display.setCursor(14, 136);
  display.setTextColor(BLACK);
  display.print(":");


  display.setCursor(19, 136);
  display.setTextColor(BLACK);
  display.printf("%02d", minutes);


  display.setCursor(30, 136);
  display.setTextColor(BLACK);
  display.print(":");


  display.setCursor(35, 136);
  display.setTextColor(BLACK);
  display.printf("%02d", seconds);


  display.setCursor(27, 108);
  display.setTextColor(BLACK);
  display.print("G");


  display.setCursor(7, 108);
  display.setTextSize(1);
  display.setTextColor(BLACK);


  if (GForceDisplayMode == HIGH) {
    display.print(maxGForce, 1);
  }


  if (GForceDisplayMode == HIGH) {
    GForceDisplayModeValue = "max.";
  }


  if (GForceDisplayMode == LOW) {
    display.print(lastGForcePrint, 1);
  }


  if (GForceDisplayMode == LOW) {
    GForceDisplayModeValue = "last";
  }


  display.setCursor(7, 120);
  display.setTextColor(BLACK);
  display.print(GForce, 1);


  display.setCursor(27, 120);
  display.setTextColor(BLACK);
  display.print("G");


  display.fillRect(dx + 5, 0, 22, 8, WHITE);
  display.setCursor(dx + 5, 0);
  display.setTextColor(BLACK);
  display.print(codetime, 0);
}

void Vario() {
  if (millis() > (variotimerinterval + variotimer)) {
    //poti = analogRead(0);
    //poti1 = map(poti, 0, 1023, -10, 30);
    //vario = poti1 / 10;
    vario = alt - AltVario;
    AltVario = alt;
    variotimer = millis();
  }
}

void OnTimeCounter() {
  //Ontime
  seconds = ontime / 1000;
  minutes = seconds / 60;
  hours = minutes / 60;

  seconds %= 60;
  minutes %= 60;

  ontime = starttime + millis() - currentMillis;
}

void GForceValues() {
  if (millis() > 15000) {
    // max GForce schreiben
    if (GForce > maxGForce) {
      maxGForce = GForce;
    }

    // divespeed schreiben
    divespeed = vario;
    if (divespeed > divespeedmax) {
      divespeedmax = divespeed;
    }

    // lastGForcePrint schreiben
    if (GForce > lastGForcePrint) {
      lastGForcePrint = GForce;
    }
  }
}

void triggerGForcemodeStart() {
  if (GForce > GLimit && lastGForce < GLimit && millis() > 15000 && modeflag == LOW && valuepos == 6 && GForceStatus == LOW) {  //Trigger GForce-Seite
    GForceTimeStartInit = millis();
    GForceAltStartInit = alt;

    if (page != GForcepage) {
      oldpage = page;
    }
  }


  if (GForce > GLimit && (millis() - GForceInitDuration) > GForceTimeStartInit && GForceStatus == LOW) {
    GForceStatus = HIGH;
    GForceTimeStart = GForceTimeStartInit;
    GForceAltStart = GForceAltStartInit;
    lastGForcePrint = 1.0;
    divespeedmax = 0;
    GForcemodeinit = 1;
  }


  if (GForceStatus == HIGH && GForceAutoswitch == HIGH) {
    page = GForcepage;
  }
}

void triggerGForcemodeEnd() {
  if (GForce < GLimit && lastGForce > GLimit && GForceStatus == HIGH && millis() > 13000) {  //Trigger spiral end
    GForceTimeEndInit = millis();
    GForceAltEndInit = alt;
  }

  if (GForce < GLimit && (millis() - GForceInitDuration) > GForceTimeEndInit && GForceStatus == HIGH) {
    GForceTimeEnd = GForceTimeEndInit;
    GForceAltEnd = GForceAltEndInit;
    GForceStatus = LOW;
  }
}

void triggerStartpageGForce() {
  if (millis() < GForceTimeEnd + GforcetimerStartpage && GForceTimeEnd > GForceTimeStart && GForceAutoswitch == 1) {  //Trigger Startpage
    page = oldpage;
    ClearPlotArea();
  }
}

void Spiraldata() {
  if (GForceStatus == HIGH) {
    GForceTime = (millis() - GForceTimeStart) / 1000;
    GForceAlt = GForceAltStartInit - alt;
  }

  if (GForceStatus == LOW) {
    GForceTime = (GForceTimeEnd - GForceTimeStart) / 1000;
    GForceAlt = GForceAltStartInit - GForceAltEnd;
  }

  if (GForceTime < 0) {
    GForceTime = 0;
  }

  lastGForce = GForce;
}

void thermalValues() {
  if (vario > maxVario) {
    maxVario = vario;
  }


  if (thermalStatus == HIGH) {
    thermalAlt = alt - thermalAltStartInit;


    if (thermalAlt < 0) {
      thermalAlt = 1;
    }


    thermalTime = (millis() - thermalTimeStart);
    thermalSeconds = thermalTime / 1000;
    thermalMinutes = thermalSeconds / 60;
    thermalSeconds %= 60;
  }


  if (thermalStatus == LOW) {
    thermalAlt = thermalAltEndInit - thermalAltStartInit;
    if (thermalAlt < 0) {
      thermalAlt = 0;
    }


    thermalTime = (thermalTimeEnd - thermalTimeStart);
    thermalSeconds = thermalTime / 1000;
    thermalMinutes = thermalSeconds / 60;
    thermalSeconds %= 60;
  }


  avVario = thermalAlt / thermalSeconds;
  if (avVario < 0) {
    avVario = 0;
  }


  if (thermalTime < 0) {
    thermalTime = 0;
  }


  if (thermalSeconds < 0) {
    thermalSeconds = 0;
  }


  if (thermalMinutes < 0) {
    thermalMinutes = 0;
  }
}

void triggerThermalmodeStart() {
  if (vario * 10 > varioLimit * 10 && varioAlt * 10 < varioLimit * 10 && millis() > 15000 && modeflag == LOW && valuepos == 6 && thermalStatus == LOW) {
    thermalTimeStartInit = millis();
    thermalAltStartInit = alt;
    if (page != thermalpage) {
      oldpage = page;
    }
  }


  if (vario * 10 > varioLimit * 10 && (millis() - thermalInitDuration) > thermalTimeStartInit && thermalStatus == LOW && millis() > 15000) {
    thermalStatus = HIGH;
    thermalTimeStart = thermalTimeStartInit;
    thermalAltStart = thermalAltStartInit;
    maxVario = 0;
    avVario = 0;
    thermalAlt = 0;
    thermalmodeinit = 1;
  }


  if (thermalStatus == HIGH && thermalAutoswitch == HIGH) {
    page = thermalpage;
  }
}

void triggerThermalmodeEnd() {
  if (vario * 10 < varioLimit * 10 && varioAlt * 10 > varioLimit * 10 && thermalStatus == HIGH && millis() > 13000) {
    thermalTimeEndInit = millis();
    thermalAltEndInit = alt;
  }

  if (vario * 10 < varioLimit * 10 && (millis() - thermalInitDuration) > thermalTimeEndInit && thermalStatus == HIGH) {
    thermalTimeEnd = thermalTimeEndInit;
    thermalAltEnd = thermalAltEndInit;
    thermalStatus = LOW;
  }
}

void triggerStartpageThermal() {
  if (millis() > thermalTimeEnd + thermalInitDuration + thermalTimerStartpage && thermalTimeEnd > thermalTimeStart && thermalAutoswitch == 1) {
    page = oldpage;
    ClearPlotArea();
  }
}

void DrawLines() {
  display.drawLine(dx, 0, dx, dw, BLACK);          //1. vertikal
  display.drawLine(dw - 1, 0, dw - 1, dh, BLACK);  //2. vertikal
  display.drawLine(0, 31, dx, 31, BLACK);          //1. horizontal
  display.drawLine(0, 66, dx, 66, BLACK);          //2. horizontal
  display.drawLine(0, 101, dx, 101, BLACK);        //3. horizontal
  display.drawLine(0, 131, dx, 131, BLACK);        //4. horizontal
}

void DrawTempLine() {
  display.drawLine(dx, dh, (dx + (dh * tan(((90 - winkel) / 180 * PI)))), 0, BLACK);
}

void DrawAltLine() {
  y = ((Hmax - alt) / resalt);
  yi = dh - y;
  xw = yi * tan((90 - winkel) / 180 * PI);
  xt = ((temp1 - Tmin) / (restemp));
  x = dx + xw + xt;

  if (modeflag == LOW && (page == thermalpagedown || page == thermalpageup || page == thermalpageupdown)) {
    x01 = dx;
    y01 = y + 1;
    x02 = x - 10;
    y02 = y + 1;


    x03 = x + 10;
    y03 = y + 1;
    x04 = dx + dw;
    y04 = y + 1;

    display.drawLine(x01old, y01old, x02old, y02old, WHITE);
    display.drawLine(x01, y01, x02, y02, BLACK);

    x01old = x01;
    y01old = y01;
    x02old = x02;
    y02old = y02;

    display.drawLine(x03old, y03old, x04old, y04old, WHITE);
    display.drawLine(x03, y03, x04, y04, BLACK);

    x03old = x03;
    y03old = y03;
    x04old = x04;
    y04old = y04;

    PlotGraph();
  }


  if (modeflag == HIGH && (page == thermalpagedown || page == thermalpageup || page == thermalpageupdown)) {
    display.fillRect(dx + 65, 126, dw, 17, WHITE);
    display.setTextSize(1);
    display.setFont(&FreeMonoBold9pt7b);
    display.setCursor(dx + 15, 139);
    display.setTextColor(BLACK);
    display.print("Temp:");
    display.setCursor(dx + 75, 139);
    display.setTextColor(BLACK);
    display.print(tempdemo, 1);
    display.setTextSize(1);
    display.setFont();


    if (alttest <= 0) {
      alttest = 0;
    }

    display.drawLine(x01old, y01old, x02old, y02old, WHITE);
    display.drawLine(x01, y01, x02, y02, BLACK);

    display.drawLine(x03old, y03old, x04old, y04old, WHITE);
    display.drawLine(x03, y03, x04, y04, BLACK);

    display.drawLine(dx + 1, y, dx + dw - 7, y, WHITE);
    display.drawPixel(x, y, BLACK);
    display.drawPixel(x + 1, y, BLACK);
    display.drawPixel(x - 1, y, BLACK);
    display.drawPixel(x + 2, y, BLACK);
    display.drawPixel(x - 2, y, BLACK);
  }
}

void PlotGraph() {
  altload = (Hmax - (drawlinecounter * resalt)) / 10;
  yp = drawlinecounter - 1;
  yip = dh - yp;
  xwp = yip * tan((90 - winkel) / 180 * PI);

  if (modeflag == LOW && page == thermalpagedown) {
    tempsave10 = tempsave1[altload];
    tempsave11 = tempsave10 / 100;

    if (tempsave1[altload] == 0) {
      xtp = 300;
    }

    xtp = (tempsave11 - Tmin) / restemp;
    xp = dx + xwp + xtp;

    display.drawLine(dx + 1, yp, dx + dw - 7, yp, WHITE);
    display.drawPixel(xp, yp, BLACK);
    display.drawPixel(xp + 1, yp, BLACK);
    display.drawPixel(xp - 1, yp, BLACK);
    display.drawPixel(xp + 2, yp, BLACK);
    display.drawPixel(xp - 2, yp, BLACK);

    drawlinecounter++;
    drawlinecounter %= dh;
  }

  if (modeflag == LOW && page == thermalpageup) {
    tempsave20 = tempsave2[altload];
    tempsave22 = tempsave20 / 100;


    if (tempsave2[altload] == 0) {
      xtp = 300;
    }

    xtp = (tempsave22 - Tmin) / restemp;
    xp = dx + xwp + xtp;

    display.drawLine(dx + 1, yp, dx + dw - 7, yp, WHITE);
    display.drawPixel(xp, yp, BLACK);
    display.drawPixel(xp + 1, yp, BLACK);
    display.drawPixel(xp - 1, yp, BLACK);
    display.drawPixel(xp + 2, yp, BLACK);
    display.drawPixel(xp - 2, yp, BLACK);

    drawlinecounter++;
    drawlinecounter %= dh;
  }

  if (modeflag == LOW && page == thermalpageupdown) {
    tempsave10 = tempsave1[altload];
    tempsave11 = tempsave10 / 100;


    if (tempsave1[altload] == 0) {
      xtp = 300;
    }

    xtp = (tempsave11 - Tmin) / restemp;
    xp = dx + xwp + xtp;

    display.drawLine(dx + 1, yp, dx + dw - 7, yp, WHITE);
    display.drawPixel(xp, yp, BLACK);
    display.drawPixel(xp + 1, yp, BLACK);
    display.drawPixel(xp - 1, yp, BLACK);
    display.drawPixel(xp + 2, yp, BLACK);
    display.drawPixel(xp - 2, yp, BLACK);

    tempsave20 = tempsave2[altload];
    tempsave22 = tempsave20 / 100;

    if (tempsave2[altload] == 0) {
      xtp = 300;
    }

    xtp = (tempsave22 - Tmin) / restemp;
    xp = dx + xwp + xtp;

    display.drawPixel(xp, yp, BLACK);
    display.drawPixel(xp + 1, yp, BLACK);
    display.drawPixel(xp - 1, yp, BLACK);
    display.drawPixel(xp + 2, yp, BLACK);
    display.drawPixel(xp - 2, yp, BLACK);

    drawlinecounter++;
    drawlinecounter %= dh;
  }
}

void PlotPosMarker() {
  display.drawRect(dx + 1, yp - 11, 4, 10, WHITE);
  display.drawLine(dx + 1, yp, dx + 4, yp, BLACK);
  display.drawRect(dx + 1, yp - 1, 4, 10, WHITE);
}

void buttons() {
  buttonpress1();
  buttonpress2();
  buttonpress3();
}

void buttonpress1() {
  if (digitalRead(buttonpin1)) {
    if (menuflag == LOW && settingsflag == LOW && valueflag == LOW && modeflag == LOW) {
      page++;
      ClearSensorArea();
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 1) {
      pressure = pressure - 1;
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 2) {
      Hmin = Hmin - 100;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (resalt <= 1) {
      resaltgap = 0.1;
    }

    else resaltgap = 1;

    if (valueflag == HIGH && valuepos == 3) {
      resalt = resalt - resaltgap;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 4) {
      Tmax = Tmax - 1;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 5) {
      restemp = restemp - 0.05;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (settingsflag == HIGH && settingspos == 1) {
      GLimit = GLimit - 0.1;
    }

    if (settingsflag == HIGH && settingspos == 2) {
      GForceInitDuration = GForceInitDuration - 1000;
    }

    if (settingsflag == HIGH && settingspos == 3) {
      GForceDisplayMode = !GForceDisplayMode;
    }

    if (settingsflag == HIGH && settingspos == 4) {
      GForceAutoswitch = !GForceAutoswitch;
      display.fillRect(120, 0, 48, dh, SSD1327_WHITE);
    }

    if (settingsflag == HIGH && settingspos == 5) {
      GforcetimerStartpage = GforcetimerStartpage - 1000;
    }

    if (settingsflag == HIGH && settingspos == 6) {
      varioLimit = varioLimit - 0.1;
    }

    if (settingsflag == HIGH && settingspos == 7) {
      thermalInitDuration = thermalInitDuration - 1000;
    }

    if (settingsflag == HIGH && settingspos == 8) {
      thermalAutoswitch = !thermalAutoswitch;
      display.fillRect(120, 0, 48, dh, SSD1327_WHITE);
    }

    if (settingsflag == HIGH && settingspos == 9) {
      thermalTimerStartpage = thermalTimerStartpage - 1000;
    }

    if (settingsflag == HIGH && settingspos == 10) {
      climbmodeinterval = climbmodeinterval - 1000;
    }

    if (settingsflag == HIGH && settingspos == 11) {
      saveinterval = saveinterval - 30000;
    }

    if (modeflag == HIGH) {
      tempinc = tempinc - 0.01;
    }

    if (menuflag == HIGH) {
      menuflag = LOW;
      ClearSensorArea();
      ClearPlotArea();
    }
    while (digitalRead(buttonpin1))
      ;
  }
}

void buttonpress2() {
  if (digitalRead(buttonpin2)) {

    if (modeflag == HIGH && menuflag == LOW) {
      modeflag = LOW;
      ClearSensorArea();
      ClearPlotArea();
    }

    if (modeflag == LOW && valuepos == 6 && page != thermalpage) {
      Tmax = temp1 + (((dw - dx) / 2) * restemp) + ((yi * tan((90 - winkel) / 180 * PI)) * restemp);
      ClearSensorArea();
      ClearPlotArea();
    }

    if (menuflag == HIGH && menupos == 1) {
      maxGForce = 1;
      menuflag = LOW;
    }

    if (menuflag == HIGH && menupos == 2) {
      starttime = 100;
      flash6.write(starttime);
      currentMillis = millis();
      menuflag = LOW;
    }

    if (menuflag == HIGH && menupos == 3) {
      valueflag = HIGH;
      valuepos = 0;
      menuflag = LOW;
    }

    if (menuflag == HIGH && menupos == 4) {
      menuflag = LOW;
      clearArray1();
    }

    if (menuflag == HIGH && menupos == 5) {
      menuflag = LOW;
      clearArray2();
    }

    if (menuflag == HIGH && menupos == 6) {
      menuflag = LOW;
      clearArray3();
    }

    if (menuflag == HIGH && menupos == 7) {
      settingsflag = HIGH;
      settingspos = 0;
      menuflag = LOW;
    }

    if (menuflag == HIGH && menupos == 8) {
      altinc = 10;
      tempinc = 0.08;
      alttest = Hmax;
      temptest = Tmin + ((Tmax - Tmin) / 2) - (dh * tan((90 - winkel) / 180 * PI) * restemp);
      modeflag = HIGH;
      menuflag = LOW;
    }


    if (page == GForcepage) {
      maxGForce = 1.0;
    }

    if (valueflag == HIGH) {
      valuepos++;
    }

    if (valuepos == 6) {
      valueflag = LOW;
    }

    if (settingsflag == HIGH) {
      settingspos++;
    }



    menupos = 0;
    while (digitalRead(buttonpin2))
      ;
  }
}

void buttonpress3() {

  if (digitalRead(buttonpin3)) {

    if (menuflag == LOW && settingsflag == LOW && valueflag == LOW && modeflag == LOW) {
      menuflag = HIGH;
      menupos = 0;
    }

    if (menuflag == HIGH && settingsflag == LOW) {
      menupos++;
    }

    if (valueflag == HIGH && valuepos == 1) {
      pressure = pressure + 1;
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 2) {
      Hmin = Hmin + 100;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (resalt < 1) {
      resaltgap = 0.1;
    }

    else resaltgap = 1;

    if (valueflag == HIGH && valuepos == 3) {
      resalt = resalt + resaltgap;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 4) {
      Tmax = Tmax + 1;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }

    if (valueflag == HIGH && valuepos == 5) {
      restemp = restemp + 0.05;
      winkel = (atan((restemp * 125) / resalt) * 180 / PI);
      ClearPlotArea();
    }
    if (settingsflag == HIGH && settingspos == 1) {
      GLimit = GLimit + 0.1;
    }

    if (settingsflag == HIGH && settingspos == 2) {
      GForceInitDuration = GForceInitDuration + 1000;
    }

    if (settingsflag == HIGH && settingspos == 3) {
      GForceDisplayMode = !GForceDisplayMode;
    }

    if (settingsflag == HIGH && settingspos == 4) {
      GForceAutoswitch = !GForceAutoswitch;
      display.fillRect(120, 0, 48, dh, SSD1327_WHITE);
    }

    if (settingsflag == HIGH && settingspos == 5) {
      GforcetimerStartpage = GforcetimerStartpage + 1000;
    }

    if (settingsflag == HIGH && settingspos == 6) {
      varioLimit = varioLimit + 0.1;
    }

    if (settingsflag == HIGH && settingspos == 7) {
      thermalInitDuration = thermalInitDuration + 1000;
    }

    if (settingsflag == HIGH && settingspos == 8) {
      thermalAutoswitch = !thermalAutoswitch;
      display.fillRect(120, 0, 48, dh, SSD1327_WHITE);
    }

    if (settingsflag == HIGH && settingspos == 9) {
      thermalTimerStartpage = thermalTimerStartpage + 1000;
    }

    if (settingsflag == HIGH && settingspos == 10) {
      climbmodeinterval = climbmodeinterval + 1000;
    }

    if (settingsflag == HIGH && settingspos == 11) {
      saveinterval = saveinterval + 30000;
    }

    if (modeflag == HIGH) {
      tempinc = tempinc + 0.01;
    }
  }


  while (digitalRead(buttonpin3))
    ;
}

void DrawDown() {
  display.drawTriangle(35, 108, 45, 108, 40, 123, BLACK);
}

void DrawUp() {
  display.drawTriangle(35, 123, 45, 123, 40, 108, BLACK);
}

void DrawUpDown() {
  display.drawTriangle(37, 113, 43, 113, 40, 108, BLACK);
  display.drawTriangle(37, 117, 43, 117, 40, 123, BLACK);
}

void Codetime() {
  codetime2 = millis();
  codetime = codetime2 - codetime1;
  codetime1 = codetime2;
}

void TestValues() {
  Serial.println(alt);
  Serial.println(y);

  Serial.println("===========================================");
}

/*
//Mode
Serial.print("Pos: \t\t\t");Serial.print("page: \t\t\t");
Serial.println(page);
Serial.println(pos);
Serial.print("page: \t\t\t");
Serial.println(page);
Serial.print("thermalflag: \t\t");
Serial.println(thermalflag);
Serial.print("thermalAutoswitch: \t\t");
Serial.println(thermalAutoswitch);


//Sensors
Serial.print("Sensor Temp: \t\t");
Serial.println(bme.readTemperature());
Serial.print("Sensor Hum: \t\t");
Serial.println(bme.readHumidity());
Serial.print("Sensor alt: \t\t");
Serial.println( bme.readAltitude(SEALEVELPRESSURE_HPA));

Serial.print("alt: \t\t\t");
Serial.println(alt);
Serial.print("temp1: \t\t\t");
Serial.println(temp1);
Serial.print("Hum: \t\t");
Serial.println(hum);
Serial.println(" ");

//XY
Serial.print("x: \t");
Serial.println(x);
Serial.print("xw: \t");
Serial.println(xw);
Serial.print("xt: \t");
Serial.println(xt);
Serial.print ("y: \t");
Serial.println(y);
Serial.print("yi: \t");
Serial.println(yi);
Serial.println(" ");

//Drawline
Serial.print("altsave: \t");
Serial.println(altsave);
Serial.print("Altload: \t");
Serial.println(altload);
Serial.print("tempsave[altsave]: \t");
Serial.println(tempsave[altsave]);
Serial.print("tempsave[altload]: \t");
Serial.println(tempsave[altload]);
Serial.print("Drawlinecounter: \t");
Serial.println(drawlinecounter);
Serial.println(" ");

//XpYp
Serial.print("xp: \t");
Serial.println(xp);
Serial.print("xwp: \t");
Serial.println(xwp);
Serial.print("xtp: \t");
Serial.println(xtp);
Serial.print("yp: \t");
Serial.println(yp);
Serial.print("yip: \t");
Serial.println(yip);
Serial.println(" ");

//GForcepage
Serial.print("G-Force: \t\t");
Serial.println(GForce);
Serial.print("GLimit: \t\t");
Serial.println(GLimit);

Serial.print("currentGForce: \t\t");
Serial.println(currentGForce);
Serial.print("lastGForce: \t\t");
Serial.println(lastGForce);
Serial.print("lastGForcePrint: \t");
Serial.println(lastGForcePrint);
Serial.print("maxGForce: \t\t");
Serial.println(maxGForce);

Serial.print("GForceDisplayMode: \t");
Serial.println(GForceDisplayMode);
Serial.print("GForceDisplayModeValue:");
Serial.println(GForceDisplayModeValue);

Serial.print("GForceAutoswitch: \t");
Serial.println(GForceAutoswitch);
Serial.print("GForceAutoswitchValue: \t");
Serial.println(GForceAutoswitchValue);

Serial.print("GForceInitDuration: \t");
Serial.println(GForceInitDuration);
Serial.print("GforcetimerStartpage: \t");
Serial.println(GforcetimerStartpage);

Serial.print("GForcemodeinit: \t");
Serial.println(GForcemodeinit);
Serial.print("GForceStatus: \t\t");
Serial.println(GForceStatus);

Serial.print("GForceTimeStartInit: \t");
Serial.println(GForceTimeStartInit);
Serial.print("GForceTimeStart: \t");
Serial.println(GForceTimeStart);
Serial.print("GForceTimeEndInit: \t");
Serial.println(GForceTimeEndInit);
Serial.print("GForceTimeEnd: \t\t");
Serial.println(GForceTimeEnd);

Serial.print("GForceTime: \t\t");
Serial.println(GForceTime);

Serial.print("GForceAltStartInit: \t");
Serial.println(GForceAltStartInit);
Serial.print("GForceAltStart: \t");
Serial.println(GForceAltStart);
Serial.print("GForceAltEndInit: \t");
Serial.println(GForceAltEndInit);
Serial.print("GForceAltEnd: \t\t");
Serial.println(GForceAltEnd);
Serial.print("Spiral Altitude: \t");
Serial.println(GForceAlt);

Serial.print("divespeedmax: \t\t");
Serial.println(divespeedmax);

Serial.print("page: \t\t");
Serial.println(page);
Serial.print("oldpage: \t\t");
Serial.println(oldpage);

//Thermalpage
Serial.print("Vario: \t\t");
Serial.println(vario);
Serial.print("varioAlt: \t\t");
Serial.println(varioAlt);
Serial.print("varioLimit: \t\t");
Serial.println(varioLimit);
Serial.print("maxVario: \t\t");
Serial.println(maxVario);
Serial.print("avVario: \t\t");
Serial.println(avVario);

Serial.print("thermalAutoswitch: \t");
Serial.println(thermalAutoswitch);
Serial.print("thermalAutoswitchValue:\t");
Serial.println(thermalAutoswitchValue);

Serial.print("thermalInitDuration: \t");
Serial.println(thermalInitDuration);
Serial.print("thermalTimerStartpage: \t");
Serial.println(thermalTimerStartpage);

Serial.print("thermalmodeinit: \t");
Serial.println(thermalmodeinit);
Serial.print("thermalStatus: \t\t");
Serial.println(thermalStatus);

Serial.print("thermalTimeStartInit: \t");
Serial.println(thermalTimeStartInit);
Serial.print("thermalTimeStart: \t");
Serial.println(thermalTimeStart);
Serial.print("thermalTimeEndInit: \t");
Serial.println(thermalTimeEndInit);
Serial.print("thermalTimeEnd: \t");
Serial.println(thermalTimeEnd);

Serial.print("thermalTime: \t\t");
Serial.println(thermalTime);
Serial.print("thermalSeconds: \t");
Serial.println(thermalSeconds);
Serial.print("thermalMinutes: \t");
Serial.println(thermalMinutes);

Serial.print("thermalAltStartInit: \t");
Serial.println(thermalAltStartInit);
Serial.print("thermalAltStart: \t");
Serial.println(thermalAltStart);
Serial.print("thermalAltEndInit: \t");
Serial.println(thermalAltEndInit);
Serial.print("thermalAltEnd: \t\t");
Serial.println(thermalAltEnd);
Serial.print("thermalAlt Altitude: \t");
Serial.println(thermalAlt);

Serial.print("page: \t\t");
Serial.println(page);
Serial.print("oldpage: \t\t");
Serial.println(oldpage);

//Climbmode
Serial.print("Climbmode: \t");
Serial.println(climbmode);
Serial.print("Climbmodetimer: \t");
Serial.println(climbmodetimer);
Serial.print("Climbmodealt: \t");
Serial.println(climbmodealt);

//Vario
Serial.print("Vario: \t\t");
Serial.println(vario);
Serial.print("Alt Vario: \t");
Serial.println(AltVario);
Serial.print("Vario Timer: \t");
Serial.println(variotimer);

//Buttons
Serial.print("Down: \t");
Serial.println(digitalRead(1));
Serial.print("Up: \t");
Serial.println(digitalRead(3));
Serial.print("Set: \t");
Serial.println(digitalRead(2));

//Codetime
Serial.print("Code Time: \t");
Serial.println(codetime);

Serial.println("===========================================");
*/
Editor is loading...
Leave a Comment