Как приостановить цикл loop

Как я можно закодировать этот цикл, чтобы, когда я нажимаю кнопку, все останавливалось (верньер перестает считывать температуру), а затем, когда я снова нажимаю кнопку, она (считыватель верньера) начинает работать.

   #include "VernierLib.h"
    VernierLib Vernier;
    #define led 13
    #define button 12
    int switchState = 0;
    float sensorReading;
    void setup() {
      Serial.begin(9600);
      Serial.println(Vernier.sensorName());
      Vernier.autoID();
      pinMode(12, INPUT);
    }
    void loop() {
      static float base_temp = 0;
      static float t = 0;
      t = Serial.parseFloat();
      if (t != 0) {
        base_temp = t;
      }
      sensorReading = Vernier.readSensor();
      Serial.print(sensorReading);
      Serial.print(" ");
      Serial.println(Vernier.sensorUnits());
      Serial.print("Željena temperatura: ");
      Serial.println(base_temp);
      if (base_temp > sensorReading) {
        digitalWrite(led, HIGH);
      } else {
        digitalWrite(led, LOW);
      }
      delay(1500);
    }

, 👍1


2 ответа


1

Для чтения кнопки я предлагаю использовать библиотеку Bounce2. Затем вы можете подключить кнопку к подходящему цифровому контакту, а другую сторону - к земле. Использование

button.attach( BUTTON_PIN ,  INPUT_PULLUP );

Чтобы использовать внутреннее подтягивание Arduino. Определите глобальную переменную состояния, которая определяет, должен ли ваш код выполняться или нет.

bool code_running = true;

Затем в вашем основном коде (в дополнение к вызову функции обновления библиотеки) используйте

if(button.fell()){
    code_running = !code_running;
}

для переключения переменной состояния на нажатие кнопки. Затем, все еще находясь в void loop(), используйте оператор if с переменной state для выполнения кода:

if(code_running){
    // поместите свой код здесь
}

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

,

Да, я написал это, как вы сказали, но потом я получаю ошибку в "button.attach(BUTTON_PIN, INPUT_PULLUP). Я написал это так: button.attach(button, INPUT)`. Ошибка гласит: "запрос на член 'attach' в '12' // (я определил кнопку для вывода 12), который имеет неклассовый тип 'int'" Что это значит?, @OtGreat

Код, который я показал, взят из примеров библиотеки Bounce2. button - это экземпляр этого класса, а не PIN, как вы пытались. Пожалуйста, обратитесь к примерам, прилагаемым к библиотеке Bounce2, и узнайте, как ее использовать. Затем вы должны быть в состоянии написать код кнопки, @chrisl

Вы "# определяете кнопку 12". Таким образом, прекомпилятор изменяет "button.attach()" на "12.attach()", что приводит к появлению сообщения об ошибке., @ridgy

Чтобы избежать этих ошибок (особенно в больших программах), попробуйте использовать другую терминологию для констант и переменных / объектов. Обычно вы будете #define BUTTON 12, поэтому button можно использовать как переменную без ошибок. И не определяйте PIN в начале, когда вы не используете определение позже - используйте "pinMode (BUTTON, INPUT)" и "digitalRead (BUTTON)" - это сэкономит вам часы отладки позже., @ridgy


2

Предположим, вы сделали #define BUTTON 12, как я предложил.

Где-то внутри вашего цикла вы можете закодировать:

if (digitalRead(BUTTON) {        // Первое нажатие кнопки
  while (digitalRead(BUTTON));   // Подождите, пока кнопка не будет отпущена
  while (!digitalRead(BUTTON));  // Подождите, пока не будет нажата вторая кнопка
  while (digitalRead(BUTTON));   // Подождите, пока кнопка не отпустит
}

Это "зависает" от нажатия первой кнопки до отпускания второй кнопки. Код предполагает, что ваша кнопка принимает вывод 12 ВЫСОКО при нажатии и НИЗКО в противном случае. Это немного трудно реализовать в аппаратном обеспечении (ну, не совсем; но вы будете использовать внешний понижающий резистор). Проще всего будет подключить вывод 12 к GND при нажатии кнопки и использовать внутренний PullUp-резистор: pinMode(BUTTON, INPUT_PULLUP);. Тогда логика условия while должна быть возвращена:

if (!digitalRead(BUTTON) {        // Первое нажатие кнопки
  while (!digitalRead(BUTTON));   // Подождите, пока кнопка не будет отпущена
  while (digitalRead(BUTTON));    // Подождите, пока не будет нажата вторая кнопка
  while (!digitalRead(BUTTON));   // Подождите, пока кнопка не отпустит
}
,