ЭТО ПРОСТО...

Тема в разделе "Arduino & Shields", создана пользователем ИванМорозов, 12 мар 2017.

  1. Добрый день . Учусь , не ругать. Помогите добавить кнопку , чтобы при нажатие на ее счетчик который в мониторе порта останавливался и при нажатие опять же на нее продолжал идти.
    Код (C++):
    void setup()
    {
      Serial.begin(9600);
    }

    void loop ()


     
    {
      for (int code = 0; code < 60; code++)
     
        for (int r = 0; r <20; r++)
       
       
        Serial.println(code);
        Serial.print("  ");
       
       
      }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    добавь в скетч реакцию на нажатие кнопки (например, вывод фразы "Button"), дальше поможем.
     
  3. NikitOS

    NikitOS Король шутов Администратор

    слова помогите со скетчем и т д = напишите его за меня;)
     
    Tomasina нравится это.
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    не всегда, иногда попадаются действительно те, кто хочет что-то понять и разобраться.
     
  5. mcureenab

    mcureenab Гуру

    Кнопка это пин, например 5 в режиме INPUT или лучше INPUT_PULLUP, если речь идет о простой тактовой кнопке.
    Для удобства конфигурирования программы объявляем макрос с номером пина 5.
    Код (C++):
    #define MY_BUTTON 5
    в функции setup() настраиваем пин с кнопкой на адекватный режим

    Код (C++):
    pinMode( MY_BUTTON, INPUT_PULLUP);
    обычно после первоначальной настройки режим пина не меняется, но это не обязательно так.

    Где от в функции loop() читаем состояние пина с кнопкой. LOW или HIGH. Поскольку пин в режиме INPUT_PULLUP притянут к уровню напряжения HIGH, то замыкание кнопки нужно делать на GND и получать уровень LOW.

    Код (C++):
    if(LOW == digitalRead(MY_BUTTON))
    {
    // Кнопка нажата. Что то делаем...
    ...
    }
    Чтобы реагировать именно на нажатие кнопки нужен код посложнее.
    Попробуйте пока реагировать на удержание кнопки.
     
  6. Ну со светодиодном я у же играл , и при удержание кнопки светодиод загорается и просто на нажатие , а вот как чтобы остановить и возобновить Таймер я так и не понял . Гуглил, читал о прирывание , но так и не получилось , таймер начинал с начала
     
  7. rkit

    rkit Гуру

    while(digitalRead(button_pin)){};
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    зачем прерывания и таймеры? Просто заводим еще одну переменную типа boolean. При каждом нажатии кнопки она меняется на противоположную.
    Далее смотрим, если сейчас переменная равна true, то счетчику разрешено считать, если равна false, то отсчет пропускаем.
     
  9. mcureenab

    mcureenab Гуру

    Тогда...
    Чтобы обнаружить нажатие кнопки, нужно сохранить сравнить текущее состояние к нопки с предыдущим. Если оно изменилось с HIGH на LOW, значит кнопка нажата.

    В функции loop() объявляем регистр для предыдущего состояния кнопки и для текущего состояния кнопки

    Код (C++):
    static char btn_prior_state = HIGH; // Изначально кнопка не нажата.
    char btn_state = digitalRead(MY_BUTTON);
    static bool do_count = false;

    if( HIGH == btn_prior_state && LOW == btn_state ) { // Произошел переход кнопки?
    // что то делаем. обычно переход конечного автомата
    // тут автомат из двух состояний, поэтому используем bool переменную.
      do_count = !do_count;
     
    }
    btn_prior_state = btn_state;
    // отрабатываем состояние конечного автомата
    if ( do_count ){
    // что то считаем
    } else {
    // что то не считаем
    }
     
  10. mcureenab

    mcureenab Гуру

    добавим подавление дребезга контакта

    Код (C++):
    static char btn_prior_state = HIGH; // Изначально кнопка не нажата.
    char btn_state = digitalRead(MY_BUTTON);
    static bool do_count = false;

    if( HIGH == btn_prior_state && LOW == btn_state ) { // Произошел переход кнопки?
    // что то делаем. обычно переход конечного автомата
    // тут автомат из двух состояний, поэтому используем bool переменную.
      do_count = !do_count;
      delay(10); // для подавления дребезга контакта.
    }
    btn_prior_state = btn_state;
    // отрабатываем состояние конечного автомата
    if ( do_count ){
    // что то считаем
    } else {
    // что то не считаем
    }
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #define MY_BUTTON 5
    int code = 0;
    boolean enableCounter;

    void setup()
    {
      Serial.begin(9600);
      pinMode(MY_BUTTON, INPUT_PULLUP);
      enableCounter = true;
    }

    void loop ()
    {
      if (LOW == digitalRead(MY_BUTTON))   // кнопка нажата
      {
        enableCounter = !enableCounter;    // меняем состояние переменной на противоположное
        while (!digitalRead(MY_BUTTON));   // ждем пока отпустят кнопку
      }

      if (true == enableCounter)           // если отсчет разрешен
      {
        code++;                            // увеличиваем счетчик
        if (code >= 60) code = 0;          // пограничные условия
        Serial.println(code);
        delay(200);
      }
    }
     
  12. Ага, ага.....завтра попробую
     
  13. Спасибо тебе огромное :)
     
  14. ostrov

    ostrov Гуру