Как узнать, какое событие сработало первым?

Хочу автоматизировать курятник моей бабушки. Для этого я хочу использовать Arduino и NodeMCU соответственно. Я хочу проверить, все ли цыплята находятся в курятнике ночью, а затем закрыть маленькую дверцу. Я пытался использовать технологию RFID и пометить цыплят небольшими RFID-метками, но диапазон считывания, который я получил, был слишком мал, чтобы заставить их работать должным образом. Теперь я пытаюсь реализовать световые ворота с помощью двух небольших лазеров и двух приемников. Я хочу определить направление (внутри или наружу) цыплят. Я заработал лазеры и получил сигнал (1 и 0 = световые ворота прерваны). Мне нужно знать, какой из двух лазерных детекторов первым обнаружил 0 (ноль). Я понятия не имею, как реализовать это в коде. Я пытался использовать таймеры, но безрезультатно. Я также пытался использовать прерывания (см. небольшой фрагмент кода).

Надеюсь, я ясно объяснил, чего пытаюсь достичь. Пожалуйста, скажите мне, если и как я могу улучшить этот вопрос. Любой гугл-фу был бесполезен. Мы очень ценим каждую подсказку/помощь.

#include <Arduino.h>

// Функции
void pin_ISR();

const int detectorPin = 3;     // номер контакта детектора
const int ledPin =  13;      // номер контакта светодиода
const int Laser = 6;
// переменные изменятся:
volatile int buttonState = 1;         // переменная для чтения статуса

void setup() {
Serial.begin(9600);
// инициализируем вывод светодиода как выход:
pinMode(ledPin, OUTPUT);
// инициализируем вывод кнопки как вход:
pinMode(detectorPin, INPUT);
pinMode(Laser, OUTPUT);
digitalWrite(Laser, HIGH);
// Присоединяем прерывание к вектору ISR
attachInterrupt(digitalPinToInterrupt(3), pin_ISR, CHANGE);
}

void loop() {
Serial.print(buttonState);
delay(100);
}

void pin_ISR() {
Serial.println("There was an interrupt!");
buttonState = digitalRead(detectorPin);
digitalWrite(ledPin, buttonState);
}

, 👍0


1 ответ


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

0

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

Расположите луч A и луч B так, чтобы курица, выходящая из курятника, сначала активировала луч B, а затем луч A.

Поскольку сначала происходит активация луча B, мы знаем, что курица выходит из курятника. Если первым появился луч А, мы знаем, что курица заходит в курятник.

Форма курицы неправильная, и курица может передумать на полпути из курятника. Эти и другие неожиданные аномалии могут привести к неожиданным результатам. Рассмотрите возможность дополнения лучей датчиком PIR снаружи курятника, чтобы убедиться, что снаружи не осталось цыплят.

,