Например TDA7294

Форум РадиоКот • Просмотр темы - Скрипт должен ждать второго нажатия кнопки
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Сб июл 27, 2024 20:14:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Скрипт должен ждать второго нажатия кнопки
СообщениеДобавлено: Пн май 20, 2024 18:21:31 
Родился

Зарегистрирован: Вт авг 15, 2023 06:46:22
Сообщений: 17
Рейтинг сообщения: 0
Доброго времени суток, уважаемые форумчане. Прошу помощи с решением задачи.
Алгоритм скрипта ниже задумывался таким:
1. на проходе цикла n-раз сгенерировать переменную.
1.1 поместить ее в массив
1.2 подать высокий сигнал на соответствующий пин.
2. считать нажатие кнопки
2.1 если номер кнопки соответствует цифре в массиве, увеличить n на 1 и т.д.
2.2 если n больше 2, после нажатия 1й кнопки и верного сравнения с записью в массиве, ждать нажатие второй кнопки и сравнить её с соответствующей ячейкой в массиве, после чего увеличить n на 1.
На деле выходит, что после первого нажатия кнопки, скрипт не ждет второго нажатия а сразу считает что была нажата эта же кнопка, что автоматически сбрасывает n на 1
в Wokwi скрипт работает как надо, там и писался, на плате, увы нет.
Код:
int lastButton = 0;
int key() {
  int val = analogRead(5);
  if (val != lastButton) {
    delay(10);  // Ждем пока состояние стабилизируется - игнорируем дребезг
    int val = analogRead(5);
  }
  if (val < 50) return 3;
  else if (val < 513) return 4;
  else if (val < 683) return 5;
  else if (val < 768) return 6;
  else if (val < 819) return 7;
  else if (val < 853) return 8;
  else if (val < 878) return 9;
  else if (val < 896) return 10;
  else if (val < 910) return 11;
  else if (val < 922) return 12;
  else if (val < 931) return 13;
  else if (val < 939) return 14;
  else return 0;

int r, c, n, i, j, q, w, u, l, t, ww;
int arr[50];
long randNumber;
int game2() {
labelNO:
  for (q = 0; q < 10; q++) {  // Цикл1 Большой цикл
    n++;
    t = t - ((t / 100) * 5);  // t + 5%
    Serial.print("----------");
    Serial.print("n:");
    Serial.println(n);
    for (i = 0; i < n; i++) {  // Цикл2 Малый цикл
label:
      randNumber = random(3, 14);
      if (r == randNumber) {
        goto label;
      }
      r = randNumber;
      arr[i] = randNumber;
      digitalWrite(randNumber, HIGH);
      delay(t);
      digitalWrite(randNumber, LOW);
      Serial.print("randNumber:");
      Serial.println(randNumber);
    }
label2:
    for (w = 0; w < n; w++) {
      int k = arr[w];
      for (ww = 0; ww < 55555; ww++) {  // Цикл таймер
        if (k == key()) {
          Serial.println("OK");
          Serial.print("arr[w]: ");
          Serial.println(k);
          Serial.print("key(): ");
          Serial.println(key());
          digitalWrite(key(), HIGH);
          delay(50);
          digitalWrite(key(), LOW);
          break;
        } else if (key() != 0 && k != key()) {
          Serial.println("NO");
          Serial.print("arr[w]: ");
          Serial.println(k);
          Serial.print("key(): ");
          Serial.println(key());
          digitalWrite(key(), HIGH);
          delay(50);
          digitalWrite(key(), LOW);
          Serial.println(analogRead(0));
          n = 0;
          goto labelNO;
        }
      }  //for (ww
    }    //for (w
  }      //Цикл1 Большой цикл
}

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(17));
  n = 0;
  t = 500;
}
void loop() {
  game2();
}  //void loop()


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Скрипт должен ждать второго нажатия кнопки
СообщениеДобавлено: Пн май 20, 2024 18:45:09 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 1602
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 11434
Рейтинг сообщения: 0
У Вас слишком много ветвлений goto, притом длинных и запутанных. Да ещё из тела одного цикла в тело другого? :shock: Нельзя так. Постарайтесь избавиться от них или минимизировать. Например:
Код:
for (i = 0; i < n; i++) {  // Цикл2 Малый цикл
      do
      {
         randNumber = random(3, 14);
      } while (arr[i] != randNumber);
      arr[i] = randNumber;
      digitalWrite(randNumber, HIGH);
      delay(t);
      digitalWrite(randNumber, LOW);
      Serial.print("randNumber:");
      Serial.println(randNumber);
    }


Даже лишняя переменная r исчезла. И randNumber, возможно, тоже не нужна
и почему у
Код:
int arr[50];
long randNumber;

разные типы?
Ведь затем
Код:
arr[i] = randNumber;

а между тем, это разные типы и на разных ардуинах у них будет разный размер. Нельзя так нагло делать... А если планируется, что там числа в диапазоне 3...14, то почему бы не использовать 8-битный тип, которого хватит более чем?

Далее:
Код:
int game2()
у функции game2() объявлен тип возвращаемого результата, но нигде в функции нет return int;

Код:
if (k == key()) {
...
        } else if (key() != 0 && k != key()) {
Вы уже определили, что k не равно key(), зачем ещё раз писать k != key()?

И напишите подробные комментарии. "Цикл2 Малый цикл" - этот комментарий непонятен никому, а через пару недель не будет понятен и Вам.

И ещё: Serial.Print() не требуется в таком количестве. Вот это:
Код:
Serial.print("----------");
    Serial.print("n:");
    Serial.println(n);

эквивалентно
Код:
Serial.println("----------" + "n:" + String(n)); // возможно, приведение к типу будет лучше: (String)(n)

Сократите их до одного вызова в каждом нужном месте. Это сделает Ваш код более читабельным.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y