Прерывание Arduino возвращает ненадежные значения - PullRequest
0 голосов
/ 29 мая 2018

У меня есть простое приложение для подсчета потока воды с помощью датчика, который оснащен герконом.Таким образом, приложение должно рассчитывать только количество раз, которое выключатель закрывается.

Мой первый код был:

const int sensorPin = 2;
volatile int counter = 0;

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
}

void sensorISR() {
  counter++;
}

И как только бутылка объемом 20 литров была заполнена, счетчик показывал что-то вроде 120.

Затем я изменил код следующим образом:

const int sensorPin = 2;
volatile int counter = 0;

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}

void loop() { }

void sensorISR() {
  counter++;
  Serial.print("Counter: ");
  Serial.println(counter);  
}

И счетчик опустился до 40 (при использовании той же бутылки на 20 литров).

Счет должен быть 20Lно это не моя проблема, так как это происходит из-за отскока герконов (я остановлюсь на этом последнем).Поскольку в проекте будет 3 датчика и 3 функции ISR, мне интересно, почему включение команды Serial.print () в основной цикл может привести к таким странным результатам.

Спасибо, Пауло

1 Ответ

0 голосов
/ 30 мая 2018

Серийные операторы печати полагаются на прерывания, которые отключены во время вашего ISR.Таким образом, операторы Serial.print не принадлежат ISR.

Причина, по которой ваш счет уменьшился, состоит в том, что теперь ваш ISR выполняется дольше и покрывает часть отказов.Есть бесчисленные учебники о том, как отговорить что-то с Arduino.Вы можете обязательно найти один.

Два самых простых способа - использовать конденсатор между штырем и землей для аппаратного дебаута или просто использовать миллис или микросхемы, чтобы отмечать время, когда происходит прерывание, и игнорировать любые прерывания, которые происходят в течение небольшого промежутка времени.,

...