#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();
}
}