Создание функции - нубской вопрос

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Добрый день, корифеи

Возник вопрос при попытке вынести часть кода из loop в отдельную функцию. Так код выглядел первоначально и все (с точки зрения конечного результата) работало прекрасно - каждое нажатие кнопки генерит одно событие (отправка одной строки в com-порт):

void loop() {
  byte newKeyValue = getKeyValue();                                         // Получаем актуальное состояние кнопок с коррекцией дребезга
  if (newKeyValue != keyValue) {                                            // Если новое значение не совпадает со старым - реагируем на него
    keyValue = newKeyValue;                                                 // Актуализируем переменную хранения состояния
    if (keyValue > 0) {                                                     // Если значение больше 0, значит кнопка нажата
      Serial.print("Button ");
      Serial.print(keyValue);
      Serial.println(" pressed");
      beep(100);                                                            // пикаем
    }
  }
}

Так делаю и получается ерунда - нажатие кнопки генерит несколько десятков событий:

// Функция опроса кнопок
byte checkButtons () {
  byte newKeyValue = getKeyValue();                                         // Получаем актуальное состояние кнопок с коррекцией дребезга
  if (newKeyValue != keyValue) {                                            // Если новое значение не совпадает со старым - реагируем на него
    keyValue = newKeyValue;                                                 // Актуализируем переменную хранения состояния
    if (keyValue > 0) {                                                     // Если значение больше 0, значит кнопка нажата
      beep(100);                                                            // пикаем
    }
  }
  return keyValue;                                                          // возвращаем номер нажатой кнопки
}


void loop() {
  byte rrr = checkButtons ();
  if (rrr > 0) {                                                        // Если значение больше 0, значит кнопка нажата
    Serial.print("Button ");
    Serial.print(rrr);
    Serial.println(" pressed");
  }
}

Подскажите пожалуйста на какие грабли я наступил - сам уже весь мозг сломал...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что возвращает функция, если устовие в строке 4 не выполняется?

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Всегда возвращает keyValue...

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

ЕвгенийП пишет:

Что возвращает функция, если устовие в строке 4 не выполняется?

Чорд, ну да. Вот так заработало:

// Функция опроса кнопок
byte checkButtons () {
  byte newKeyValue = getKeyValue();                                         // Получаем актуальное состояние кнопок с коррекцией дребезга
  if (newKeyValue != keyValue) {                                            // Если новое значение не совпадает со старым - реагируем на него
    keyValue = newKeyValue;                                                 // Актуализируем переменную хранения состояния
    if (keyValue > 0) {                                                     // Если значение больше 0, значит кнопка нажата
      beep(100);                                                            // пикаем
      return keyValue;                                                      // возвращаем номер нажатой кнопки
    }
  }
  return 0;                                                                 // возвращаем номер нажатой кнопки
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, ото ж!

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

ЕвгенийП пишет:

Так, ото ж!

Спасибо!