//для колеса
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
//-------------------------------------------------------------------------------------
}