Опрос кнопок в loop как правильно?

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 14 ноя 2020.

  1. Максим B

    Максим B Гуру

    Всем добрый вечер. Сижу уже не первый час и пока не догоняю как сделать праивильно.
    Кнопки подключены к PT6961 - написана функция которая успешно сканирует коды и выводит результат в консоль в зависимости от нажатой кнопки.

    На дисплей вывожу часы. При нажатии кнопки хочу установить время (В будущем), сейчас хотя бы просто выводить текст, но без задержек.

    Код (Text):


    void readKeyData(uint16_t * data) {
         
        digitalWrite(strobePin, LOW);  //
        digitalWrite(clockPin, LOW);
        digitalWrite(dataPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, 0x42);  // чтение данных
        delayMicroseconds(1);
        *data = shiftIn(DOUT, clockPin, LSBFIRST) + (shiftIn(DOUT, clockPin, LSBFIRST) << 8);
        digitalWrite(strobePin, HIGH);  //
        digitalWrite(clockPin, HIGH);
        digitalWrite(dataPin, HIGH);
    }

    void loop()
    {
     
     printTime();
     ledDisplay.toggleColon();
     delay (1000);  
     ledDisplay.toggleColon();
     delay(1000);
     ledDisplay.reset();

     readKeyData(& newKeys);
     if (keys != newKeys) {
        keys = newKeys;
        if (keys & KEY_1)
        {
         Serial.println("Key1");
         
        }
        if (keys & KEY_2)
        {
          Serial.println("Key2");
        }
     }
    }
     
     
    Понятно, что пока не выполнятся первые 6 строк кода, не смогу нажать кнопки ((( как исправить, чтобы время отображалось и опрос кнопок был быстрее?? СПАСИБО
     
  2. akl

    akl Гуру

  3. Максим B

    Максим B Гуру

  4. Asper Daffy

    Asper Daffy Иксперд

    Ну, получается же! А "сила" - дело наживное. Тренировки, здоровый образ жизни, вот силы и прибавятся.
     
  5. Максим B

    Максим B Гуру

    Просто пока не очень понимаю, как разграничить выполнение нескольких блоков (функций), у меня их 4. Одна выводит время, другая слушает ИК приемник, 3-я отпарвляет команды на радиомодуль, 4-я слушает кнопки. Без кнопок - работает, но захотел добавить кнопки и все ((( Может как используют прерывания для чтения кнопок?
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Может, и использовать.
     
  7. b707

    b707 Гуру

    Не надо вам прерывание, для вас прерывание - костыль. Вам надо научится выполнять много задач одновременно, тогда кнопки будут работать мгновенно без всяких прерываний.
    Изучите пример , что вам дали в сообщении #2 - решение в нем
     
  8. parovoZZ

    parovoZZ Гуру

    А что это?
     
  9. Airbus

    Airbus Радиохулиган Модератор

    Микросхема кодек команд для удаленного управления. Типо мк с жостко запрограммироваными кодами. Как раньше часовые микросхемы были
     
  10. Nekto_nikto

    Nekto_nikto Гик

    В таких случаях лучше обратиться к теории операционных систем, в частности раздел "многозадачность". В операционках многозадачность обеспечивают планировщики, которые распределяют процессорное время между процессами системы, в зависимости от их приоритета в системе, если коротко. Ну и в вашем случае естественно сначала выполняется планировщик, который по очереди будет подрубать ту или иную функцию/процедуру, в зависимости от внешних условий, например в зависимости от наличия сигнала на кнопках.
    Мне это видится так.
     
    parovoZZ нравится это.
  11. parovoZZ

    parovoZZ Гуру

    Igor68 нравится это.
  12. SergeiL

    SergeiL Оракул Модератор

    Ну назвать это проектом - ты погорячился.
    Там же история от того, кто не выложил ни одного рабочего кода на этом форуме.
    Ну вот кому могут быть интересны отдельные куски кода для Паровозодурины©, которые даже скомпилировать нельзя?
    Ну и вот как эта тема "типа проекта" поможет ТС?
    У него же setup() и loop().
     
    Последнее редактирование: 15 ноя 2020
  13. parovoZZ

    parovoZZ Гуру

    А кто-то выложил?
    И откуда такие обязанности?
     
  14. SergeiL

    SergeiL Оракул Модератор

    Много кто.
    Ну проектом это же точно не назовешь. Так отдельные мысли в слух...
     
  15. parovoZZ

    parovoZZ Гуру

    меня конкретно интересует @SergeiL
     
  16. SergeiL

    SergeiL Оракул Модератор

    Конечно, ты же сам спрашивал мой ли это код :)
     
  17. SergeiL

    SergeiL Оракул Модератор

    Ну ты так и не ответил, как указанная тема поможет ТС.
    Он про loop() спрашивал.
     
  18. Максим B

    Максим B Гуру

    Всем спасибо за ответы. Вот мой весь код как есть: "https://github.com/maksmkv/PT6961/blob/main/vse_rejimu_with_button_WORK.ino" . Код компилится, все работает. Вся сложность в том, что кнопки подключены к PT6961 и через чтение регистров я их опрашиваю. Вовремя опроса, экран мигает, чтение кнопок тоже происходит после того как прошли все функции отображения и прочего. На данном форуме и форуме arduin* подсказали использовать millis, но как это может помочь при считывании кнопок с друго МК пока не понимаю ((( . Кнопки считываю с порта 4 DOut PT6961 - принимаю на arduino c 5 порта.
     
  19. b707

    b707 Гуру

    какая разница, откуда считывать кнопки - с этого или другого МК... да и вообще нет разницы, кнопки это, или например сигнал датчика... или запрос по сети.
    Суть примера на миллис - показать как эффективно разделять контроллерное время между несколькоми задачами, которые должны выполнятся в одно время. В вашем случае это кнопки и мигание точками на часах. Пример на миллис отлично подходит к вашей задаче
     
  20. akl

    akl Гуру

    миллис нужно чтобы избавиться от делеев. если оно нужно.

    то что экран мигает во время опроса кнопок возможно связано с тем, что у микросхемы за опрос кнопок и зажигание серментов отвечают одни и те же ноги