Можно ли создать задержку длительностью 5 секунд в программе прерывания?

void buttonPressed()
{
  if(ledOn)
  {
    ledOn = false;
    digitalWrite(13,LOW);
  }else
  {
    ledOn = true;
    digitalWrite(13,HIGH);
  }

  vout=analogRead(sensor);
  vout=(vout*500)/1023;
  tempc=vout; // Сохранение значения в градусах Цельсия
  tempf=(vout*1.8)+32; // Преобразование в градусы Фаренгейта
  lcd.setCursor(0,0);
  lcd.print("ROOM TEMPERATURE");

  lcd.setCursor(0,1);
  lcd.print("C = ");
  lcd.print(tempc);

  lcd.print("  F = ");
  lcd.print(tempf);
  Serial.print("f ");
  Serial.print(tempf);
}

Вот код прерывания, и я хочу отслеживать значение датчика примерно 5 секунд.

, 👍2


1 ответ


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

4

Для этого вам не нужны прерывания. Основной цикл нужен только для проверки переключателя, например.

void loop ()
  {
  if (digitalRead (button) == HIGH)  // предполагаем, что LOW означает нажатие
     return;

  // считываем показания термопары здесь

  // отобразить результаты

  delay (5000);

  }

Я хочу вывести значение термистора на ЖК-дисплей с помощью прерываний и хочу, чтобы значение сохранялось около 5 секунд

Вы неправильно используете прерывания в своей попытке. См. мою страницу о прерываниях. Вам просто не следует пытаться печатать или задерживать вывод внутри процедуры прерывания. Максимум, что вам следует сделать, — это определить нажатие кнопки:

volatile bool switchIsPressed = false;

// Процедура обслуживания прерываний (ISR)
void buttonPressed()
  {
  switchIsPressed = true;
  }  // конец ISR buttonPressed

Теперь в основном цикле вы определяете нажатие кнопки и снимаете показания. Если вам нужно что-то ещё, «запомните» время, когда отображалось значение, например:

unsigned long whenTemperatureDisplayed = 0;

void loop ()
  {
  if (switchIsPressed && whenTemperatureDisplayed == 0)
    {
    // читать ...
    // отображение показаний ...
    whenTemperatureDisplayed = millis ();  // когда мы отобразили показания
    switchIsPressed = false;               // готово к следующему разу
    }  // конец, если переключатель был нажат

  if (whenTemperatureDisplayed != 0 &&
      millis () - whenTemperatureDisplayed >= 5000) // прошло 5 секунд
    {
    // остановить отображение показаний ...
    whenTemperatureDisplayed = 0;
    }  // конец, если время истекло

  // сделать здесь другие вещи

  }  // конец цикла
,