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

Хочу автоматизировать курятник моей бабушки. Для этого я хочу использовать 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

Обсуждение

У вас в коде только одни световые ворота. Добавьте второй., @Juraj

Активируются ли световые врата одновременно, или одни активируются, затем неактивны, а затем другие? Т.е. у вас есть последовательность "HH -> LH -> LL -> HL -> HH" или у вас для ворот "HH -> LH -> HH -> HL -> HH"?, @Majenko


1 ответ


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

0

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

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

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

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

,

Спасибо за всю вашу помощь и усилия. @juraj, я знал, что только что реализовал одни световые ворота. Это было просто для того, чтобы предоставить пример кода, показывающий, как я использую прерывания. st2000, Спасибо за большую помощь, но у меня не самый светлый свет в комнате, поэтому квадратурное кодирование оказалось для меня немного сложным. Наконец я понял, что мне нужно искать «счетчик людей в Arduino» или «двунаправленный счетчик». [Здесь](http://jume-maker.blogspot.com/2018/02/arduino-project-diy-ir-bidirection.html), я нашел очень похожий проект и могу адаптировать большую часть кода оттуда., @Strohmi

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

@Strohmi, я просил тебя добавить вторые световые ворота, потому что тогда было бы легко добавить оценку того, какой из них сработал первым, @Juraj