Страница 1 из 1
Нужна помощь с функцией
Добавлено: Вс сен 10, 2023 13:54:43
rss-999
Доброго времени друзья! Подскажите как вынести код в отдельную функцию и вызывать ее по названию. На пример:
Краткое описание кода: по рандому зажечь светодиод, если соответствующая ему кнопка нажата, потушить.
Вот сам код:
Код: Выделить всё
int key() {
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 p, r, c;
long randNumber;
void setup() {
Serial.begin(9600);
//pinMode(A5, INPUT_PULLUP);
for (p = 3; p < 15; p++) {
pinMode(p, OUTPUT);
digitalWrite(p, LOW);
}
}
void loop() {
label:
randNumber = random(3, 14);
if (r == randNumber) { goto label; }
r = randNumber;
digitalWrite(randNumber, HIGH); // включает светодиод
for (c = 0; c < 22222; c++) { // цикл-таймер
if (randNumber == key()) {
digitalWrite(randNumber, LOW);
Serial.print("button");
Serial.print(":");
Serial.println(key());
delay(100);
goto label;
} else if (key() != 0 && randNumber != key()) {
Serial.print("!button");
Serial.print(":");
Serial.println(key());
digitalWrite(randNumber, LOW);
delay(100);
goto label;
} //else if
} //for
} //void loop()
Re: Нужна помощь с функцией
Добавлено: Вс сен 10, 2023 20:04:28
Аlex
Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?
Re: Нужна помощь с функцией
Добавлено: Пн сен 11, 2023 10:01:23
ELECTROS
[uquote="rss-999",url="/forum/viewtopic.php?p=4475276#p4475276"]Доброго времени друзья! Подскажите как вынести код в отдельную функцию и вызывать ее по названию. На пример: if (событие) {та самая функция}[/uquote]
goto уберите, а вместо while(){} и break используйте например;
Функцию вызова чтения клавиатуры что то типа такого можно, для инвертирования светика
Код: Выделить всё
switch(key() ){
case 0: LED1_TOGGLE;break;
case 1: LED2_TOGGLE;break;
.........
}
Но это не то что надо, вопрос поставлен так что непонятно что надо вообще.
Re: Нужна помощь с функцией
Добавлено: Пн сен 11, 2023 12:16:51
rss-999
[uquote="Аlex",url="/forum/viewtopic.php?p=4475422#p4475422"]Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?[/uquote]
Все что в loop вынести в отдельную функцию, как передавать в эту функцию нажатия кнопок?
Re: Нужна помощь с функцией
Добавлено: Пн сен 11, 2023 13:09:02
Аlex
rss-999 писал(а):Все что в loop вынести в отдельную функцию
loop - это уже отдельная функция.
rss-999 писал(а):как передавать в эту функцию нажатия кнопок?
В какую "эту" ? И что значит передать "нажатие кнопок" ? В функцию можно передавать переменные, в виде параметров. Физические явление передать туда невозможно.
Вы уверены, что понимаете свои вопросы ?
Re: Нужна помощь с функцией
Добавлено: Пн сен 11, 2023 16:08:50
veso74
И попробуйте на C/C++ с label не писать код. Попробуйте напр. с флагами, break и т. д., немного измените логику и все будет готово.
Re: Нужна помощь с функцией
Добавлено: Пн сен 11, 2023 16:17:04
BOB51
У
rss-999 уже штуки три подобных темы...
А тут еще помимо прочего с логической ошибкой - попробуй определи, сколько и каких кнопок нажато в данный момент.
Это же не позиционное сканирование, а аналоговый набор...
Посему если среди случайной комбинации попалась "истинная" кнопа - выявить невозможно будет.
Об "некорректностях", кочующих из темы в тему, уже говорить надоело...

Re: Нужна помощь с функцией
Добавлено: Вт сен 12, 2023 07:11:37
rss-999
Разобрался как сделать, работает. Всем спасибо.
Остался вопрос, иногда считывается 2-3 нажатия вместо 1, как это исправить.
Вот код если кому интересно
Код: Выделить всё
int key() {
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 key()
int abc() {
int r, c;
long randNumber;
label:
randNumber = random(3, 14);
if (r == randNumber) {goto label;}
r = randNumber;
digitalWrite(randNumber, HIGH); // включает светодиод
for (c = 0; c < 22222; c++) { // цикл-таймер
if (randNumber == key()) {
digitalWrite(randNumber, LOW);
delay(100);
continue;
} else if (key() != 0 && randNumber != key()) {
digitalWrite(randNumber, LOW);
delay(100);
continue;
} //else if
} //for
} //int abc()
void setup() {
Serial.begin(9600);
randomSeed(analogRead(17));
for (int p = 3; p < 15; p++) {
pinMode(p, OUTPUT);
digitalWrite(p, LOW);
}
}
void loop() {
abc();
} //void loop()
Re: Нужна помощь с функцией
Добавлено: Вт сен 12, 2023 16:14:01
Martian
Код: Выделить всё
for (c = 0; c < 22222; c++) { // цикл-таймер
if (randNumber == key()) {
digitalWrite(randNumber, LOW);
delay(100);
continue;
} else if (key() != 0 && randNumber != key()) {
digitalWrite(randNumber, LOW);
delay(100);
continue;
} //else if
} //for
если
continue; убрать, что будет?
если
if (randNumber == key()) не сработало, надо ли потом проверять
randNumber != key(), каковы шансы, что что-то изменилось и ещё раз проверить надо? Если в обоих вариантах одно и тоже, нужны ли оба?
Код: Выделить всё
int abc() {
int r, c;
long randNumber;
label:
randNumber = random(3, 14);
if (r == randNumber) {goto label;}
r = randNumber;
Вы уверены, что переменная, так объявленная внутри функции, сохранит своё значение при следующем вызове? Прочитайте про static.
Re: Нужна помощь с функцией
Добавлено: Вт сен 12, 2023 21:04:51
linkov1959
[uquote="rss-999",url="/forum/viewtopic.php?p=4475934#p4475934"]Разобрался как сделать, работает. Всем спасибо.
Остался вопрос, иногда считывается 2-3 нажатия вместо 1, как это исправить.
[/code][/uquote]
Вот с этого надо было начинать...