#include <DHT.h>
#include <RCSwitch.h> //   http://code.google.com/p/rc-switch/
#include <MQ135.h> //    CO2
#define measurePin  A1  
#define ledPower  12 
#define samplingTime 280
#define deltaTime 40
#define sleepTime 9680
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
float ppm = 0;
#define analogPin A0 
MQ135 gasSensor = MQ135(analogPin); 
#define tempInX 10
#define tempOutX 380 
#define humidityInX 320 
#define humidityOutX 410
#define pressureX 20 
#define ppmX 20
#define pmX 370
#define Y0 0 
#define Y1 5 
#define Y2 125 
#define Y3 230 
#define dotY 125 
#define minusY 115
#define minusXOut 380
#define minusXIn 10
#define minusH 3 
#define minusPicID 2 
#define symbolID 1 
#define statusTimeOut 2200000 
#define updateTimeOut 300000 
#define historyTimeOut 1800000 
#define selectionTimeOut 5000 
#define backLightTimeOut 300000 
#define waveLimit 254
int parameterS[7]; 
byte statusS[7]; 
boolean statusBoolean[7]; 
int historyArray[7][48]; 
boolean drawArray[7]; 
int arrayMax; 
int arrayMin;
byte waveShift; 
float arrayNorm; 
byte count=0; 
byte arrayCounter; 
byte waveCount; 
int splitData[4]; 
byte thousands, hundreds, tens, ones; 
int tempIn, tempOut, humidityIn, humidityOut, pressure;
int symbolX0;
int posX; 
byte tempInStatus, tempOutStatus, humidityInStatus, humidityOutStatus, pressureStatus, ppmStatus, pmStatus; 
byte symbolCount, symbolWidth;
boolean minusIn = false; 
boolean minusOut = false;
byte i = 0; 
unsigned long statusTime, updateTime, historyTime, selectionTime, backLightTime;
String stringToNextion;
byte historyCount;
boolean backLight; 
int weatherData = 0;
int dht22Humidity = 0;
byte buffer[30]; 
byte waveCounter = 0; 
boolean allClear;
byte currentPage = 0; 
byte searchTarget, searchNumber, searchCounter, pageNum, drawCounter, channelToDraw;
byte iconCounter = 0;
#define minusH 3 
#define minusPicID 2 
int axisX[5][7] = {{10, 380, 320, 410, 20, 20, 370}, 
               {0, 0, 0, 0, 0, 0, 0},
               {0, 0, 0, 0, 0, 0, 0},
               {0, 0, 0, 0, 0, 0, 0},
               {0, 0, 0, 0, 0, 0, 0}}; 
int axisY[5][7] = {{115, 115, 5, 5, 5, 230, 230}, 
               {145,0, 0, 0, 0, 0, 0}, 
               {63, 226, 0, 0, 0, 0, 0}, 
               {37, 145, 253, 0, 0, 0, 0 }, 
               {25, 105, 185, 265, 0, 0, 0}}; 
byte symbolW[5][11] = {{25, 15, 30, 25, 30, 30, 25, 30, 25, 30, 5},
                       {11, 6, 12, 12, 14, 13, 12, 13, 12, 12, 3},
                       {11, 6, 12, 12, 14, 13, 12, 13, 12, 12, 3},
                       {11, 6, 12, 12, 14, 13, 12, 13, 12, 12, 3},
                       {11, 6, 12, 12, 14, 13, 12, 13, 12, 12, 3}};
byte numberPic[5] = {1, 3, 3, 3, 3}; 
byte symbolH[5] = {60, 18, 18, 18, 18}; 
#define x2 70 
int trendArray[3][6] = {{0, 0, 0, 0, 0, 0}, 
                        {-5, -3, -1, 1, 3, 5},
                        {0, 0, 0, 0, 0, 0}};
int sumY, sumXY;
byte trendCount;
int trend; 
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
RCSwitch mySwitch = RCSwitch();
void sendToNextion() {
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}
void drawMark(byte mark, byte markNum) {
int markX;
if (allClear == true) {
  allClear = false;
}
markX = axisX[0][markNum];
if (markNum == 1 || markNum == 3 || markNum == 6) {
  markX = 475;
} 
if (markNum == 0 || markNum == 4 || markNum == 5) {
  markX = 0;
}
if (markNum == 2) {
  markX = markX - 15;
}
    stringToNextion = String("fill ");
    stringToNextion = stringToNextion + String(markX); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(axisY[0][markNum]+30); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("5");
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("30");
    stringToNextion = stringToNextion + String(",");
if (mark == 1) {
    stringToNextion = stringToNextion + String("RED"); 
    
}
if (mark == 0) {
    stringToNextion = stringToNextion + String("BLACK"); 
    
}
    
    Serial.print(stringToNextion);
    sendToNextion();
  
}
void clearSelection() {
  for (byte jj = 0; jj < 7; jj++) {
   if (drawArray[jj] == true) {
    drawArray[jj] = false;
    drawMark(0, jj);
   }
  }
  allClear = true; 
  waveCounter = 0;
}
void updateHistory() {
mySwitch.disableReceive();
for (arrayCounter = 0; arrayCounter < 7; arrayCounter++) {
  
  if (statusBoolean[arrayCounter] == true) { 
    for (i = 47; i > 0; i--) {
      historyArray[arrayCounter][i] = historyArray[arrayCounter][i-1]; 
    }
    historyArray[arrayCounter][0] = parameterS[arrayCounter]; 
  }
  }
for (arrayCounter = 0; arrayCounter < 7; arrayCounter++) {
 for (i = 0; i < 47; i++) {
   
  }
 
}
mySwitch.enableReceive(0);
  
}
void drawTrend(byte arrayToTrend) {
int markX;
markX = axisX[0][arrayToTrend];
if (arrayToTrend == 1 || arrayToTrend == 3 || arrayToTrend == 6) {
  markX = 472;
} 
if (arrayToTrend == 0 || arrayToTrend == 4 || arrayToTrend == 5) {
  markX = 0;
}
if (arrayToTrend == 2) {
  markX = markX - 15;
}
    stringToNextion = String("xpic ");
    stringToNextion = stringToNextion + String(markX); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(axisY[0][arrayToTrend]); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("8"); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("18"); 
    stringToNextion = stringToNextion + String(",");
if (trend > 0) {
    stringToNextion = stringToNextion + String("0"); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
  
}
if (trend < 0) {
    stringToNextion = stringToNextion + String("8"); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
    
}
if (trend == 0) {
    stringToNextion = stringToNextion + String("16"); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
 
}
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("5"); 
    
    Serial.print(stringToNextion);
    sendToNextion();
 
}
void splitRoutine(int input) {
input = abs(input); 
for (count = 0; count < 4; count++) {
  splitData[count] = 0; 
}
count = 0;
if (input > 9999) { 
  count = 5;
} else {
if (input > 999) { 
  splitData[3] = input/1000;
  input = input - splitData[3]*1000;
  count = 4;
}
if (input > 99) { 
  splitData[2] = input/100;
  input = input - splitData[2]*100;
  if (count == 0) {
    count = 3;
  
  }
}
if (input > 9) { 
  splitData[1] = input/10;
  input = input - splitData[1]*10;
  if (count == 0) {
    count = 2;
  
  }
} 
if (input < 10) {
  splitData[0] = input;
  if (count == 0) {
    count = 1;
  
  }
}
}
}
void drawRoutine(byte page, int value, byte type, int drawX, int drawY) { 
mySwitch.disableReceive();  
  
  boolean minusSign = false;
  splitRoutine(value);  
if (page == 0) { 
  if (type == 1) { 
    drawX = 470 - count*30 - 5; 
    if (count == 1) {
      drawX = drawX - 30; 
    }
  }
  if (type == 6) { 
    drawX = 470 - count*30 - 5; 
    if (count == 1) {
      drawX = drawX - 30;
    }
  }
}
  int posX = drawX;
 if (value < 0) {
  minusSign = true;
 }
 
 if (count < 5) { 
  if ((count == 1) && ((type == 0) || (type  == 1) || (type  == 6))) { 
  
    
    stringToNextion = String("xpic ");
    stringToNextion = stringToNextion + String(drawX); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(drawY); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(symbolW[page][0]);
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(symbolH[page]);
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String("0"); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(numberPic[page]);
   
   
    Serial.print(stringToNextion);
    sendToNextion();
    drawX = drawX + symbolW[page][0]; 
      
   } 
   for (byte ii = count; ii > 0; ii--) { 
    if ((ii == 1) && ((type == 0) || (type == 1) || (type == 6))) { 
      stringToNextion = String("xpic ");
      stringToNextion = stringToNextion + String(drawX); 
      stringToNextion = stringToNextion + String(",");
      stringToNextion = stringToNextion + String(drawY); 
      stringToNextion = stringToNextion + String(",");
      stringToNextion = stringToNextion + String(symbolW[page][10]);
      stringToNextion = stringToNextion + String(",");
      stringToNextion = stringToNextion + String(symbolH[page]);
      stringToNextion = stringToNextion + String(",");
      if (page == 0) {
        stringToNextion = stringToNextion + String("265"); 
      } else {
        stringToNextion = stringToNextion + String("118"); 
      }
      stringToNextion = stringToNextion + String(","); 
      stringToNextion = stringToNextion + String("0"); 
      stringToNextion = stringToNextion + String(",");
      stringToNextion = stringToNextion + String(numberPic[page]); 
     
     
      Serial.print(stringToNextion);
      sendToNextion();
      drawX = drawX + symbolW[page][10]; 
    } 
    
    symbolX0 = 0; 
    for (symbolCount = 0; symbolCount < (splitData[ii-1]);symbolCount++) { 
      symbolX0 = symbolX0 + symbolW[page][symbolCount];
    }
    stringToNextion = String("xpic ");
    stringToNextion = stringToNextion + String(drawX); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(drawY); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(symbolW[page][splitData[ii-1]]);
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(symbolH[page]);
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(symbolX0); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(numberPic[page]);
   
  
    Serial.print(stringToNextion);
    sendToNextion();
    drawX = drawX + symbolW[page][splitData[ii-1]];
  }
  if (minusSign == true) {
    
    
    stringToNextion = String("xpic ");
    stringToNextion = stringToNextion + String(posX); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(drawY-8); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(drawX - posX);
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(minusH); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(0); 
    stringToNextion = stringToNextion + String(","); 
    stringToNextion = stringToNextion + String("0"); 
    stringToNextion = stringToNextion + String(",");
    stringToNextion = stringToNextion + String(minusPicID);
 
    Serial.print(stringToNextion);
    sendToNextion();
    
  }
  
 } 
  mySwitch.enableReceive(0);
}         
void getMinMax(byte arrayToMax, byte maxCount) {
  
byte getMaxCount = 0;
arrayMax = historyArray[arrayToMax][getMaxCount]; 
arrayMin = historyArray[arrayToMax][getMaxCount]; 
for (byte getMaxCount = 0; getMaxCount < maxCount; getMaxCount++) { 
  
  if (historyArray[arrayToMax][getMaxCount+1] > arrayMax){ 
    arrayMax = historyArray[arrayToMax][getMaxCount+1];
  }
  if (arrayMin > historyArray[arrayToMax][getMaxCount+1]){ 
    arrayMin = historyArray[arrayToMax][getMaxCount+1];
  }
  
}
 
}      
void getTrend(byte arrayToTrend) {
mySwitch.disableReceive();
getMinMax(0, 6); 
for (trendCount = 0; trendCount < 6; trendCount++) {
  if (arrayMin < 0) {
    trendArray[0][trendCount] = historyArray[arrayToTrend][5-trendCount] + abs(arrayMin); 
  } else {
    trendArray[0][trendCount] = historyArray[arrayToTrend][5-trendCount];
  }
}
sumY = 0;
sumXY = 0;
for (trendCount = 0; trendCount < 7; trendCount++) {
  sumY = sumY + trendArray[0][trendCount];
  sumXY = sumXY + trendArray[0][trendCount]*trendArray[1][trendCount];
}
trend = (int) (sumY/10 + (sumXY/x2)*trendArray[1][5]) - (sumY/10 + (sumXY/x2)*trendArray[1][0])+0.5;
drawTrend(arrayToTrend);
mySwitch.enableReceive(0);
}
void reDraw() {
 mySwitch.disableReceive();
 
 Serial.print("page 0");
 sendToNextion();
 
 
 
 
 
  for (i = 0; i < 7; i++) {
   
   if (statusBoolean[i] == true) { 
    drawRoutine(currentPage, parameterS[i], i, axisX[currentPage][i], axisY[currentPage][i]);
    
    if (historyCount > 5) {
      getTrend(i);
    }
   }
    
  }
 mySwitch.enableReceive(0);
}
void getNorm() {
arrayNorm = 1.00; 
  arrayNorm = abs(arrayMax - arrayMin);
  
    arrayNorm = waveLimit/arrayNorm; 
  
}
void drawHistory(byte arrayCounter, byte waveCount){
mySwitch.disableReceive();
byte tC01 = 0;
byte tC02 = 0; 
int interPoint, lineMulti;
int justPoint;
  byte channelCount = 0; 
      getMinMax(arrayCounter, 47); 
 
 
      getNorm();
      
      if (currentPage == 2) {
         arrayNorm = arrayNorm*0.5;      
      }
      if (currentPage == 3) {
         arrayNorm = arrayNorm*0.3;      
      }
      if (currentPage == 4) {
         arrayNorm = arrayNorm*0.2;
      }
 
     
     
      stringToNextion = String("add "); 
      stringToNextion = stringToNextion + String(waveCount); 
      stringToNextion = stringToNextion + String(",");
      stringToNextion = stringToNextion + String(channelCount); 
      stringToNextion = stringToNextion + String(",");
      if (arrayMin < 0) {
        justPoint = (int) (historyArray[arrayCounter][tC01] + abs(arrayMin))*arrayNorm + 0.5;
        stringToNextion = stringToNextion + String(justPoint); 
      } else {
        justPoint = (int) historyArray[arrayCounter][tC01]*arrayNorm + 0.5;
        stringToNextion = stringToNextion + String(justPoint); 
      }
      Serial.print(stringToNextion);
      
      
      sendToNextion(); 
                
        for (tC01 = 0; tC01 < 46; tC01++) { 
          
          lineMulti = (historyArray[arrayCounter][tC01+1] - historyArray[arrayCounter][tC01])/9; 
          
          if (arrayMin < 0) {
            justPoint = (int) historyArray[arrayCounter][tC01] + abs(arrayMin) + lineMulti+0.5;
            interPoint = justPoint;
          } else {
            justPoint = (int) historyArray[arrayCounter][tC01] + lineMulti + 0.5;
            interPoint = justPoint;
          }
          
          for (tC02 = 0; tC02 < 7; tC02++) { 
            stringToNextion = String("add "); 
            stringToNextion = stringToNextion + String(waveCount); 
            stringToNextion = stringToNextion + String(",");
            stringToNextion = stringToNextion + String(channelCount); 
            stringToNextion = stringToNextion + String(",");
            justPoint = (int) interPoint*arrayNorm;
            stringToNextion = stringToNextion + String(justPoint);
            interPoint = (int) interPoint + lineMulti;
            Serial.print(stringToNextion);   
           
            sendToNextion();                      
          }
          stringToNextion = String("add "); 
          stringToNextion = stringToNextion + String(waveCount); 
          stringToNextion = stringToNextion + String(",");
          stringToNextion = stringToNextion + String(channelCount); 
          stringToNextion = stringToNextion + String(",");
          if (arrayMin < 0) {
            justPoint = (int) (historyArray[arrayCounter][tC01+1] + abs(arrayMin))*arrayNorm + 0.5;
            stringToNextion = stringToNextion + String(justPoint); 
          } else {
            justPoint = (int) historyArray[arrayCounter][tC01+1]*arrayNorm + 0.5;
            stringToNextion = stringToNextion + String(justPoint); 
          }
          
          Serial.print(stringToNextion);
         
          
          sendToNextion();                                  
        }
    
 mySwitch.enableReceive(0);   
  }
  
void drawIcon(int where, byte what) {
stringToNextion = String("xpic ");
stringToNextion = stringToNextion + String("0"); 
stringToNextion = stringToNextion + String(",");
stringToNextion = stringToNextion + String(where-3); 
stringToNextion = stringToNextion + String(",");
stringToNextion = stringToNextion + String(80); 
stringToNextion = stringToNextion + String(",");
stringToNextion = stringToNextion + String(30);
stringToNextion = stringToNextion + String(",");
stringToNextion = stringToNextion + String(what*80); 
stringToNextion = stringToNextion + String(","); 
stringToNextion = stringToNextion + String("0"); 
stringToNextion = stringToNextion + String(",");
stringToNextion = stringToNextion + String(4);
Serial.print(stringToNextion);
sendToNextion();
  
}
void toPage(byte pageNum) {
mySwitch.disableReceive();
currentPage = pageNum;
  String stringToNextion = String("page ");
  stringToNextion = stringToNextion + String(pageNum);
 
  Serial.print(stringToNextion);
  sendToNextion();
if (pageNum == 0) {
  clearSelection();
  reDraw();
}
  if (pageNum > 0) {
    
    if (pageNum == 1 && waveCounter > 1) { 
 
      getMinMax(searchCounter-1, 47); 
  
  
      drawRoutine(pageNum, arrayMax, searchCounter-1, 0, 117); 
      drawIcon(145, searchCounter-1);
      drawRoutine(pageNum, arrayMin, searchCounter-1, 0, 185); 
      drawHistory(searchCounter-1, 1); 
     } else {
              
              iconCounter = 0;
              for (drawCounter = 0; drawCounter < 7; drawCounter++) {
                if (drawArray[drawCounter] == true) {
        
       
      
                  getMinMax(drawCounter, 39); 
      
     
                  drawRoutine(pageNum, arrayMax, drawCounter, 0, axisY[pageNum][iconCounter]-22);   
                  drawIcon(axisY[pageNum][iconCounter], drawCounter);
                  drawRoutine(pageNum, arrayMin, drawCounter, 0, axisY[pageNum][iconCounter]+35); 
                  iconCounter++;
                }
            }      
              channelToDraw = 1; 
              for (drawCounter = 0; drawCounter < 7; drawCounter++) { 
                if (drawArray[drawCounter] == true) {
                  drawHistory(drawCounter, channelToDraw);
           
                  channelToDraw++;
                 }
              }
      }
    }
    
  mySwitch.enableReceive(0);
}
void setup() {
  pinMode(ledPower,OUTPUT);
 
 pinMode(4, OUTPUT);
 digitalWrite(4, HIGH);
 
  currentPage = 0;
  allClear = true;
  historyCount = 0; 
  backLight = true; 
  
 for (i = 0; i < 7; i++) {
  parameterS[i] = 0;
  statusS[i] = 1;
 }
for (arrayCounter = 0; arrayCounter < 7; arrayCounter++) {
 for (i = 0; i<48; i++) {
  historyArray[arrayCounter][i]=0;
 }
}
 
 statusTime = millis();
 updateTime = millis();
 historyTime = millis();
 backLightTime = millis();
 Serial.begin(9600);
  Serial.print("baud=57600");
  sendToNextion();
 Serial.end();
 Serial.begin(57600);
 Serial.print("baud=57600");
 sendToNextion();
 
 
 dht.begin();
 mySwitch.enableReceive(0);
 delay(2000);
 Serial.print("page 0");
 sendToNextion();
 
 
 reDraw();
}
void loop() {
   if (mySwitch.available()) { 
    int value = mySwitch.getReceivedValue();
    if (value != 0) {
    
      if (mySwitch.getReceivedValue() / 100000 == 161) {
        weatherData = mySwitch.getReceivedValue() - 16100000;
        if (weatherData > 10000) { 
          parameterS[3] = (weatherData - 10000)/10;
          statusS[3] = statusS[3]+1;   
          statusBoolean[3] = true;  
        }
        else { 
          if (weatherData > 1000) { 
            parameterS[1] = -(weatherData - 1000);
            minusOut = true;
          }
          else { 
            parameterS[1] = weatherData;
            minusOut = false;
          }
        }
          statusS[1] = statusS[1]+1;
          statusBoolean[1] = true;
      }
      if (mySwitch.getReceivedValue() / 10000 == 1210) {
        parameterS[4] = (mySwitch.getReceivedValue() - 12100000) / 1.33; 
        statusS[4] = statusS[4]+1;   
        statusBoolean[4] = true;   
        
      }
      if (mySwitch.getReceivedValue() / 100000 == 131) {
        weatherData = mySwitch.getReceivedValue() - 13100000;
        if (weatherData > 1000) { 
          parameterS[0] = -(weatherData - 1000);
          minusIn = true;
        }
        else { 
          parameterS[0] = weatherData;
          minusIn = false;
        }
          statusS[0] = statusS[0]+1;
          statusBoolean[0] = true;
      }
      if (mySwitch.getReceivedValue() / 10000 == 1212) {
        parameterS[2] = (mySwitch.getReceivedValue() - 12120000); 
        statusS[2] = statusS[2]+1;   
        statusBoolean[2] = true;   
        
      }
      if (mySwitch.getReceivedValue() / 10000 == 1213) {
        parameterS[5] = (mySwitch.getReceivedValue() - 12130000); 
        statusS[5] = statusS[5]+1;   
        statusBoolean[5] = true;   
        
      }      
      if (mySwitch.getReceivedValue() / 10000 == 1214) {
        parameterS[6] = (mySwitch.getReceivedValue() - 12140000); 
        statusS[6] = statusS[6]+1;   
        statusBoolean[6] = true;   
        
      } 
    }
    mySwitch.resetAvailable();
    
  }   
  
if (currentPage == 0) {
  if ((millis() - selectionTime) > selectionTimeOut) { 
    if (allClear == false) {
      clearSelection();
    }
  }
 }
  if (Serial.available())
  {
    bool moretocome = true;
    int endcount = 0;
    int bytesread = 0;
    byte inbyte;
    
    while (moretocome)
    {
      inbyte = Serial.read();
        delay(2);
        
      if (inbyte == 0xFF)
      {
        endcount++;
        if (endcount == 3)
        {
          moretocome = false;
          
        }
      }
      else
      {
        endcount = 0;
      }
      buffer[bytesread] = inbyte;
      bytesread++;
    }
    for (int x = 0; x < bytesread; x++)
    {
      
      
    }
    
    
  }
  if (buffer[0] == 101) { 
   backLightTime = millis(); 
   if (backLight == false) { 
    
    Serial.print("dim=100"); 
    sendToNextion();
    backLight = true; 
   } else { 
    
    if (buffer[1] == 0) { 
      selectionTime = millis();
      if (buffer[2] < 8) { 
      if (waveCounter < 4) { 
        if (drawArray[buffer[2]-1] == false) { 
          drawArray[buffer[2]-1] = true; 
          drawMark(1, buffer[2]-1);
          waveCounter = waveCounter + 1; 
     
     
        } else {
          drawArray[buffer[2]-1] = false; 
          drawMark(0, buffer[2]-1);
          if (waveCounter > 0) {
            waveCounter = waveCounter - 1;
          }
     
     
        }
      } else { 
        if (drawArray[buffer[2]-1] == true) { 
          drawArray[buffer[2]-1] = false; 
          drawMark(0, buffer[2]-1);
          waveCounter = waveCounter - 1; 
     
     
        }
      }
    } else { 
        currentPage = waveCounter;
        toPage(waveCounter);    
      }
    }
    else { 
      if (currentPage > 1) { 
        if (buffer[2] == 5) {
          toPage(0);
        }
      }
      if (currentPage == 1) { 
        if (buffer[2] == 5) {
          if (waveCounter == 1) {
            toPage(0);
          } else {
            toPage(waveCounter); 
          }
        }
      }
      if (currentPage == 1) { 
        if (buffer[2] == 6) {
          toPage(0);
        }
      }      
      
      
    if (currentPage > 1) { 
      if (buffer[2] > 5) { 
   
   
   
        searchTarget = buffer[2] - 5; 
        searchNumber = 0;
        searchCounter = 0;
   
        while ((searchCounter < 7) && (searchNumber < searchTarget)) {
          if (drawArray[searchCounter] == true) {
            searchNumber++;
          }
          searchCounter++;
        }
        
   
        toPage(1); 
      }
    }
      
     }
    }
  } 
buffer[0] = 0;
if ((millis() - statusTime) > statusTimeOut) {
 
 for (i = 0; i < 7; i++) { 
  
    if (statusS[i] == 0) {statusBoolean[i] = false;
    
    }
    statusS[i] = 0; 
 }
  statusTime = millis();
  
}
if (currentPage == 0) { 
 
if ((millis() - updateTime) > updateTimeOut) {
  reDraw();
  updateTime = millis();
 }
 
 
}
if ((millis() - backLightTime) > backLightTimeOut) {
 if (backLight == true) {
  backLight = false;
  
  
  
  currentPage = 0;
  clearSelection();
  reDraw();
  Serial.print("dim=15");
  sendToNextion();
 }
  
 }
if ((millis() - historyTime) > historyTimeOut) {
  updateHistory();
    historyCount++;
    
 
  historyTime = millis();
  }
}