//для колеса
int di=50;   //Диаметр колеса

//------для курка------        
int percent=0;
int C=80; //плавность разгона 80
int ADC=0;
//#include <String.h">
//byte calculateCRC;
//---------------------
#include "Adafruit_GFX.h"     // include Adafruit graphics library
#include "Adafruit_ST7735.h"  // include Adafruit ST7735 TFT library 128x160

// ST7735 TFT module connections
#define TFT_RST   7     // TFT RST pin is connected to NodeMCU pin D4 (GPIO2)
#define TFT_CS    8   // TFT CS  pin is connected to NodeMCU pin D3 (GPIO0)
#define TFT_DC    10


float sensorValue = 0;         // Переменная для хранения значения с датчика
unsigned long startTime = 0; // Переменная для хранения времени начала измерения
unsigned long currentTime = 0; // Переменная для хранения текущего времени
float sum = 0; // Переменная для хранения суммы значений

float Kmh=0;//Км час
int ObMin=0;// оборот в минуту 
int crc=0;// Проверка CRC  с контроллера ЕСК

int timS ;
int timM ;
int timH ; 
uint64_t mil;
//byte calcCRC;
// должна соответствовать отправляемой
struct Data {
 
  byte val_0;
  byte val_1;
  byte val_2;
  byte val_3;
  byte val_4;
  byte val_5;
  byte val_6;
  byte val_7;
  //uint16_t PerTaim;
   byte val_8;
  byte val_9;
  byte val_10;
  byte val_11;
  byte val_12;
  byte CRC2;
  //byte val_14;;
} __attribute((packed));
// создаём саму структуру
//Str buf;
    #define PACKET_LENGTH sizeof(Data)           

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(9600);

tft.initR(INITR_BLACKTAB);     // initialize a ST7735S chip, black tab
  tft.fillScreen(ST7735_BLACK);  // fill screen with black color
 //tft.fillRoundRect(10, 10,  85, 220, 7, 0xFF76);//(от левого края, от верха, ширина, высота, радиус углов скругления, цвет RGB656)
  tft.drawFastHLine(0, 33,  tft.width(), ST7735_BLUE);    // draw horizontal blue line at position (0, 44)
  tft.setTextColor(ST7735_WHITE, ST7735_BLACK);     // set text color to white and black background
  tft.setTextSize(1);                 // text size = 1

  /* tft.setTextColor(ST7735_GREEN, ST7735_BLACK);     // установить цвет текста на зеленый и черный фон
 tft.setTextSize(3);
 tft.setCursor(0, 55);
  tft.print("   ");;// для обнаврения строки 
  tft.setCursor(0, 55);
 tft.print("0"); 
 tft.print(" A ");
 tft.setTextSize(2);
  tft.setCursor(0, 79);
  tft.print("   ");;// для обнаврения строки 
  tft.setCursor(0, 79);
 tft.print("0"); 
 tft.print(" kMh ");
*/
}

void loop()  {
  //if(Serial.available()) {
byte firstByte = Serial.read(); // Чтение первого байта
 
 
  if (firstByte == 0x02) {
    Data buf;
    byte* ptr = (byte*)&buf; // Указатель на начало буфера

    *ptr = firstByte; // Запись первого байта в буфер
    ptr++; // Увеличение указателя на 1 байт

    // Чтение остальных байтов
    for (int i = 0; i < sizeof(Data) - sizeof(byte); i++) {
      *ptr = Serial.read(); // Чтение следующего байта
      ptr++; // Увеличение указателя на 1 байт
    }
  
 int PerTaim =(int)(buf.val_8<<8)|(buf.val_9);// Преобразование byte[] в int
//int ObMin;
 if (PerTaim != 0){
ObMin=(60000)/(PerTaim); // Получение оборот мин 
Kmh=(3.14*di)/100*ObMin*60/1000;// Получение Км час
crc=buf.val_0^buf.val_1^buf.val_2^buf.val_3^buf.val_4^buf.val_5^buf.val_6^buf.val_7^buf.val_8^buf.val_9^buf.val_10^buf.val_11^buf.val_12;


// Получаем текущее время
  currentTime = millis();

  // Если прошло менее секунды с момента начала измерения<
  if (currentTime - startTime > 5000) {
    // Считываем значение с датчика и добавляем его к сумме
    sensorValue = Kmh/(3600.0);
    sum += sensorValue;
    startTime=0;
  } else {
    // Если прошло больше секунды, выводим сумму значений и сбрасываем счетчики
   
   // Serial.println(sum);
    //sum = 0;
   // startTime = currentTime;
  }



 
/*int mill=millis();
int Tkm= mill;
//if (Tkm < 1000){
int KmL=Kmh;
int KmL0=KmL;
//delay(500);
int KmL2=KmL+KmL0;
  //Tkm=0;*/

if (crc==buf.CRC2) {
 


    
    float amp =(buf.val_7)/(37.0);//калибровка 37 для тока 

  
   
  tft.setTextColor(ST7735_GREEN, ST7735_BLACK);     // установить цвет текста на зеленый и черный фон
 tft.setTextSize(3);
 tft.setCursor(0, 55);
  tft.print("   ");// для обнаврения строки 
  tft.setCursor(0, 55);
 tft.print(amp); 
 tft.print(" A ");
 
 tft.setTextSize(2);
  tft.setCursor(0, 79);
  //tft.print("   ");// для обнаврения строки 
 tft.print(Kmh); 
 tft.print(" kMh ");
 
 tft.setTextSize(2);
  tft.setCursor(0, 95);
 tft.print(sum); 
 tft.print(" Km ");
 // }
  }}

  
 /*
 
  tft.print(buf.val_1); 
 tft.print(" - ");
  tft.print(buf.val_2); 
 tft.print(" - ");
  tft.print(buf.val_3); 
 tft.print(" - ");
  tft.print(buf.val_4); 
 tft.print(" - ");
  tft.print(buf.val_5); 
 tft.print(" - ");
  tft.print(buf.val_6); 
 tft.print(" - ");
  tft.print(buf.val_7); 
 tft.print(" - ");
  tft.print(buf.val_8); 
 tft.print(" - ");
  tft.print(buf.val_9); 
 tft.print(" - ");
  tft.print(buf.val_10); 
 tft.print(" - ");
  tft.print(buf.val_11); 
 tft.print(" - ");
  tft.print(buf.val_12); 
 tft.print(" - ");
  tft.print(buf.CRC2);*/ 
  
  
}
  else{
while (Serial.available()) Serial.read();}



//if (Serial.readBytes((byte*)&buf, sizeof(buf))&&(buf.sig==0x02)) {//&&*(buf.sig==0x02)
 //  Serial.print(buf.val_9);
//int crc=buf.val_0^buf.val_1^buf.val_2^buf.val_3^buf.val_4^buf.val_5^buf.val_6^buf.val_7^buf.val_8^buf.val_9^buf.val_10^buf.val_11^buf.val_12;
  
 //tft.print(" - ");
 //tft.print(crc);
//}
//else
//{Data buf;
//memset(&buf, 0, sizeof(buf));}



 //--------для курка------
{
  int adcValue = analogRead(A0); // Считывание значения АЦП

  // Преобразование значения АЦП в процентное соотношение от 0% до 100%
  int percent = map(adcValue, 267,840 , 0,991 ); // подправить значения макс мин газа 200/840
if (percent<0)
{
percent=0;
}
  tft.setTextSize(1);
  tft.setCursor(100, 151);
  tft.setTextColor(ST7735_GREEN, ST7735_BLACK);     // установить цвет текста на зеленый и черный фон
 tft.print("     ");// для обнаврения строки 
 tft.setCursor(100, 151);
 tft.print(percent);
 
// if (ADC > 300 ) { C = 800;}
if (ADC < percent) {
  ADC = ADC + C > percent ? percent : ADC + C;
} /*else if (ADC > percent) {
 ADC = ADC - 1000 < percent ? percent : ADC - C;
}*/
else 
{ADC=percent;} 

//int percent = map(adcValue, 0, 1023, 0, 100);
//adcValue=int percent;
  byte buffer[] = {0x01, 0x14, 0x01, 0x02, 0x0F, 0x80, 0x1E, 0x5A, 0x00, 0x01, 0x05, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x05, 0x68};
              //      0   1     2     3      4    5      6     7     8    9     10     11   12    13    14    15    16    17    18    19    
  // Установка значения 18-го и 19-го битов в зависимости от процентного соотношения АЦП
  buffer[16] = ADC >> 8 & 0xFF; // Значение 16-го бита (старшая часть)
  buffer[17] = ADC & 0xFF; // Значение 17-го бита (младшая часть)

  // Расчет CRC8
 //buffer[19] = calculateCRC(buffer, sizeof(buffer) - 1); // Байты 0-18, исключая последний байт CRC8 180-16.17
int CRC=(0xB4)^((char)buffer[16])^((char)buffer[17]);
 

//Serial.println (percent);Serial.println (ADC); //проверить макс мин значение курка газа 200/840 

Serial.print((char)buffer[0]);
Serial.print((char)buffer[1]);
Serial.print((char)buffer[2]);
Serial.print((char)buffer[3]);
Serial.print((char)buffer[4]);
Serial.print((char)buffer[5]);
Serial.print((char)buffer[6]);
Serial.print((char)buffer[7]);
Serial.print((char)buffer[8]);
Serial.print((char)buffer[9]);
Serial.print((char)buffer[10]);
Serial.print((char)buffer[11]);
Serial.print((char)buffer[12]);
Serial.print((char)buffer[13]);
Serial.print((char)buffer[14]);
Serial.print((char)buffer[15]);
Serial.print((char)buffer[16]);
Serial.print((char)buffer[17]);
Serial.print((char)buffer[18]);
Serial.print ((char)CRC); // Добавление CRC8 в последний байт
//Serial.print((char)buffer[19]);

 // delay(100);
  //----------------------------------------------------------------
}
/*String c2d (unsigned long i){ // convert2digit - добавляю ноль перед числом до 10 и преобразовываю в строку
  String str = (String)i;
  if (i < 10)  str = '0' + str; 
  return str;
}*/

 //------------------------DISP----------------------
/*mil = millis()/1000;
timS = mil;
timM = (timS / 60) % 60;
timH = timS / 3600;
timS = timS % 60;

 // tft.fillRect(0, 25, 256, 256,ST7735_BLACK);// очистка
   //  tft.fillRect(11, 55, 108, 14, ST7735_BLACK);     // нарисовать прямоугольник (стереть день с дисплея)
   // tft.setTextColor(ST7735_CYAN, ST7735_BLACK);     // установить цвет текста на голубой и черный фон
tft.setTextSize(3);
  //tft.setCursor(5, 79);
  tft.setCursor(5, 10);
  tft.setTextColor(ST7735_CYAN, ST7735_BLACK);     // установить цвет текста на желтый и черный фон
  //tft.print("Temperature");
  //tft.println((timH)":"(timM)":"(timS));
  tft.print(timH);  //время на диспл
  tft.print(":"); //пробел
  tft.print(timM);  //время на диспл
  tft.print(":"); //пробел
  tft.print(timS);  //время на диспл

*/


tft.setTextSize(3);
tft.setCursor(0, 7);
tft.setTextColor(ST7735_CYAN, ST7735_BLACK);     // установить цвет текста на желтый и черный фон

timS = millis()/1000;
timM = (timS / 60) % 60;
timH = timS / 3600;
timS = timS % 60;
//if (timH < 10)
//timH = 0;
//else{}
tft.print(timH);
tft.print(":"); //пробел
if (timM < 10)
tft.print(0);
else{}
tft.print(timM);
tft.print(":"); //пробел
if (timS < 10)
tft.print(0);
else{}
tft.print(timS);
//--------------------------------------------------------------


 

//tft.print("");
tft.setCursor(0, 150);
//tft.fillRect(0, 115, 120, 128,ST7735_BLACK);//
//tft.fillRect(0, 115, 120, 128,ST7735_BLACK);//очистка 
tft.setTextColor(ST7735_RED, ST7735_BLACK);
//tft.print("");
tft.setTextSize(1);
tft.print("             ");
tft.setCursor(0, 150);
tft.print(ADC); 
tft.print("---");
 tft.print(crc);

//tft.setTextSize(3);
//tft.print("C'");
    //Serial.print("Temperature = ");//датчик 1820
   // Serial.print(temperature_Celsius);//значение темпер//датчик 1820
     // Serial.println(" *C");//датчик 1820

 // delay(20);    // wait 200ms


//-------------------------------------------------------------------------------------

}