| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Скрипт должен ждать второго нажатия кнопки https://radiokot.ru/forum/viewtopic.php?f=66&t=193498 |
Страница 1 из 1 |
| Автор: | rss-999 [ Пн май 20, 2024 18:21:31 ] |
| Заголовок сообщения: | Скрипт должен ждать второго нажатия кнопки |
Доброго времени суток, уважаемые форумчане. Прошу помощи с решением задачи. Алгоритм скрипта ниже задумывался таким: 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() |
|
| Автор: | Martian [ Пн май 20, 2024 18:45:09 ] |
| Заголовок сообщения: | Re: Скрипт должен ждать второго нажатия кнопки |
У Вас слишком много ветвлений goto, притом длинных и запутанных. Да ещё из тела одного цикла в тело другого? Код: 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()) { Вы уже определили, что k не равно key(), зачем ещё раз писать k != key()?... } else if (key() != 0 && k != key()) { И напишите подробные комментарии. "Цикл2 Малый цикл" - этот комментарий непонятен никому, а через пару недель не будет понятен и Вам. И ещё: Serial.Print() не требуется в таком количестве. Вот это: Код: Serial.print("----------"); Serial.print("n:"); Serial.println(n); эквивалентно Код: Serial.println("----------" + "n:" + String(n)); // возможно, приведение к типу будет лучше: (String)(n) Сократите их до одного вызова в каждом нужном месте. Это сделает Ваш код более читабельным. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


