Нужна помощь с функцией

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

Доброго времени друзья! Подскажите как вынести код в отдельную функцию и вызывать ее по названию. На пример:

Код: Выделить всё

if (событие) {та самая функция}
Краткое описание кода: по рандому зажечь светодиод, если соответствующая ему кнопка нажата, потушить.
Вот сам код:

Код: Выделить всё

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()

Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?
Реклама
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт ноя 11, 2016 09:17:49

Сообщение 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;
.........
}

Но это не то что надо, вопрос поставлен так что непонятно что надо вообще.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

[uquote="Аlex",url="/forum/viewtopic.php?p=4475422#p4475422"]Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?[/uquote]
Все что в loop вынести в отдельную функцию, как передавать в эту функцию нажатия кнопок?
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

rss-999 писал(а):Все что в loop вынести в отдельную функцию
loop - это уже отдельная функция.
rss-999 писал(а):как передавать в эту функцию нажатия кнопок?
В какую "эту" ? И что значит передать "нажатие кнопок" ? В функцию можно передавать переменные, в виде параметров. Физические явление передать туда невозможно.

Вы уверены, что понимаете свои вопросы ?
Реклама
Поставщик валерьянки для Кота
Сообщения: 1921
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

И попробуйте на C/C++ с label не писать код. Попробуйте напр. с флагами, break и т. д., немного измените логику и все будет готово.
Последний раз редактировалось veso74 Пн сен 11, 2023 16:21:13, всего редактировалось 2 раза.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15657
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У rss-999 уже штуки три подобных темы...
А тут еще помимо прочего с логической ошибкой - попробуй определи, сколько и каких кнопок нажато в данный момент.
Это же не позиционное сканирование, а аналоговый набор...
Посему если среди случайной комбинации попалась "истинная" кнопа - выявить невозможно будет.
8)
Об "некорректностях", кочующих из темы в тему, уже говорить надоело...
:sleep:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение 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()
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение 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.
Контактная информация:
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

Сообщение linkov1959 »

[uquote="rss-999",url="/forum/viewtopic.php?p=4475934#p4475934"]Разобрался как сделать, работает. Всем спасибо.
Остался вопрос, иногда считывается 2-3 нажатия вместо 1, как это исправить.
[/code][/uquote]
Вот с этого надо было начинать...
Ответить

Вернуться в «Arduino»