Скетч

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





О чем этот сайт...

Об увлечениях. О политике. О чем угодно

Карта сайта





Рейтинг@Mail.ru