Использовать кнопку на экране, чтобы приостановить ввод кода.

lcd

Я создаю устройство регистрации температуры с термопарой K и разъемом для SD-карты, а также комплектом ЖК-экрана RGB с символьным дисплеем 16x2 (с кнопками).

Все работает нормально: отображение температуры на ЖК-дисплее и запись в текстовый файл на карте micro SD работают хорошо

Теперь я пытаюсь настроить кнопку на щите

  1. кнопка ВВЕРХ для сброса измерений и таймера, работает
  2. Кнопка
  3. Вниз позволяет приостановить измерения, затем при повторном нажатии продолжить измерения. Я не знаю, как это сделать (как выйти из условия while).

     if (buttons) {
    
    if (buttons & BUTTON_UP) {
    
      lcd.clear();
      lcd.print("RESET ");
      if (SD.exists("datalog.txt")) {
    
        SD.remove("datalog.txt");
        File dataFile = SD.open("datalog.txt", FILE_WRITE);
      }
    
      else {
    
        // открываем файл. обратите внимание, что одновременно может быть открыт только один файл,
        // поэтому вам придется закрыть этот файл, прежде чем открывать другой.
        File dataFile = SD.open("datalog.txt", FILE_WRITE);
        // если файл доступен, пишем в него:
    
      }
     StartTime = millis();
    
      delay(500);
    
    }
    if (buttons & BUTTON_DOWN) {
      lcd.clear();
      lcd.print("STOP");
      while (buttons & BUTTON_DOWN){
    
          ;
      }
    

Я уже благодарю вас за помощь

Винсент

, 👍0

Обсуждение

подумайте о своих первых двух операторах «если»... почему вы тестируете «кнопки» во втором операторе «если»? .... вы уже протестировали его в первом операторе if .... то же самое с последним оператором if ..... также проверьте оператор while (buttons & BUTTON_DOWN){ внизу. .... думаете ли вы, что значения buttons и BUTTON_DOWN когда-нибудь изменятся? ....если вы думаете, что они изменятся, то что их меняет?, @jsotola

Этот способ тестирования кнопок взят из примера, приведенного с библиотекой экранов RGB LCD от adafruit. Я старался не тестировать повторно «кнопки» в операторе IF после первого if(buttons), но на ЖК-дисплее отображаются все операторы следующего if(BUTTON_DIRECTION), как будто все тесты if дают TRUE. Извините, сложно внести ясность., @Vincent


1 ответ


Лучший ответ:

0

Вы не говорите много о том, как оценивается значение buttons или его тип данных, но предполагается, что это числовая переменная, которая каким-то образом устанавливается, скажем, с помощью readButtons(), а затем рассмотрите следующий фрагмент, заменяющий ваш while-loop:

do {
  delay(10);
  // переоцениваем все, что устанавливает переменную кнопок
  buttons = readButtons();
while(!(buttons & BUTTON_DOWN));

Приведенный выше цикл будет продолжаться до тех пор, пока не будет нажата кнопка вниз, и он немного устойчив к отскоку контактов, но не на 100% надежен, поэтому я предполагаю, что readButtons() также выполняет некоторое устранение дребезга.

р>
,

Спасибо, Роберто, ты все правильно понял. Я использую библиотеку LCD Shield с функцией lcd.readButtons., @Vincent

@Винсент, если это решит вашу проблему, пожалуйста, примите ответ, чтобы другие могли использовать его в качестве справочного материала., @Roberto Lo Giacco