Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2015, 17:48   #11
zhenek_kreker
Новичок
Джуниор
 
Регистрация: 22.12.2015
Сообщений: 6
По умолчанию

Не помогает
В общем, сегодня после работы попробую с ручкой в руках на бумаге описать как программа действует. Буду признателен, если сумеет помочь. Вообще какая обычная тактика в таких случаях? Я так понимаю, что у меня ошибка может быть во всех трёх функциях: debounce(), setMode() и Blink(). Есть смысл их отлаживать по отдельности? Вынести, например, код Blink() в отдельную программу, которая бы моргала диодом безотносительно кнопки? Извините за нубские вопросы.
P.S. Надо было в институте не прогуливать программирование, блин.
zhenek_kreker вне форума Ответить с цитированием
Старый 22.12.2015, 18:08   #12
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Я тоже на работе сейчас, забыл ноут свой дома, так что сижу со смартфона за двумя рабочими компами . Скучно, делать нечего
В данном случае будет достаточно простейшего автомата. Если никто не ответит, то как приду домой, постараюсь объяснить. Конечно, всю теорию автоматов я не осилю, но простейший алгоритм вполне
Croessmah вне форума Ответить с цитированием
Старый 22.12.2015, 23:14   #13
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Схема та же, что и у Вас. Сделал на три режима. Режимы меняют друг друга по очереди при нажатии кнопки.
Код:
int ButtonPin = 2;
int LedPin = 3;
boolean ledState = false ;
long mode1_interval = 100 ;
long mode2_interval = 300 ;
long mode3_interval = 700 ;


enum STATES
{
  START,
  MODE1,
  MODE2,
  MODE3
} ;


//Установка состояния светодиода
void set_led_state(boolean state)
{
  ledState = state;
  digitalWrite(LedPin, state);
}


//Возвращает состояние светодиода
boolean get_led_state()
{
  return ledState;
}




void setup()
{
  pinMode(LedPin, OUTPUT);
  pinMode(ButtonPin, INPUT);
  set_led_state(false);//Светилище выключено
}



//Функция определяет наличие сигнала на указанном входе.
boolean is_push(int pin)
{
  boolean state = digitalRead(pin);//Читаем состояние входа
  delay(10);//Задержка для сглаживания "дребезга". Поставил в 10, как у Вас.
  return (state && digitalRead(pin));//Читаем состояние снова и логическим И определяем было ли нажатие или это дребезг
}



void Blink(long interval, int LedPin)
{
  static long prev_time = 0 ;//Предыдущее время
  long time = millis();
  if( time - prev_time > interval ){
    prev_time = time;
    set_led_state(!get_led_state());//Инвертируем состояние светодиода
  }
}


//Обработчик режима 1
void mode1_handler()
{
  Blink(mode1_interval, LedPin);
}


//Обработчик режима 2
void mode2_handler()
{
  Blink(mode2_interval, LedPin);
}


//Обработчик режима 3
void mode3_handler()
{
  Blink(mode3_interval, LedPin);
}


//Изменения режима и возврат текущего режима
int state_logic(boolean change)
{
  static STATES state = START;//Начальный режим - START
  if(change){//Если режим необходимо сменить на следующий, то
    switch(state)//Смотрим какой сейчас режим включен
    {
    case START://Если START, 
      state = MODE1;//то меняем на MODE1
      break;
    case MODE1://Если MODE1, 
      state = MODE2;//то меняем на MODE2
      break;
    case MODE2://Если MODE2, 
      state = MODE3;//то меняем на MODE3
      break;
    case MODE3://Если MODE3, 
      state = MODE1;//то меняем на MODE1
      break;
    default://Во всех остальных случаях (ну может возникнут)
      state = START;//Возвращаемся к исходному режиму
    };
    set_led_state(false);//Гасим лампочку
  }
  return state;
}



//Функция определяет нужно ли сменить состояние
boolean need_change_state()
{
  static boolean lastButtonState = false;//Начальное состояние кнопки - выключена
  boolean push = is_push(ButtonPin) ;//Нажата ли кнопка?
  boolean change_state = push && !lastButtonState;//Кнопка нажата, а до этого была отжата???
  lastButtonState = push ;//Меняем состояние кнопки на текущее
  return change_state ;//возвращаем флаг необходимости смены режима
}



void loop()
{
  //Определяем какой режим включен
  //Передаем результат
  //need_change_state в state_logic
  //Для смены режима при необходимости
  switch(state_logic(need_change_state()))
  {
  case START://Если режим START, то
    break;//Ничего
  case MODE1://Если режим MODE1, то
    mode1_handler();//Запускаем обработчик режима 1
    break;
  case MODE2://Если режим MODE2, то
    mode2_handler();//Запускаем обработчик режима 2
    break;
  case MODE3://Если режим MODE3, то
    mode3_handler();//Запускаем обработчик режима 3
    break;
  };
}
конечно, много перемудрил, потому как особо не заморачивался.
Конечно, абстракции и структуру кода нужно сделать получше.
Тестировал на UNO R3
Croessmah вне форума Ответить с цитированием
Старый 23.12.2015, 10:58   #14
zhenek_kreker
Новичок
Джуниор
 
Регистрация: 22.12.2015
Сообщений: 6
По умолчанию

Спасибо огромное!
Ваша логика программы довольно сильно отличается от моей. Я, кстати, вчера сумел заставить свою функцию Blink() работать - вы были правы, потребовалось вынести переменную LED_STATE в глобальные.
P.S. И ещё для меня стала открытием конструкция enum

Последний раз редактировалось zhenek_kreker; 23.12.2015 в 11:00.
zhenek_kreker вне форума Ответить с цитированием
Старый 23.12.2015, 17:22   #15
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Спасибо огромное!
Да пожалуйста, обращайтесь. Забыл выключить, почти сутки уже моргает
Цитата:
стала открытием конструкция
всё бывает в первый раз.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последовательная обработка одинарного и двойного нажатия левой кнопки мышкис KBO Помощь студентам 17 18.11.2015 18:02
Эффект нажатия кнопки -Jack- Общие вопросы Delphi 6 14.03.2014 00:55
Обработка нажатия динамической кнопки Mr_freeman PHP 10 28.11.2011 23:45
Обработка события нажатия кнопки masm Microsoft Office Access 6 22.08.2011 11:21
Обработка нажатия кнопки на форме myprog Microsoft Office Access 8 17.12.2010 22:37