Скетч часов
Для практического применения требуется скачать zip-файл - chess.zip - с сайта. Ниже код ТОЛЬКО для ознакомления!
#include < avr/pgmspace.h>
#include < EEPROM.h>
#include < Wire.h>
#include < LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x3F); // set the LCD address to ... for a 16 chars and 2 line display
const int xHappyBirthday = 0;
const int xAndre = 1;
const int xChessTimer = 2;
const int xVersia = 3;
const int xObicnoe = 4;
const int xUderjanie = 5;
const int xFisher = 6;
const int xBronstein = 7;
const int xCeitnot = 8;
const int xRejim = 9;
const int xOsnovnoe = 10;
const int xZaderjka = 11;
const int xDopolnitelno = 12;
const int xOdniChasi = 13;
const int xPervomu = 14;
const int xVtoromu = 15;
const int xObmenChasov = 16;
const int xPrivetstvie = 17;
const int xFix = 18;
const int xOsnovnoe_ = 19;
const int xZaderjka_ = 20;
const int xVopros = 21;
const int xBlagodarnosti = 22;
const int xPapeZaKorpus = 23;
const int xPusto = 24;
const char string_0[] PROGMEM = "S Dnem Rojdenia ";
const char string_1[] PROGMEM = " ";
const char string_2[] PROGMEM = "Chess Timer ";
const char string_3[] PROGMEM = "v.1 ";
const char string_4[] PROGMEM = "Obicnoe ";
const char string_5[] PROGMEM = "Uderjanie ";
const char string_6[] PROGMEM = "Fisher ";
const char string_7[] PROGMEM = "Bronstein ";
const char string_8[] PROGMEM = "Ceitnot ";
const char string_9[] PROGMEM = "Rejim ";
const char string_10[] PROGMEM = "Osnovnoe ";
const char string_11[] PROGMEM = "Zaderjka ";
const char string_12[] PROGMEM = "Dopolnitelno ";
const char string_13[] PROGMEM = " Odni Chasi ";
const char string_14[] PROGMEM = " Pervomu ";
const char string_15[] PROGMEM = " Vtoromu ";
const char string_16[] PROGMEM = " Obmen Chasov ";
const char string_17[] PROGMEM = " Privetstvie ";
const char string_18[] PROGMEM = " Fix ";
const char string_19[] PROGMEM = " Osnovnoe ";
const char string_20[] PROGMEM = " Zaderjka ";
const char string_21[] PROGMEM = " ??? ";
const char string_22[] PROGMEM = "SPASIBO ";
const char string_23[] PROGMEM = " ";
const char string_24[] PROGMEM = " ";
const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3,
string_4, string_5, string_6, string_7, string_8, string_9, string_10, string_11,
string_12, string_13, string_14, string_15, string_16, string_17, string_18,
string_19, string_20, string_21, string_22, string_23, string_24};
char bufferi[16]; // и буфер - длиной 16 cимволов
String myStr;
long dobavl; // лок переменная добавления минут/секунд;
String s_dobavl; // текстовая лок переменная добавления минут/секунд;
int xPin = A1;
int yPin = A0;
int buttonPin = 8;
int xPosition = 0;
int yPosition = 0;
int buttonState = 0;
int pause = 0; // значение 12 пина - кнопки нажатия паузы
//int pause_rejim;// 1-активирована ПАУЗА
int zummer = 3;
int led_yelou_1 = 4;
int led_green_2 = 7;
byte privet = 0; // приветствие 1-отображать
long nac_igrok1;
long nac_igrok2;
long igrok1;
long igrok2;
unsigned long tek_time;
unsigned long skolko;
unsigned long proid;
int sost;
int perekl;
int scit;
int rejim; // режим часов 0-настройка, 1-отсчет, 2-режим итогов, 3- ПАУЗА
int vremen;// временное значение
int rejim_otsc = 0; // режим отсчета
String stka; // комм строка
/*
0. ОБЫЧНАЯ партия с победителем по времени
1. Партия с задержкой - если игрок укладывается в определенное время
на ход - время на этот ход не учитывается (часы во время задержки ВООБЩЕ не идут).
2. Партия с временем Фишера - если игрок укладывается в определенное
время на ход - НЕПОТРАЧЕННОЕ время на этот ход не учитывается (часы
во время задержки ИДУТ!!!!), но неиспользованная его часть ПОТОМ,
после сделанного хода, ДОБАВЛЯЕТСЯ игроку.
Режим позволяет накопить время в простых ситуациях для дальнейшего
использования в сложных.
3.Партия с временем Бронштейна - если игрок укладывается в определенное
время на ход - ПОСЛЕ ХОДА часы возвращаются на начальное (бывшее до хода!) значение.
Накопить время в этом режиме НЕВОЗМОЖНО.
4.Партия с цейтнотной зоной - обычная партия, но после окончания лимита,
в дальнейшем на каждый последующий ход дается РЕЗКО ограниченное кол-во секунд.
*/
int rejim_chess;// задание часов 0-для обоих игроков, 1-для 1, 2-для второго
long nac_zaderjka1; // НАЧАЛЬНЫЕ задержка для режима, если требуется в мс, для 1 игрока
long nac_zaderjka2; // задержка для режима, если требуется в мс, для 2 игрока
long zaderjka1; // задержка для режима, если требуется в мс, для 1 игрока
long zaderjka2; // задержка для режима, если требуется в мс, для 2 игрока
int zaderj1; // задержка для 1 режима
int zaderj2; //размер задержки для 2 режима
long zaderj3_1; // начальные значения для 3 режима 1 и 2 игрока
long zaderj3_2; //
int zaderj3; //размер задержки для 3 режима
int zaderj4; //размер задержки для 4 режима
//int menu_1=0; // главное меню 0-ВЫБРАННЫЙ или по умолчанию 1-Режим
2-Основное время 3-Задержка 4-Дополнительно
//int menu_1_1=0; // 0-Обычный 1-с задержкой 2-Фишера 3-Бронштейн 4-Цейтнотная
long menu_1_2[15] = {300000, 600000, 1200000, 1800000, 2700000, 3600000,
5400000, 60000, 120000, 180000, 420000, -1, -2, -3, -4}; //0-11
long menu_1_3[13] = {5000, 10000, 15000, 20000, 30000, 60000, 2000, 3000,
7000, -1, -2, -3, -4}; //0-9
//int menu_1_4=0; // 0- задавать СРАЗУ ПАРУ часов 1 и 2часы (по умолчанию),
1- задать первые часы , 2-задать вторые, 3-обменять часы 0-3, 4-ON/OFF приветствие,
5-фиксирование в EEPROM часов, 6-версия , 7-благодарность, 8-текст с днюхой же
int page = 0;
int porad = 0;
void setup() {
pinMode(led_yelou_1, OUTPUT);
pinMode(led_green_2, OUTPUT);
pinMode(zummer, OUTPUT); //объявляем пин как выход
/*
tone (zummer, 500); //включаем на 500 Гц
delay(100); //ждем 100 Мс
tone(zummer, 1000); //включаем на 1000 Гц
delay(100); //ждем 100 Мс
noTone(zummer);
*/
lcd.begin(16, 2); // initialize the lcd
lcd.setBacklight(255);
lcd.home();
/*
lcd.setCursor(0, 0);
lcd.print("Happy Birthday");
lcd.setCursor(7, 1);
lcd.print("!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Chess Timer");
lcd.setCursor(3, 1);
lcd.print("v.1 ");
delay(2000);
*/
// приветствие с днюхой 0-нет, 1-да
privet = EEPROM.read(5);
if (privet > 1) privet = 0;
if (privet == 1)
{
lcd.setCursor(0, 0);
lcd.print(fraza(xHappyBirthday));
lcd.setCursor(7, 1);
lcd.print(fraza(xAndre));
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
// lcd.print("Chess Timer");
lcd.print(fraza(xChessTimer));
lcd.setCursor(0, 1);
// lcd.print("v.1 ");
lcd.print(fraza(xVersia));
delay(2000);
lcd.clear();
}
// режим
rejim_otsc = EEPROM.read(0);
if (rejim_otsc > 4) rejim_otsc = 0;
//не более 90 мин 90*60*1000
nac_igrok1 = EEPROM.read(1) * 60000;
if (nac_igrok1 > 5400000) nac_igrok1 = 10000;
nac_igrok2 = EEPROM.read(2) * 60000;
if (nac_igrok2 > 5400000) nac_igrok2 = 10000;
//не более 200 сек 200*1000
nac_zaderjka1 = EEPROM.read(3) * 1000;
if (nac_zaderjka1 > 200000) nac_zaderjka1 = 5000;
nac_zaderjka2 = EEPROM.read(4) * 1000;
if (nac_zaderjka2 > 200000) nac_zaderjka2 = 5000;
lcd.clear();
// lcd.setCursor(0,1); СТОЛБЕЦ СТРОКА
// lcd.print("Hello LCD");
rejim = 0;
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
// активируем подтягивающий резистор на пине кнопки
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, LOW);
// запускаем последовательную передачу данных
Serial.begin(9600);
// задаем 2-ой контакт как входной,
// а также включаем встроенный подтягивающий резистор
// Держите в уме, что использование подтягивающего резистора
// переворачивает логику программы с ног на голову.
// Когда кнопка не нажата, Arduino считывает это как HIGH,
// а если нажата, то как LOW.
// Если кнопка нажата, то светодиод будет гореть,
// а если нет – то не будет:
pinMode(2, INPUT_PULLUP); // переключатель времени
pinMode(12, INPUT_PULLUP); // кнопка ПАУЗЫ
pinMode(13, OUTPUT);// светодиод на плате
// nac_igrok1 = 10000;
// nac_igrok2 = 10000;
// nac_zaderjka1 = 5000;
// nac_zaderjka2 = 5000;
//rejim_otsc = nac_rejim_otsc;
punkt_menu(page, porad, 0);
sost = digitalRead(2);
tek_time = millis();
scit = 0;
}
void loop() {
xPosition = analogRead(xPin);
yPosition = analogRead(yPin);
buttonState = digitalRead(buttonPin);
if (rejim == 3)
{
// мигание светодиодов при паузе
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, LOW);
delay(50);
if (sost == HIGH)
{
digitalWrite(led_yelou_1, HIGH);
}
else
{
digitalWrite(led_green_2, HIGH);
}
delay(50);
}
if (rejim == 0)
{
if (yPosition <= 1)
{
porad = porad + 1;
switch ( page )
{
case 0:
if (porad > 4) porad = 0;
break;
case 1:
if (porad > 4) porad = 0;
break;
case 2:
if (porad > 14) porad = 0;
break;
case 3:
if (porad > 12) porad = 0;
break;
case 4:
if (porad > 8) porad = 0;
break;
}
punkt_menu(page, porad, 0);
delay(400);
}
if (yPosition > 1022)
{
porad = porad - 1;
switch ( page )
{
case 0:
if (porad < 0) porad = 4;
break;
case 1:
if (porad < 0) porad = 4;
break;
case 2:
if (porad < 0) porad = 14;
break;
case 3:
if (porad < 0) porad = 12;
break;
case 4:
if (porad < 0) porad = 8;
break;
}
punkt_menu(page, porad, 0);
delay(400);
}
if (xPosition >= 1022 && yPosition > 200 && yPosition < 700)
{
punkt_menu(page, porad, 1);
delay(400);
}
if (xPosition < 2 && yPosition > 200 && yPosition < 700)
{
porad = page;
page = 0;
punkt_menu(page, porad, 0);
delay(400);
}
}
if (buttonState == 0)
{
delay(10);
page = 0;
porad = 0;
punkt_menu(page, porad, 0);
sost = digitalRead(2);
perekl = sost;
inicial();
rejim = 0;
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, LOW);
// Serial.print("1 | ");
// Serial.print(igrok1);
// Serial.print(" | 2 ");
// Serial.println(igrok2);
}
else
{
switch ( rejim )
{
//режим ПАУЗЫ
case 3:
pause = digitalRead(12);
if (pause == LOW)
{
if (sost == digitalRead(2))
{
// состояние переключателя отключение паузы должно быть ТАКИМ же, как при включении
int zz;
for (zz = 1; zz < 5; zz++)
{
tone (zummer, 300); //включаем на 500 Гц
delay(50); //ждем 100 Мс
tone(zummer, 600); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
}
noTone(zummer);
/////////////////////////// конец отработки кнопки нажатия
delay(50);
if (sost == digitalRead(2))
{
tek_time = millis();
rejim = 1;
break;
}
}
}
break;
//режим Настройки
case 0:
perekl = digitalRead(2);
if (perekl == sost)
{
//не было переключения
}
else
{
//БЫЛО переключение
// ИНИЦИАЛИЗАЦИЯ режима ОТСЧЕТА
inicial();
lcd.setCursor(0, 0);
lcd.print(fraza(xPusto));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
Serial.println("START");
}
break;
//режим Отсчета
case 1:
if (scit == 1)
{
pause = digitalRead(12);
if (pause == LOW)
{
/////////////////////// активация ПАУЗЫ - занесение ВСЕХ текущих значений во временную память
int zz;
for (zz = 1; zz < 10; zz++)
{
tone (zummer, 300); //включаем на 500 Гц
delay(50); //ждем 100 Мс
tone(zummer, 1300); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
}
noTone(zummer);
/////////////////////////// конец отработки кнопки нажатия
rejim = 3;
break;
/* else
{
// ДЕактивация ПАУЗЫ - ВОССТАНОВЛЕНИЕ ВСЕХ текущих значений из памяти
delay(100); // ЗАДЕРЖКА СРАЗУ
pause_rejim = 0;
}
*/
}
skolko = millis();
proid = skolko - tek_time;
tek_time = skolko;
perekl = digitalRead(2);
// Serial.println(sensorVal);
switch ( rejim_otsc )
{
case 0:
// простой режим 0
if (sost == HIGH) {
igrok1 = igrok1 - proid;
digitalWrite(13, LOW);
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
lcd.setCursor(0, 0);
lcd.print("*");
lcd.setCursor(15, 0);
lcd.print(" ");
}
else {
igrok2 = igrok2 - proid;
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
digitalWrite(13, HIGH);
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 0);
lcd.print(" ");
}
break;
case 1:
zaderj1 = zaderj1 + proid;
//
if (sost == HIGH) {
if (zaderj1 > zaderjka1)
{
igrok1 = igrok1 - proid;
}
lcd.setCursor(0, 0);
lcd.print("*");
lcd.setCursor(15, 0);
lcd.print(" ");
digitalWrite(13, LOW);
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
}
else {
if (zaderj1 > zaderjka2)
{
igrok2 = igrok2 - proid;
}
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 0);
lcd.print(" ");
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
digitalWrite(13, HIGH);
}
break;
case 2:
zaderj2 = zaderj2 + proid;
if (sost == HIGH) {
igrok1 = igrok1 - proid;
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
digitalWrite(13, LOW);
lcd.setCursor(0, 0);
lcd.print("*");
lcd.setCursor(15, 0);
lcd.print(" ");
}
else {
igrok2 = igrok2 - proid;
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 0);
lcd.print(" ");
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
digitalWrite(13, HIGH);
}
break;
case 3:
zaderj3 = zaderj3 + proid;
if (sost == HIGH) {
igrok1 = igrok1 - proid;
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
digitalWrite(13, LOW);
lcd.setCursor(0, 0);
lcd.print("*");
lcd.setCursor(15, 0);
lcd.print(" ");
}
else {
igrok2 = igrok2 - proid;
digitalWrite(13, HIGH);
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 0);
lcd.print(" ");
}
break;
case 4:
if (sost == HIGH) {
igrok1 = igrok1 - proid;
if (igrok1 <= 0)
{
lcd.setCursor(1, 0);
lcd.print(to_sec(igrok1 + zaderjka1 + 1000 ));
}
lcd.setCursor(8, 0);
lcd.print(" ");
if (igrok1 < -zaderjka1)
{
zaderj4 = 1;
// println(igrok1);
// println(zaderjka1);
}
lcd.setCursor(0, 0);
lcd.print("*");
lcd.setCursor(15, 0);
lcd.print(" ");
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
digitalWrite(13, LOW);
}
else {
igrok2 = igrok2 - proid;
if (igrok2 <= 0)
{
lcd.setCursor(8, 0);
lcd.print(to_sec(igrok2 + zaderjka2 + 1000 ));
}
lcd.setCursor(1, 0);
lcd.print(" ");
if (igrok2 < -zaderjka2)
{
zaderj4 = 2;
// println(igrok1);
// println(zaderjka1);
}
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 0);
lcd.print(" ");
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
digitalWrite(13, HIGH);
}
break;
}
if (perekl == sost)
{
//не было переключения
}
else
{
//БЫЛО переключение
sost = perekl;
delay(15);
tek_time = millis();
switch ( rejim_otsc )
{
case 2:
if (sost == 0)
{
// был переход из sost=1 в sost=0, т.е. от первого игрока ко второму
if (zaderj2 < zaderjka1)
{
igrok1 = igrok1 + (zaderjka1 - zaderj2);
}
}
else
{
if (zaderj2 < zaderjka2)
{
igrok2 = igrok2 + (zaderjka2 - zaderj2);
}
}
zaderj2 = 0;
break;
case 3:
if (sost == 0)
{
// был переход из sost=1 в sost=0, т.е. от первого игрока ко второму
// Serial.println(igrok1);
if (zaderj3 < zaderjka1)
{
igrok1 = zaderj3_1;
}
else
{
zaderj3_1 = igrok1;
}
}
else
{
// Serial.println(igrok2);
// Serial.println(zaderj3_2);
if (zaderj3 < zaderjka2)
{
igrok2 = zaderj3_2;
}
else
{
zaderj3_2 = igrok2;
}
}
zaderj3 = 0;
break;
case 4:
if (sost == 0)
{
// был переход из sost=1 в sost=0, т.е. от первого игрока ко второму
if (zaderj4 != 1)
{
if (igrok1 < 0)
{
igrok1 = 0;
}
}
}
else
{
if (zaderj4 != 2)
{
if (igrok2 < 0)
{
igrok2 = 0;
}
}
}
//zaderj3 = 0;
break;
}
zaderj1 = 0;
zaderj2 = 0;
zaderj3 = 0;
zaderj4 = 0;
// zaderj3_1 = 0;
// zaderj3_2 = 0;
}
if (rejim_otsc != 4)
{
if (igrok1 < 0 || igrok2 < 0)
{
if (igrok1 < 0)
{
Serial.println("igrok1 LOH");
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
rejim = 2;
zumm_end(0);
}
else
{
Serial.println("igrok2 LOH");
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
rejim = 2;
zumm_end(1);
}
scit = 0;
}
}
else
{
if (zaderj4 > 0)
{
if (zaderj4 == 1)
{
Serial.println("igrok1 LOH");
digitalWrite(led_yelou_1, HIGH);
digitalWrite(led_green_2, LOW);
rejim = 2;
zumm_end(0);
}
else
{
Serial.println("igrok2 LOH");
digitalWrite(led_yelou_1, LOW);
digitalWrite(led_green_2, HIGH);
rejim = 2;
zumm_end(1);
}
scit = 0;
}
}
// Serial.println(igrok1);
// Serial.println(igrok2);
Serial.print("1 | ");
Serial.print(igrok1);
Serial.print(" | 2 ");
Serial.println(igrok2);
// Serial.print(" | 3 ");
// Serial.println(zaderj3_1);
// Serial.print(" | 4 ");
// Serial.println(zaderj3_2);
time_vivod();
//Serial.print(yPosition);
//Serial.print(" | Button: ");
//Serial.println(buttonState);
}
/*
else
{
perekl = digitalRead(2);
if (perekl == sost)
{
//не было переключения
}
else
{
//БЫЛО переключение
sost = perekl;
scit = 1;
delay(15);
tek_time = millis();
zaderj1 = 0;
zaderj2 = 0;
zaderj3_1 = igrok1;
zaderj3_2 = igrok2;
zaderj4 = 0;
}
}
*/
break;
case 2:
break;
}
//конец rejim
}
}
void inicial()
{
igrok1 = nac_igrok1;
igrok2 = nac_igrok2;
zaderj3_1 = igrok1;
zaderj3_2 = igrok2;
zaderjka1 = nac_zaderjka1;
zaderjka2 = nac_zaderjka1;
//rejim_otsc = nac_rejim_otsc;
sost = perekl;
scit = 1;
delay(15);
tek_time = millis();
zaderj1 = 0;
zaderj2 = 0;
zaderj3 = 0;
zaderj4 = 0;
rejim = 1;
}
void punkt_menu(int ppage, int pporad, int flag )
{
// ppage, pporad, flag - 0-ВЫВОД, 1-ВВОД
if (flag == 0)
{
punkt_menu_otobr(ppage, pporad, 0);
}
else
{
Serial.print("VIBRANO | ");
zumm_vibran();
punkt_menu_otobr(ppage, pporad, flag);
delay(600);
if (ppage == 0)
{
page = pporad;
porad = 0;
punkt_menu_otobr(page, porad, 0);
}
else
{
punkt_menu_otobr(ppage, pporad, 0);
}
}
}
void punkt_menu_otobr(int rpage, int rporad, int rflag)
{
switch ( rpage )
{
case 0:
//0
switch ( rporad )
{
case 0:
//ПРОСТО ОТОБРАЖЕНИЕ!!
switch ( rejim_otsc )
{
case 0:
Serial.print("def | ");
lcd.setCursor(0, 0);
// lcd.print("Obicnoe ");
lcd.print(fraza(xObicnoe));
break;
case 1:
Serial.print("sd | ");
lcd.setCursor(0, 0);
// lcd.print("Uderjanie ");
lcd.print(fraza(xUderjanie));
break;
case 2:
Serial.print("fis | ");
lcd.setCursor(0, 0);
// lcd.print("Fisher ");
lcd.print(fraza(xFisher));
break;
case 3:
Serial.print("bro | ");
lcd.setCursor(0, 0);
// lcd.print("Bronstein ");
lcd.print(fraza(xBronstein));
break;
case 4:
Serial.print("cei | ");
lcd.setCursor(0, 0);
// lcd.print("Ceitnot ");
lcd.print(fraza(xCeitnot));
break;
}
Serial.print(nac_igrok1);
nac_time_vivod();
if (rejim_otsc != 0)
{
Serial.print(" | ");
Serial.print(nac_zaderjka1);
}
Serial.print(" - ");
Serial.print(nac_igrok2);
if (rejim_otsc != 0)
{
Serial.print(" | ");
Serial.print(nac_zaderjka2);
}
Serial.println("");
break;
case 1:
Serial.println("reg");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xRejim));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 2:
Serial.println("Osn");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xOsnovnoe));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 3:
Serial.println("Sec");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xZaderjka));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 4:
Serial.println("dop");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xDopolnitelno));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
}
break;
case 1:
switch ( rporad )
{
case 0:
Serial.println("def");
if (rflag == 1) rejim_otsc = rporad;
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xObicnoe));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 1:
if (rflag == 1) rejim_otsc = rporad;
Serial.println("sd");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xUderjanie));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 2:
if (rflag == 1) rejim_otsc = rporad;
Serial.println("fis");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xFisher));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 3:
if (rflag == 1) rejim_otsc = rporad;
Serial.println("bro");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xBronstein));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 4:
if (rflag == 1) rejim_otsc = rporad;
Serial.println("cei");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xCeitnot));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
}
break;
case 2:
//menu_1_2
if (menu_1_2[rporad] < -50000)
{
Serial.println("t ");
}
else
{
///
if (menu_1_2[rporad] >= 0)
{
switch ( rejim_chess )
{
case 0:
if (rflag == 1)
{
nac_igrok1 = menu_1_2[rporad];
nac_igrok2 = menu_1_2[rporad];
}
break;
case 1:
if (rflag == 1) nac_igrok1 = menu_1_2[rporad];
break;
case 2:
if (rflag == 1) nac_igrok2 = menu_1_2[rporad];
break;
}
lcd.setCursor(0, 0);
lcd.print(fraza(xOsnovnoe_));
lcd.setCursor(0, 1);
lcd.print(otobrano(rflag) + to_min(menu_1_2[rporad]) + fraza(xPusto));
}
else
{
///
dobavl = 0;
switch ( menu_1_2[rporad] )
{
case -1:
dobavl = 60000;
break;
case -2:
dobavl = -60000;
break;
case -3:
dobavl = 300000;
break;
case -4:
dobavl = -300000;
break;
}
s_dobavl = String(dobavl / 60000) + " min ";
if (dobavl > 0)
{
s_dobavl = "+" + s_dobavl;
}
switch ( rejim_chess )
{
case 0:
if (rflag == 1)
{
nac_igrok1 = nac_igrok1 + dobavl;
nac_igrok2 = nac_igrok2 + dobavl;
}
if (nac_igrok1 == nac_igrok2)
{
s_dobavl = s_dobavl + String(nac_igrok1 / 60000) + " min ";
}
break;
case 1:
if (rflag == 1)
{
nac_igrok1 = nac_igrok1 + dobavl;
}
s_dobavl = s_dobavl + String(nac_igrok1 / 60000) + " min ";
break;
case 2:
if (rflag == 1)
{
nac_igrok2 = nac_igrok2 + dobavl;
}
s_dobavl = s_dobavl + String(nac_igrok2 / 60000) + " min ";
break;
}
if (nac_igrok1 > 5400000) nac_igrok1 = 5400000;
if (nac_igrok2 > 5400000) nac_igrok2 = 5400000;
if (nac_igrok1 < 1) nac_igrok1 = 60000;
if (nac_igrok2 < 1) nac_igrok2 = 60000;
lcd.setCursor(0, 0);
lcd.print(fraza(xOsnovnoe_));
lcd.setCursor(0, 1);
lcd.print(otobrano(rflag) + s_dobavl);
///
}
Serial.print("toSn | ");
Serial.println(menu_1_2[rporad]);
}
break;
case 3:
//menu_1_3
if (menu_1_3[rporad] < -50000)
{
Serial.println("s ");
}
else
{
if (menu_1_3[rporad] >= 0)
{
switch ( rejim_chess )
{
case 0:
if (rflag == 1)
{
nac_zaderjka1 = menu_1_3[rporad];
nac_zaderjka2 = menu_1_3[rporad];
}
break;
case 1:
if (rflag == 1) nac_zaderjka1 = menu_1_3[rporad];
break;
case 2:
if (rflag == 1) nac_zaderjka2 = menu_1_3[rporad];
break;
}
lcd.setCursor(0, 0);
lcd.print(fraza(xZaderjka_));
lcd.setCursor(0, 1);
lcd.print(otobrano(rflag) + to_sec(menu_1_3[rporad]));
}
else
{
/////
dobavl = 0;
switch ( menu_1_3[rporad] )
{
case -1:
dobavl = 1000;
break;
case -2:
dobavl = -1000;
break;
case -3:
dobavl = 5000;
break;
case -4:
dobavl = -5000;
break;
}
s_dobavl = String(dobavl / 1000) + " sec ";
if (dobavl > 0)
{
s_dobavl = "+" + s_dobavl;
}
switch ( rejim_chess )
{
case 0:
if (rflag == 1)
{
nac_zaderjka1 = nac_zaderjka1 + dobavl;
nac_zaderjka2 = nac_zaderjka2 + dobavl;
}
if (nac_zaderjka1 == nac_zaderjka2)
{
s_dobavl = s_dobavl + String(nac_zaderjka1 / 1000) + " sec ";
}
break;
case 1:
if (rflag == 1)
{
nac_zaderjka1 = nac_zaderjka1 + dobavl;
}
s_dobavl = s_dobavl + String(nac_zaderjka1 / 1000) + " sec ";
break;
case 2:
if (rflag == 1)
{
nac_zaderjka2 = nac_zaderjka2 + dobavl;
}
s_dobavl = s_dobavl + String(nac_zaderjka2 / 1000) + " sec ";
break;
}
if (nac_zaderjka1 > 60000) nac_zaderjka1 = 60000;
if (nac_zaderjka2 > 60000) nac_zaderjka2 = 60000;
if (nac_zaderjka1 < 1) nac_zaderjka1 = 1000;
if (nac_zaderjka2 < 1) nac_zaderjka2 = 1000;
lcd.setCursor(0, 0);
lcd.print(fraza(xZaderjka_));
lcd.setCursor(0, 1);
lcd.print(otobrano(rflag) + s_dobavl);
////
}
Serial.print("tSeC| ");
Serial.println(menu_1_3[rporad]);
}
break;
case 4:
switch ( rporad )
{
case 0:
if (rflag == 1)
{
rejim_chess = rporad;
nac_igrok2 = nac_igrok1;
nac_zaderjka2 = nac_zaderjka1;
}
Serial.println("t1-2");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xOdniChasi));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 1:
if (rflag == 1) rejim_chess = rporad;
Serial.println("t1");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xPervomu));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 2:
if (rflag == 1) rejim_chess = rporad;
Serial.println("t2");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xVtoromu));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 3:
if (rflag == 1)
{
long zzz;
zzz = nac_igrok2;
nac_igrok2 = nac_igrok1;
nac_igrok1 = zzz;
zzz = nac_zaderjka2;
nac_zaderjka2 = nac_zaderjka1;
nac_zaderjka1 = zzz;
}
Serial.println("t-s");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xObmenChasov));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
case 4:
stka = "";
if (rflag == 1)
{
if (privet == 0)
{
privet = 1;
}
else
{
privet = 0;
}
EEPROM.write(5, privet);
}
if (privet == 0)
{
stka = " OFF ";
}
else
{
stka = " ON ";
}
// Serial.println("pri");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xPrivetstvie));
lcd.setCursor(0, 1);
lcd.print(stka);
break;
case 5:
if (rflag == 1)
{
EEPROM.write(0, (byte) rejim_otsc);
vremen = nac_igrok1 / 60000;
EEPROM.write(1, (byte) vremen);
vremen = nac_igrok2 / 60000;
EEPROM.write(2, (byte) vremen);
vremen = nac_zaderjka1 / 1000;
EEPROM.write(3, (byte) vremen);
vremen = nac_zaderjka2 / 1000;
EEPROM.write(4, (byte) vremen);
}
// Serial.println("fix");
lcd.setCursor(0, 0);
lcd.print(otobrano(rflag) + fraza(xFix));
lcd.setCursor(0, 1);
lcd.print(fraza(xPusto));
break;
////
case 6:
lcd.setCursor(0, 0);
lcd.print(fraza(xChessTimer));
lcd.setCursor(0, 1);
lcd.print(fraza(xVersia));
break;
case 7:
lcd.setCursor(0, 0);
lcd.print(fraza(xBlagodarnosti));
lcd.setCursor(0, 1);
lcd.print(fraza(xPapeZaKorpus));
break;
case 8:
lcd.setCursor(0, 0);
lcd.print(fraza(xHappyBirthday));
lcd.setCursor(0, 1);
lcd.print(fraza(xAndre));
break;
////
}
break;
}
}
void nac_time_vivod()
{
lcd.setCursor(0, 1);
lcd.print(time_string(nac_igrok1, nac_zaderjka1, rejim_otsc, 0));
lcd.setCursor(8, 1);
lcd.print(time_string(nac_igrok2, nac_zaderjka2, rejim_otsc, 0));
}
void time_vivod()
{
lcd.setCursor(0, 1);
lcd.print(time_string(igrok1, 0, 0, 1));
lcd.setCursor(10, 1);
lcd.print(time_string(igrok2, 0, 0, 1));
}
String time_string (long t_osn, long t_zd, int t_rej, int t_flag )
{
int c_min, c_sec;
String s_min, s_sec, stroka;
if (t_flag == 0)
{
// 0-отображение вида Основное_время.Задержка
c_min = t_osn / 60000;
if (t_rej != 0)
{
c_sec = t_zd / 1000;
}
else
{
c_sec = 0;
}
s_min = String(c_min);
if (c_min < 10)
{
if (c_min > 0)
{
s_min = "0" + s_min;
}
else
{
s_min = "00";
}
}
s_sec = String(c_sec);
if (c_sec < 10)
{
if (c_sec > 0)
{
s_sec = "0" + s_sec;
}
else
{
s_sec = "00";
}
}
stroka = s_min + "m " + s_sec + "s ";
return stroka;
}
else
{
// 1-отображение Основного времени в виде Минуты:Секунды - остальные параметры НЕ ВЛИЯЮТ!
c_min = t_osn / 60000;
c_sec = (t_osn - c_min * 60000) / 1000;
s_min = String(c_min);
if (c_min < 10)
{
if (c_min > 0)
{
s_min = "0" + s_min;
}
else
{
s_min = "00";
}
}
s_sec = String(c_sec);
if (c_sec < 10)
{
if (c_sec > 0)
{
s_sec = "0" + s_sec;
}
else
{
s_sec = "00";
}
}
stroka = s_min + ":" + s_sec;
return stroka;
}
}
String to_min (long vrem)
{
int vv;
vv = vrem / 60000;
return String(vv) + " min ";
}
String to_sec (long vrem)
{
int vv;
vv = vrem / 1000;
return String(vv) + " sec ";
}
String otobrano (int t_flag)
{
if (t_flag == 0) return "";
return "V ";
}
/*
0. ОБЫЧНАЯ партия с победителем по времени
1. Партия с задержкой - если игрок укладывается в определенное время на ход -
время на этот ход не учитывается (часы во время задержки ВООБЩЕ не идут).
2. Партия с временем Фишера - если игрок укладывается в определенное время
на ход - НЕПОТРАЧЕННОЕ время на этот ход не учитывается (часы во время задержки
ИДУТ!!!!), но неиспользованная его часть ПОТОМ, после сделанного хода, ДОБАВЛЯЕТСЯ игроку.
Режим позволяет накопить время в простых ситуациях для дальнейшего
использования в сложных.
3.Партия с временем Бронштейна - если игрок укладывается в определенное
время на ход - ПОСЛЕ ХОДА часы возвращаются на начальное (бывшее до хода!) значение.
Накопить время в этом режиме НЕВОЗМОЖНО.
4.Партия с цейтнотной зоной - обычная партия, но после окончания лимита,
в дальнейшем на каждый последующий ход дается РЕЗКО ограниченное кол-во секунд.
*/
void zumm_end( int proig)
{
int zz;
if (proig == 0)
{
for (zz = 1; zz < 30; zz++)
{
tone (zummer, 500); //включаем на 500 Гц
delay(50); //ждем 100 Мс
tone(zummer, 1000); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
tone(zummer, 1500); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
tone(zummer, 1000); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
tone (zummer, 500); //включаем на 500 Гц
delay(50); //ждем 100 Мс
}
}
else
{
for (zz = 1; zz < 30; zz++)
{
tone (zummer, 300); //включаем на 500 Гц
delay(50); //ждем 100 Мс
tone(zummer, 800); //включаем на 1000 Гц
delay(40); //ждем 100 Мс
tone(zummer, 1000); //включаем на 1000 Гц
delay(30); //ждем 100 Мс
tone(zummer, 300); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
tone (zummer, 800); //включаем на 500 Гц
delay(50); //ждем 100 Мс
}
}
noTone(zummer);
}
void zumm_vibran()
{
tone (zummer, 500); //включаем на 500 Гц
delay(50); //ждем 100 Мс
tone(zummer, 1000); //включаем на 1000 Гц
delay(50); //ждем 100 Мс
noTone(zummer);
}
String fraza (int slovo)
{
strcpy_P(bufferi, (char*)pgm_read_word(&(string_table[slovo])));
myStr = bufferi;
return myStr;
}