Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

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

Вс сен 10, 2023 13:54:43

Доброго времени друзья! Подскажите как вынести код в отдельную функцию и вызывать ее по названию. На пример:
Код:
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()

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

Вс сен 10, 2023 20:04:28

Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?

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

Пн сен 11, 2023 10:01:23

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

goto уберите, а вместо while(){} и break используйте например;
Функцию вызова чтения клавиатуры что то типа такого можно, для инвертирования светика
Код:
switch(key() ){
case 0:  LED1_TOGGLE;break;
case 1:  LED2_TOGGLE;break;
.........
}


Но это не то что надо, вопрос поставлен так что непонятно что надо вообще.

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

Пн сен 11, 2023 12:16:51

Приведённый Вами код уже состоит из нескольких функций.
Какой конкретно код хотите вынести в отдельную функцию ? И зачем ?

Все что в loop вынести в отдельную функцию, как передавать в эту функцию нажатия кнопок?

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

Пн сен 11, 2023 13:09:02

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

Вы уверены, что понимаете свои вопросы ?

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

Пн сен 11, 2023 16:08:50

И попробуйте на C/C++ с label не писать код. Попробуйте напр. с флагами, break и т. д., немного измените логику и все будет готово.
Последний раз редактировалось veso74 Пн сен 11, 2023 16:21:13, всего редактировалось 2 раз(а).

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

Пн сен 11, 2023 16:17:04

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

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

Вт сен 12, 2023 07:11:37

Разобрался как сделать, работает. Всем спасибо.
Остался вопрос, иногда считывается 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

Код:
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

Разобрался как сделать, работает. Всем спасибо.
Остался вопрос, иногда считывается 2-3 нажатия вместо 1, как это исправить.
[/code]

Вот с этого надо было начинать...
Ответить