Скетч
Для практического применения требуется скачать 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; }