#include <Keypad.h>
#include "RTClib.h"
//#include <Wire.h>
#include <Adafruit_MPU6050.h>
//#include <Adafruit_Sensor.h>
RTC_DS1307 rtc;
#include <LiquidCrystal_I2C.h>
//#include "SdFat.h"
//SdFat sd;
#include "WString.h"
//#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 10
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char Rate_of_works [3][10] = {"easy", "^ aver.", "hard"};
char Mode_of_Work_str [5][20] = {"CU3OD Bb|K/|, HACTP.",
"CU3OD BK/|, nOUCK...",
"O4ar O6HAP., TYWEHUE",
" CU3OD BK/|, Bb|XOg ",
"CU3OD Bb|K/|, OTgb|X"};
char Mode_of_Work_Menu [5][20] = {{"1:nOUCK... 3:nEPEXOg"},
{"2:O4ar O6H 3:BO3BPAT"},
{" 3:BO3BPAT "},
{" 4:Bb|K/| CU3OD "},
{"0:CHA4A/|A 1:nOBTOP"}};
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
Adafruit_MPU6050 mpu;
const uint8_t ROWS PROGMEM = 4;
const uint8_t COLS PROGMEM= 3;
const float BETA PROGMEM= 3950; // should match the Beta Coefficient of the thermistor
float Pp = 4.9; // Резервное давление, МПа/атм
float Vb = 6.8; // Объем баллона, л
float PBo [5] = {888, 888, 888, 888, 888}; // Наименьшее давление для возвращения, МПа/атм
const float Kpa [] PROGMEM= {0.287, 0.575, 0.862}; // Расход давления в баллонах, МПа/мин, тяжесть "легкая","выше средней", "тяжелая"
const float Kat [] PROGMEM= {2.93, 5.86, 8.79}; // Расход давления в баллонах, атм/мин, тяжесть "легкая","выше средней", "тяжелая"
const float MPa_div_at PROGMEM= 0.098; //Коэффициент перевода атм в МПа
const float Pnom PROGMEM= 29.4; // Номинальное давление в баллоне, МПа
const int Qlv [] PROGMEM= {20, 40, 60}; // Расход воздуха на легочную вентиляцию, л/мин, тяжесть "легкая","выше средней", "тяжелая"
int KQ_now = 1; // Указатель индекса коэффициентов Kpa и Kat, Qlv, Rate_of_works по умолчанию 1 (для Qлв=40, "выше средней" тяжести)
int pmin = 0; // Указатель индекса минимального давления
boolean MPa_at = 0; // Единица измерения давления: 0 - МПа, 1 - атм, кгс/см2)
boolean Buz_on = 1; // Звук включен/выключен: 0 - выкл, 1 - вкл
int second = 0;
int Mode_Menu = 0; // Режим меню - 0 - настройки, 1 - работа
int Inv_Menu = 0; // Режим отображения меню в рабочих режимах: 0 - подсказка, 1 - название режима
int Mode_of_Work = 0; // Режим работы СИЗОД: 0 - выключен; 1 - включен, поиск очага/пострадавшего; 2 - включен, очаг/пострадавший обнаружен, идет работа по тушению/спасению; 3 - включен, идет возвращение на свежий воздух
int Mode_of_Work_prev = 0; // Предшествующий данному режим работы СИЗОД
int Hour_of_TH [5]= {88, 88, 88, 88, 88};
int Minute_of_TH [5]= {88, 88, 88, 88, 88};
int Minute_of_tk [5]= {88, 88, 88, 88, 88};
int Second_of_tk [5]= {88, 88, 88, 88, 88};
int x_acceleration, x_acceleration_new;
int y_acceleration, y_acceleration_new;
int z_acceleration, z_acceleration_new;
word Time_of_Mode [5] = {0, 0, 0, 0, 0};
const char keys[ROWS][COLS] = {{ '1', '2', '3'},
{ '4', '5', '6'},
{ '7', '8', '9'},
{ '-', '0', '+'}};
uint8_t colPins[COLS] = { 5, 4, 3}; // Pins connected to C1, C2, C3
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
float Pgb [5][3] = {{888, 888, 888},
{888, 888, 888},
{888, 888, 888},
{888, 888, 888},
{888, 888, 888}}; // Текущее (прогнозируемое) давление в баллонах звена в режиме работы, [МПа/атм], 0 - настройка, 1 - вкл движение к очагу, 2 - очаг обнаружен, 3 - возвращение, 4 - выключен
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
float Value_Input (int Units, int Xpos, int Ypos, int Number_of_Symbols, int Point_Pos) //Units - ед. изм. (0 - МПа, 1 - атм), Xpos (поз. курсора строки), Ypos (поз. курсора столбца), Number_of_Symbols (число вводимых символов), Point_Pos (положение правающей запятой)
{
char key_1 = NO_KEY;
String s;
for (int j=0; j < (Number_of_Symbols - Units); j++)
{
lcd.setCursor((j+Xpos),Ypos);
lcd.blink();
do
key_1 = keypad.getKey();
while (key_1 == NO_KEY);
lcd.noBlink();
lcd.print(key_1);
s += key_1;
if ((j == Point_Pos - 2) && Units == 0)
{
j = Point_Pos - 1;
s += '.';
lcd.print('.');
}
}
float Value = s.toFloat();
if (Value < 10)
{
s.substring(1, 3);
Value = s.toFloat();
}
return Value;
}
void LCD_Print_Number(float Number, int Units)
{
if (Number == 888)
if (Units == 0) lcd.print F("__._");
else lcd.print F("___ ");
else
{
if ((Number < 10 && Units == 0) || (10 < Number && Number < 100 && Units == 1)) lcd.print('0');
if (Number < 10 && Units == 1) lcd.print F("00");
lcd.print(Number,!Units);
if (Units == 1) lcd.print(' '); // Очищаем символы на дисплее после переключения меню
// else lcd.print F(" ");
}
}
void setup()
{
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println F("Couldn't find RTC");
Serial.flush();
abort();
}
while (!mpu.begin(0x69)) {
Serial.println("MPU6050 not connected!");
delay(1000);
}
/*if (!sd.begin(CS_PIN, SPI_SPEED)) {
if (sd.card()->errorCode()) {
Serial.println F("SD initialization failed.");
} else if (sd.vol()->fatType() == 0) {
Serial.println F("Can't find a valid FAT16/FAT32 partition.");
} else {
Serial.println F("Can't determine error type");
}
return;
}
Serial.println F(" Files on card:");
Serial.println F(" Size Name");
sd.ls(LS_R | LS_SIZE);*/
lcd.init(); // initialize the lcd
lcd.backlight();
DateTime now = rtc.now();
Hour_of_TH [Mode_of_Work] = now.hour();
Minute_of_TH [Mode_of_Work] = now.minute();
for (int i=0; i<3; i++)
Pgb[Mode_of_Work][i] = Pnom; //Начальные давления в баллонах принять номинальными
}
sensors_event_t a, g, temp;
void loop()
{
int count = 0;
mpu.getEvent(&a, &g, &temp);
x_acceleration = g.gyro.x;
y_acceleration = g.gyro.z;
z_acceleration = g.gyro.z;
delay(10);
mpu.getEvent(&a, &g, &temp);
x_acceleration_new = g.gyro.x;
y_acceleration_new = g.gyro.z;
z_acceleration_new = g.gyro.z;
if (
(abs(x_acceleration_new-x_acceleration)>0.6)||
(abs(y_acceleration_new-y_acceleration)>0.6)||
(abs(z_acceleration_new-z_acceleration)>0.6)||
(count>30000)
)
{
Serial.println("1");
tone(2, 2000, 250);
}
DateTime now = rtc.now();
lcd.setCursor(0,0);
if (now.day()<10) lcd.print('0');
lcd.print(now.day(), DEC);
lcd.print('.');
if (now.month()<10) lcd.print('0');
lcd.print(now.month(), DEC);
lcd.print('.');
lcd.print(now.year()-2000, DEC);
lcd.print(' ');
if (now.hour()<10) lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute()<10) lcd.print('0');
lcd.print(now.minute(), DEC);
// second = now.second();
if (second == now.second()) // Мигание ":" в часах
{
lcd.setCursor(11,0);
lcd.print(':');
}
else
{
lcd.setCursor(11,0);
lcd.print(' ');
Time_of_Mode [Mode_of_Work] += 1;
if (Mode_of_Work !=0 && Mode_of_Work !=4)
if (Second_of_tk [Mode_of_Work] > 0)
{
Second_of_tk [Mode_of_Work] -= 1;
if (Buz_on == 1) tone(2, 1000, 25); // Звук 2000 Гц 0,025 с
}
else
{
if (Minute_of_tk [Mode_of_Work] > 0)
{
Minute_of_tk [Mode_of_Work] -= 1;
Second_of_tk [Mode_of_Work] = 59;
if (Buz_on == 1) tone(2, 1000, 100); // Звук 1000 Гц 0,1 с
}
for (int i=0; i<3; i++)
if (MPa_at == 0)
{
if (Pgb [Mode_of_Work][i] > Pp)
Pgb [Mode_of_Work][i] = Pgb[(Mode_of_Work_prev)][i] - (float)Time_of_Mode [Mode_of_Work]/60*Kpa[KQ_now];
}
else
if (Pgb [Mode_of_Work][i] > Pp)
Pgb [Mode_of_Work][i] = Pgb[(Mode_of_Work_prev)][i] - (float)Time_of_Mode [Mode_of_Work]/60*Kat[KQ_now];
}
second = now.second(); // считываем секунды, чтобы отслеживать изменение в следующем проходе
if (Mode_Menu != 0)
{
lcd.setCursor(0,3);
if (Time_of_Mode[Mode_of_Work] % 5 == 0)
{
if (Inv_Menu == 0)
for (int i=0; i<20; i++) lcd.print(Mode_of_Work_Menu[Mode_of_Work][i]);
else
for (int i=0; i<20; i++)
lcd.print(Mode_of_Work_str [Mode_of_Work][i]);
Inv_Menu = !Inv_Menu;
}
}
}
lcd.setCursor(14,0);
lcd.print(' ');
int analogValue = analogRead(A3);
int celsius = (int) 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
if (celsius >= 0)
lcd.print('+');
lcd.print(celsius);
if (celsius > -10 && celsius < 10)
lcd.print(' ');
lcd.print F("`C");
char key = keypad.getKey();
if (Mode_Menu == 0)
{
for (int i=0; i<3; i++)
{
lcd.setCursor(0,(i+1));
lcd.print(i+1);
lcd.print F(": P");
lcd.print(i+1);
lcd.print('=');
LCD_Print_Number(Pgb[Mode_Menu][i], MPa_at);
}
lcd.setCursor(10,1);
lcd.print F(" 4: Pp=");
if (10 > Pp && MPa_at == 1) lcd.print('0');
lcd.print(Pp,!MPa_at);
if (MPa_at == 1) lcd.print(' ');
lcd.setCursor(10,2);
lcd.print F(" 5: Vb=");
lcd.print(Vb, 1);
lcd.setCursor(10,3);
lcd.print F(" 6: Qlv=");
lcd.print(Qlv [KQ_now]);
if (Mode_of_Work == 0)
{
if (key == '1')
Pgb[0][0] = Value_Input (MPa_at, 6, 1, 4, 3);
if (key == '2')
Pgb[0][1] = Value_Input (MPa_at, 6, 2, 4, 3);
if (key == '3')
Pgb[0][2] = Value_Input (MPa_at, 6, 3, 4, 3);
if (key == '4')
Pp = Value_Input (MPa_at, 17, 1, 3, 2);
if (key == '5')
Vb = Value_Input (0, 17, 2, 3, 2);
if (key == '6')
{
char key_1 = NO_KEY;
lcd.setCursor(18,3);
lcd.blink();
long j = millis ();
do
{
key_1 = keypad.getKey();
if (key_1 == '+' && KQ_now<2) KQ_now +=1;
if (key_1 == '-' && KQ_now>0) KQ_now -=1;
if (key_1 == '+' || key_1 == '-')
{
j = millis ();
lcd.print (Qlv [KQ_now]);
lcd.setCursor(18,3);
}
}
while ((key_1 == NO_KEY || key_1 == '+' || key_1 == '-') && (millis() - j) <5000);
lcd.noBlink();
}
if (key == '7')
{
if (Buz_on == 1) tone(2, 2000, 250); // Звук 2000 Гц 0,25 с
MPa_at = !MPa_at;
for (int i=0; i<3; i++)
{
if (MPa_at == 0) Pgb[0][i] *= MPa_div_at;
else Pgb[0][i] /= MPa_div_at;
}
if (MPa_at == 0) Pp *= MPa_div_at;
else Pp /= MPa_div_at;
}
}
if (key == '8') Buz_on = !Buz_on;
}
if (Mode_Menu == 1)
{
lcd.setCursor(0,1);
lcd.print F("TBk=");
if (Hour_of_TH [Mode_Menu] == 88 && Minute_of_TH [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Hour_of_TH [Mode_of_Work] < 10) lcd.print('0');
lcd.print(Hour_of_TH [Mode_Menu], DEC);
lcd.print(':');
if (Minute_of_TH [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_TH [Mode_Menu], DEC);
}
lcd.print F(" P");
lcd.print(pmin+1);
lcd.print F("m=");
LCD_Print_Number(Pgb [Mode_Menu][pmin], MPa_at);
// }
lcd.setCursor(0,2);
lcd.print F("tBo=");
if (Second_of_tk [Mode_Menu] == 88 && Minute_of_tk [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Minute_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_tk [Mode_Menu], DEC);
lcd.print(':');
if (Second_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Second_of_tk [Mode_Menu], DEC);
}
lcd.print F(" PBo=");
LCD_Print_Number(PBo[Mode_Menu], MPa_at);
}
if (Mode_Menu == 2)
{
lcd.setCursor(0,1);
lcd.print F("TO6=");
if (Hour_of_TH [Mode_Menu] == 88 && Minute_of_TH [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Hour_of_TH [Mode_of_Work] < 10) lcd.print('0');
lcd.print(Hour_of_TH [Mode_Menu], DEC);
lcd.print(':');
if (Minute_of_TH [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_TH [Mode_Menu], DEC);
}
lcd.print F(" P");
lcd.print(pmin+1);
lcd.print F("m=");
LCD_Print_Number(Pgb [Mode_Menu][pmin], MPa_at);
lcd.setCursor(0,2);
lcd.print F("tBo=");
if (Second_of_tk [Mode_Menu] == 88 && Minute_of_tk [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Minute_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_tk [Mode_Menu], DEC);
lcd.print(':');
if (Second_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Second_of_tk [Mode_Menu], DEC);
}
lcd.print F(" PBo=");
LCD_Print_Number(PBo[Mode_Menu], MPa_at);
}
if (Mode_Menu == 3)
{
lcd.setCursor(0,1);
lcd.print F("TBo=");
if (Hour_of_TH [Mode_Menu] == 88 && Minute_of_TH [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Hour_of_TH [Mode_of_Work] < 10) lcd.print('0');
lcd.print(Hour_of_TH [Mode_Menu], DEC);
lcd.print(':');
if (Minute_of_TH [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_TH [Mode_Menu], DEC);
}
lcd.print F(" P");
lcd.print(pmin+1);
lcd.print F("m=");
LCD_Print_Number(Pgb [Mode_Menu][pmin], MPa_at);
lcd.setCursor(0,2);
lcd.print F("tBo=");
if (Second_of_tk [Mode_Menu] == 88 && Minute_of_tk [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Minute_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_tk [Mode_Menu], DEC);
lcd.print(':');
if (Second_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Second_of_tk [Mode_Menu], DEC);
}
lcd.print F(" PBo=");
LCD_Print_Number(PBo[Mode_Menu], MPa_at);
}
if (Mode_Menu == 4)
{
lcd.setCursor(0,1);
lcd.print F("TBb|=");
if (Hour_of_TH [Mode_Menu] == 88 && Minute_of_TH [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Hour_of_TH [Mode_of_Work] < 10) lcd.print('0');
lcd.print(Hour_of_TH [Mode_Menu], DEC);
lcd.print(':');
if (Minute_of_TH [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_TH [Mode_Menu], DEC);
}
lcd.print F(" P");
lcd.print(pmin+1);
lcd.print F("m=");
LCD_Print_Number(Pgb [Mode_Menu][pmin], MPa_at);
lcd.setCursor(0,2);
lcd.print F("tpa6=");
if (Second_of_tk [Mode_Menu] == 88 && Minute_of_tk [Mode_Menu] == 88) lcd.print F("__:__");
else
{
if (Minute_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Minute_of_tk [Mode_Menu], DEC);
lcd.print(':');
if (Second_of_tk [Mode_Menu] < 10) lcd.print('0');
lcd.print(Second_of_tk [Mode_Menu], DEC);
}
}
if (key == '0' && Mode_of_Work == 4 && Mode_Menu == 4)
{
if (Buz_on == 1) tone(2, 1000, 500); // Звук 1000 Гц 0,5 с
Mode_of_Work_prev = Mode_of_Work;
Mode_of_Work = 0;
Mode_Menu = Mode_of_Work;
for (int i=0; i<3; i++)
Pgb[Mode_of_Work][i] = Pnom; //Начальные давления в баллонах принять номинальными
for (int i=0; i<5; i++)
{
for (int j=0; j<3; j++)
if (i > 0) Pgb [i][j] = 888; // Текущее (прогнозируемое) давление в баллонах звена в режиме работы, [МПа/атм], 0 - настройка, 1 - вкл движение к очагу, 2 - очаг обнаружен, 3 - возвращение, 4 - выключен
Hour_of_TH [i] = 88;
Minute_of_TH [i] = 88;
Minute_of_tk [i] = 88;
Second_of_tk [i] = 88;
PBo [i] = 888; // Наименьшее давление для возвращения, МПа/атм
Time_of_Mode [i] = 0;
}
Pp = 4.9; // Резервное давление, МПа/атм
Vb = 6.8; // Объем баллона, л
}
if (key == '1' && (Mode_of_Work == 0 || Mode_of_Work == 4) && (Mode_Menu == 1 || Mode_Menu == 4)) // СИЗОД включен, поиск...
{
Minute_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] / 60; // Рассчитываем и сохраняем время мин. предыдущего режима
Second_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] % 60; // Рассчитываем и сохраняем время сек. предыдущего режима
if (Mode_of_Work == 4)
{
/* Serial.println (Pgb[][]);
Serial.println (PBo[]);
Serial.println (Hour_of_TH[]);
Serial.println (Minute_of_TH[]);
Serial.println (Minute_of_tk[]);
Serial.println (Second_of_tk[]);
Serial.println (Time_of_Mode[]);*/
for (int i=0; i<3; i++)
Pgb[0][i] = Pgb[4][i]; //Начальные давления в баллонах принять за конечные в предыдущем цикле работы
for (int i=0; i < 5; i++)
{
for (int j=0; j < 3; j++)
if (i > 0) Pgb [i][j] = 888; // Текущее (прогнозируемое) давление в баллонах звена в режиме работы, [МПа/атм], 0 - настройка, 1 - вкл движение к очагу, 2 - очаг обнаружен, 3 - возвращение, 4 - выключен
Hour_of_TH [i] = 88;
Minute_of_TH [i] = 88;
Minute_of_tk [i] = 88;
Second_of_tk [i] = 88;
PBo [i] = 888; // Наименьшее давление для возвращения, МПа/атм
Time_of_Mode [i] = 0;
}
Mode_of_Work = 0; //Сбросить режим работы на настройки - 0
}
Mode_of_Work_prev = Mode_of_Work;
Mode_of_Work = 1;
Mode_Menu = Mode_of_Work;
lcd.setCursor(0,3);
for (int i=0; i<20; i++)
lcd.print(Mode_of_Work_str [Mode_of_Work][i]);
if (Buz_on == 1) tone(2, 1000, 500); // Звук 1000 Гц 0,5 с
pmin = 0;
for (int i = 0; i < 3; i++)
{
if (Pgb[Mode_of_Work_prev][i] < Pgb[Mode_of_Work_prev][pmin]) pmin = i;
Pgb [Mode_of_Work][i] = Pgb [Mode_of_Work_prev][i];
}
Hour_of_TH [Mode_of_Work] = now.hour();
Minute_of_TH [Mode_of_Work] = now.minute();
if (MPa_at == 0) Second_of_tk [Mode_of_Work] = (Pgb[Mode_of_Work][pmin] - Pp) / Kpa[KQ_now] / 2 * 60;
else Second_of_tk [Mode_of_Work] = (Pgb[Mode_of_Work][pmin] - Pp) / Kat[KQ_now] / 2 * 60;
Minute_of_tk [Mode_of_Work] = Second_of_tk [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] %= 60;
PBo[Mode_of_Work] = (Pgb[Mode_of_Work][pmin] + Pp) / 2;
}
if (key == '2' && Mode_of_Work == 1 && Mode_Menu == 1 && Minute_of_tk [Mode_of_Work] != 0 && Second_of_tk [Mode_of_Work] != 0) // СИЗОД включен, очаг обнаружен, идет работа на месте
{
Minute_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] % 60;
if (Buz_on == 1) tone(2, 1000, 500); // Звук 1000 Гц 0,5 с
Mode_of_Work_prev = Mode_of_Work;
Mode_of_Work = 2;
Mode_Menu = Mode_of_Work;
lcd.setCursor(0,3);
for (int i=0; i<20; i++)
lcd.print(Mode_of_Work_str [Mode_of_Work][i]);
for (int k=0; k < 3; k++)
{
lcd.setCursor(13,1);
lcd.print(k + 1);
lcd.setCursor(16,1);
LCD_Print_Number(Pgb [Mode_of_Work_prev][k], MPa_at);
Pgb[Mode_of_Work_prev][k] = Value_Input (MPa_at, 16, 1, 4, 3);
}
pmin = 0;
for (int i = 0; i < 3; i++)
{
if (Pgb[Mode_of_Work_prev][i] < Pgb[Mode_of_Work_prev][pmin]) pmin = i;
Pgb[Mode_of_Work][i] = Pgb[Mode_of_Work_prev][i];
}
Hour_of_TH [Mode_of_Work] = now.hour();
Minute_of_TH [Mode_of_Work] = now.minute();
if (MPa_at == 0) Second_of_tk [Mode_of_Work] = (2 * Pgb[Mode_of_Work][pmin] - Pgb[0][pmin] - Pp) / Kpa[KQ_now] * 60;
else Second_of_tk [Mode_of_Work] = (2 * Pgb[Mode_of_Work][pmin] - Pgb[0][pmin] - Pp) / Kat[KQ_now] * 60;
Minute_of_tk [Mode_of_Work] = Second_of_tk [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] %= 60;
PBo[Mode_of_Work] = (Pgb[(0)][pmin] - Pgb[1][pmin] + Pp);
}
if (key == '3' && Mode_Menu != 0)
{
Minute_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] % 60;
if (Buz_on == 1) tone(2, 1000, 500); // Звук 1000 Гц 0,5 с
Mode_of_Work_prev = Mode_of_Work;
Mode_of_Work = 3;
Mode_Menu = Mode_of_Work;
lcd.setCursor(0,3);
for (int i=0; i<20; i++)
lcd.print(Mode_of_Work_str [Mode_of_Work][i]);
if (Mode_of_Work_prev != 0)
for (int k=0; k < 3; k++)
{
lcd.setCursor(13,1);
lcd.print(k + 1);
lcd.setCursor(16,1);
LCD_Print_Number(Pgb [Mode_of_Work_prev][k], MPa_at);
Pgb[Mode_of_Work_prev][k] = Value_Input (MPa_at, 16, 1, 4, 3);
}
pmin = 0;
for (int i = 0; i < 3; i++)
{
if (Pgb[Mode_of_Work_prev][i] < Pgb[Mode_of_Work_prev][pmin]) pmin = i;
Pgb[Mode_of_Work][i] = Pgb[Mode_of_Work_prev][i];
}
Hour_of_TH [Mode_of_Work] = now.hour();
Minute_of_TH [Mode_of_Work] = now.minute();
if (MPa_at == 0) Second_of_tk [Mode_of_Work] = (Pgb[Mode_of_Work][pmin] - Pp) / Kpa[KQ_now] * 60;
else Second_of_tk [Mode_of_Work] = (Pgb[Mode_of_Work][pmin] - Pp) / Kat[KQ_now] * 60;
Minute_of_tk [Mode_of_Work] = Second_of_tk [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] %= 60;
PBo[Mode_of_Work] = Pp;
}
if (key == '4' && Mode_of_Work !=0 && Mode_Menu != 0)
{
Minute_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] = Time_of_Mode [Mode_of_Work] % 60;
if (Buz_on == 1) tone(2, 1000, 500); // Звук 1000 Гц 0,5 с
Mode_of_Work_prev = Mode_of_Work;
Mode_of_Work = 4;
Mode_Menu = Mode_of_Work;
lcd.setCursor(0,3);
for (int i=0; i<20; i++)
lcd.print(Mode_of_Work_str [Mode_of_Work][i]);
for (int k=0; k < 3; k++)
{
lcd.setCursor(13,1);
lcd.print(k + 1);
lcd.setCursor(16,1);
LCD_Print_Number(Pgb [Mode_of_Work_prev][k], MPa_at);
Pgb[Mode_of_Work_prev][k] = Value_Input (MPa_at, 16, 1, 4, 3);
}
pmin = 0;
for (int i = 0; i < 3; i++)
{
if (Pgb[Mode_of_Work_prev][i] < Pgb[Mode_of_Work_prev][pmin]) pmin = i;
Pgb[Mode_of_Work][i] = Pgb[Mode_of_Work_prev][i];
}
Hour_of_TH [Mode_of_Work] = now.hour();
Minute_of_TH [Mode_of_Work] = now.minute();
for (int i=1; i<4; i++)
Second_of_tk [Mode_of_Work] += Time_of_Mode [i];
Minute_of_tk [Mode_of_Work] = Second_of_tk [Mode_of_Work] / 60;
Second_of_tk [Mode_of_Work] %= 60;
PBo[Mode_of_Work] = Pgb[Mode_of_Work][pmin];
}
if (key == '+')
{
if (Mode_Menu < 4)
{
Mode_Menu += 1;
key = "NO_KEY";
if (Buz_on == 1) tone(2, 1000, 200); // Звук 1000 Гц 0,2 с
}
}
if (key == '-')
{
if (Mode_Menu > 0)
{
Mode_Menu -= 1;
key = "NO_KEY";
if (Buz_on == 1) tone(2, 1000, 200); // Звук 1000 Гц 0,2 с
}
}
}