Шахматные Часы

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Подскажите где ошибка и по возможности как исправить.

unsigned long t1; 
#define but 5
#define but1 6
unsigned long t2;
 
void setup() {
  Serial.begin(9600);
  pinMode(but, INPUT);
  pinMode(but1, INPUT);
}
 
void loop() {
  if (but == 0 && but1 == 1)  {
    ml1=m1;
    sl1=s1;
    s=sl;
    m=ml;
    backcount();
  }
 
  if (but == 1 && but1 == 0)  {
    ml=m;
    sl=s;
    s1=sl1;
    m1=ml1;
    backcount1();
  }
 
 
 
 
  
  if (millis() - t2 >= 1000) {
    Serial.print(m); Serial.print(' '); Serial.print(s); Serial.print(" & "); Serial.print(m1); Serial.print(' ');Serial.println(s1);
    t2=millis();
    
  }
}
 
 
 
 
 
void backcount() {
  if (millis() - t >= 1000) {
    s--;
    
    t=millis();
    
  }
  if (s==0) {
    s=60;
    m--;
  }
  
}
 
void backcount1() {
  if (millis() - t1 >= 1000) {
    s1--;
    
    t1=millis();
    
  }
  if (s1==0) {
    s1=60;
    m1--;
  }
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Каким образом ты узнал, что тут ошибка?

sadman41
Offline
Зарегистрирован: 19.10.2016

INPUT_PULLUP

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

sadman41 пишет:
INPUT_PULLUP

sadman41
Offline
Зарегистрирован: 19.10.2016

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

не работает

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Grib_arduino пишет:

не работает

Принято к сведению.

sadman41 увы, в этот раз магия не сработала. Видимо теперь надо применять заклинание 80 уровня :-)

sadman41
Offline
Зарегистрирован: 19.10.2016

В магию нужно верить, тогда она работает. А тут человек неверующий попался.

fogary
Offline
Зарегистрирован: 05.03.2016

Grib_arduino пишет:

Подскажите где ошибка и по возможности как исправить.

Для начала, перед использованием переменных их принято объявлять и, желательно, инициализировать.

Константы but и but1 у Вас имеют значения отличные от 0 и 1, так что две первые проверки в loop() не выполняться никогда, от слова - совсем.

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

не работает

не просто не работает, а даже не компилируется. Для начала - ни одна из шести переменных, встречающихся в строчках с 14 по 17 - не обьявлена.

Вот когда исправите подобные ошибки - тогда будет "не работает".

Когда скетч начнет компилироваться - приходите, подскажу что исправлять дальше.

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Спасибо не заметил

Grib_arduino
Offline
Зарегистрирован: 31.08.2021
исправил:
unsigned long t1; 
#define but 5
#define but1 6
unsigned long t;
unsigned long t2;

int ml1;
int m1;
int sl1;
int s1;
int s;
int m;
int sl;
int ml;
void setup() {
  Serial.begin(9600);
  pinMode(but, INPUT);
  pinMode(but1, INPUT);
}
 
void loop() {
  if (digitalRead(but) == 0 && digitalRead(but1) == 1)  {
    ml1=m1;
    sl1=s1;
    s=sl;
    m=ml;
    backcount();
  }
 
  if (but == 1 && but1 == 0)  {
    ml=m;
    sl=s;
    s1=sl1;
    m1=ml1;
    backcount1();
  }
 
 
 
 
  
  if (millis() - t2 >= 1000) {
    Serial.print(m); Serial.print(' '); Serial.print(s); Serial.print(" & "); Serial.print(m1); Serial.print(' ');Serial.println(s1);
    t2=millis();
    
  }
}
 
 
 
 
 
void backcount() {
  if (millis() - t >= 1000) {
    s--;
    
    t=millis();
    
  }
  if (s==0) {
    s=60;
    m--;
  }
  
}
 
void backcount1() {
  if (millis() - t1 >= 1000) {
    s1--;
    
    t1=millis();
    
  }
  if (s1==0) {
    s1=60;
    m1--;
  }
}
 

 

 
b707
Онлайн
Зарегистрирован: 26.05.2017

работает?

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

нет

b707
Онлайн
Зарегистрирован: 26.05.2017

сил не хватило половину скетча вставить? :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Флажок упал

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

не всё скопировал:)

 

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Grib_arduino пишет:

нет

просто выводит нули

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

30 строка - это про что?

Где Вы инициализируете переменные?

Morroc
Offline
Зарегистрирован: 24.10.2016

Ну вы же умные, исправьте как нибудь :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Morroc пишет:
Ну вы же умные, исправьте как нибудь :)

А в чем наш интерес? Это Вам надо научится. Если нет - купите шахматные часы и не выносите моск.

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

просто выводит нули

при ненажатых кнопках и должен выводить только нули. А что до кнопок - я смотрю вы строчку 22 исправили, наверно кто-то подсказал? - а в строке 30 так и остался бред.

 

А еще....

Grib_arduino - если вам нужна помощь, так давайте общайтесь. Напишите что это за код. откуда вы его взяли, как он должен работать, что работает, а что нет. А когда вы молчите, на вопросы отвечаете односложно - никакого интереса отвечать вам нет. Создается впечатление, что вы настолько глупы и ограничены, что два слова вместе связать не можете...

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Код написал сам, должно когда держу первую кнопку отниматься время первого игрока когда вторую второго.

Про 30 строку спасибо

но всё ровно не работает

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

должно когда держу первую кнопку отниматься время первого игрока когда вторую второго.


При старте программы у вас у обоих игроков время = 0. И если Вы начнете от этого времени что-то отнимать - получится отрицательное время. Вы уверены, что это правильно?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Grib_arduino пишет:

Код написал сам

Не надо писать коды (коды - это что-то непонятное) - пишите программы, а лучше - алгоритмы. Их несложно перевести на любой язык программирования. Но только ПРАВИЛЬНЫЕ алгоритмы.

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

ну это легко исправить но оно даже в минус не уходит

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Grib_arduino пишет:

Код написал сам

Ага! Как Ньютону приснилось)) А как объявлять и инициализировать переменные не доснилось, разбудили небось не вовремя.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Grib_arduino пишет:

ну это легко исправить но оно даже в минус не уходит

Вы бы хоть тот раздел Программирование, что прямо на этом сайте есть, почитали...

http://arduino.ru/Reference/Increment Там есть "Примеры". Разницу с тем, что в скетче написано видите?

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Вот я сделал алгоритм, закинул его на файло-обменик

https://fex.net/s/ynvlbmb

 

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

kalapanga пишет:

Grib_arduino пишет:

ну это легко исправить но оно даже в минус не уходит

Вы бы хоть тот раздел Программирование, что прямо на этом сайте есть, почитали...

http://arduino.ru/Reference/Increment Там есть "Примеры". Разницу с тем, что в скетче написано видите?

попробовал сделать как там написано всё равно не работает потом сделал просто х = х - 1; 

unsigned long t1; 
#define but 5
#define but1 6
unsigned long t;
unsigned long t2;

int ml1;
int m1;
int sl1;
int s1;
int s;
int m;
int sl;
int ml;
void setup() {
  Serial.begin(9600);
  pinMode(but, INPUT);
  pinMode(but1, INPUT);
}
 
void loop() {
  if (digitalRead(but) == 0 && digitalRead(but1) == 1)  {
    ml1=m1;
    sl1=s1;
    s=sl;
    m=ml;
    backcount();
  }
 
  if (digitalRead(but) == 1 && digitalRead(but1) == 0)  {
    ml=m;
    sl=s;
    s1=sl1;
    m1=ml1;
    backcount1();
  }
 
 
 
 
  
  if (millis() - t2 >= 1000) {
    Serial.print(m); Serial.print(' '); Serial.print(s); Serial.print(" & "); Serial.print(m1); Serial.print(' ');Serial.println(s1);
    t2=millis();
    
  }
}
 
 
 
 
 
void backcount() {
  if (millis() - t >= 1000) {
    s = s - 1;
    
    t=millis();
    
  }
  if (s==0) {
    s=60;
    m = m-1;
  }
  
}
 
void backcount1() {
  if (millis() - t1 >= 1000) {
    s1 = s1 - 1;
    
    t1=millis();
    
  }
  if (s1==0) {
    s1=60;
    m1 = m1 - 1;
  }
}

Но всё ровно не работает

nik182
Онлайн
Зарегистрирован: 04.05.2015

Уже говорили. Инициализируйте перед началом работы или добавьте условие про одинаковый статус кнопок и там инициализируйте время партии. Типа m=5;s=0; . Кроме того отсутствует проверка на окончание партии. Проверять надо m==0.
Нет защиты от дребезга контактов.

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino - у вас код написан так, что любые изменения от нажатия кнопки сохраняются доли секунды, а при следующем нажатии снова сбрасываются на ноль. А поскольку защиты от дребезга нет - то никогда ничего и не меняется.

К чему вообще эти пляски с переменными, зачем при нажатии первой кнопки s приравнивается s1, а  при нажатии второй обратно? - вы понимаете, что при таком раскладе значения никогда не изменятся, потому что вы не сохраняете изменения?

У вас вся программа - одна логическая несуразица

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Они сохраняются чтобы потом когда кнопку нажал первый игрок потом второй а потом опять первый отсчет шел не сначала времени.

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

Они сохраняются

ошибаетесь, они не сохраняются

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Так вроде все переменные инициализировал какие ещё остались?

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

b707 пишет:

Grib_arduino пишет:

Они сохраняются

ошибаетесь, они не сохраняются

    ml1=m1;
    sl1=s1;
    s=sl;
    m=ml;

или это неправильное сохранение?

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

или это неправильное сохранение?

это сохранение не в том месте. Если одну и ту же кнопку нажать два раза - сохранение не работает и даже предыдущие результаты сбрасываются. А с учетом дребезга кнопки всегда нажимаются по несколько раз.

Я бы всю логику вашей программы переработал. выкинул нафик кучу переменных типа s s1 s11 - время для игроков сделал бы общим. Тогда и сохранять ничего не нужно будет.

А отдельные таймеры каждому игроку считал бы из разниц общего времени

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

Так вроде все переменные инициализировал

ГДЕ ???

Вы, простите, что называете инициализацией? - у вас ни одна переменная не инициализирована....

Другой вопрос, что этому коду инициализация никак не поможет - все равно работать не будет

Grib_arduino
Offline
Зарегистрирован: 31.08.2021
int ml1;
int m1;
int sl1;
int s1;
int s;
int m;
int sl;
int ml;
Grib_arduino
Offline
Зарегистрирован: 31.08.2021

https://fex.net/s/ynvlbmb

Это сам алгоритм, он тоже не правильный?

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

int ml1;
int m1;
int sl1;
int s1;
int s;
int m;
int sl;
int ml;

не тупите, а возьмите любой учебник по языку и прочитайте. что такое "инициализация переменных".

b707
Онлайн
Зарегистрирован: 26.05.2017

Grib_arduino пишет:

https://fex.net/s/ynvlbmb

Это сам алгоритм, он тоже не правильный?

он очень общий.

Токарю можно сказать просто "Сделай мне гайку М12" - остальное он знает сам. А вот станку с ЧПУ придется обьяснить, какую заготовку взять (шестигранный пруток), какое отверстие просверлить, какую резьбу нарезать и так далее...

Понимаете разницу?

У вас алгоритм для человека, для программы этого мало.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Выкинул всё лишнее и добавил подавление дребезга. В железе не проверял. Одновременное нажатие двух клавиш начинает партию с начала. Ноги клавиш замыкать на землю. 

#define but1 5
#define but2 6

unsigned long t, t1, t2;
unsigned int k1cnt = 0, k2cnt = 0;
byte m1 = 5, s1 = 0, s2 = 0, m2 = 5, key = 0, k1UP;

void setup() {
  Serial.begin(115200);
  pinMode(but1, INPUT_PULLUP);
  pinMode(but2, INPUT_PULLUP);
  Serial.print("Начало партии. Пятиминутка. Для начала партии нажать кнопку черных"); // Чёрные кнопка 2
}


void loop() {

  if (millis() - t >= 10) { // Проверка нажатия клавиш с антидребезгом и контролем одновременного нажатия. Срабатывает при отпускании.
    t = millis();
    if (k1cnt > 5) {if (digitalRead(but1) == 0) k1cnt++; else {key = 1; k1cnt = 0; if (k2cnt > 5) {k1UP = 1; key = 0;}; } }
    else if (digitalRead(but1) == 0) k1cnt++;
    if (k2cnt > 5) { if (digitalRead(but2) == 0) k2cnt++; else {key = 2; k2cnt = 0; if (k1cnt > 5) { while (digitalRead(but1) == 0); key = 3;}; if ( k1UP > 0 ) key = 3;}}
    else if (digitalRead(but2) == 0) k2cnt++;
  };
  
  if (key == 1)  {
    backcount1();
    Serial.print("Ход белых");
  }

  if (key == 2 )  {
    backcount2();
    Serial.print("Ход чёрных");
  }
  if (key == 3 )  { // Одновременное нажатие двух клавиш
    key = 0;
    m1 = 5;
    m2 = 5;
    s1 = 0;
    s2 = 0;
    Serial.print("Партия начинается с начала. Пятиминутка. Для начала партии нажать кнопку черных");
  }
}

void backcount1() {
  if (millis() - t1 >= 1000) {
    t1 = millis();
    s1++;
  }
  if (s1 > 59) {
    s1 = 0;
    m1--;
  }
  Serial.print("Белые" ); Serial.print(m1); Serial.print(':'); Serial.print(59 - s1);
  if (m1 < 1) {
    Serial.print("Время белых закончилось");
    key = 3;
  }
}

void backcount2() {
  if (millis() - t2 >= 1000) {
    t2 = millis();
    s2++;
  }
  if (s2 > 59) {
    s2 = 0;
    m2--;
  }
  Serial.print("Чёрные " ); Serial.print(m2); Serial.print(":"); Serial.print(59 - s2);
  if (m2 < 1) {
    Serial.print("Время чёрных закончилось");
    key = 3;
  }
}

 

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Но там же написано если одна кнопка нажата партия начинается.

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Огромное спасибо оно работает но там вывод немножко кривой я его доделаю, спасибо огромное. 

nik182
Онлайн
Зарегистрирован: 04.05.2015

Да, начинается с любой кнопки. Но по правилам чёрные должны нажать первыми. В программе это не контролируется. На совести играющих. И ещё было бы не плохо светодиоды повесить разного цвета, что бы было видно чей ход.
На счёт кривого вывода, последним в каждой выводной строке println должен быть.

Grib_arduino
Offline
Зарегистрирован: 31.08.2021

Да, ну дальше сделаю светодиоды и дисплей.