Как узнать, какое событие сработало первым?
Хочу автоматизировать курятник моей бабушки. Для этого я хочу использовать 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);
}
@Strohmi, 👍0
1 ответ
Лучший ответ:
Рассмотрите возможность использования квадратурного кодирования для определения направления движения с помощью двух световых лучей. метод, используемый в старых механических указателях мыши и трекболах. Использование Arduino для декодирования квадратурного кодирования обсуждается во многих местах в Интернете.
Расположите луч A и луч B так, чтобы курица, выходящая из курятника, сначала активировала луч B, а затем луч A.
Поскольку сначала происходит активация луча B, мы знаем, что курица выходит из курятника. Если первым появился луч А, мы знаем, что курица заходит в курятник.
Форма курицы неправильная, и курица может передумать на полпути из курятника. Эти и другие неожиданные аномалии могут привести к неожиданным результатам. Рассмотрите возможность дополнения лучей датчиком PIR снаружи курятника, чтобы убедиться, что снаружи не осталось цыплят.
- Как получить текущее время и дату в Arduino без внешнего источника?
- Как запустить цикл на определенное время?
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Разница между «time_t» и «DateTime»
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Оси X и Y на последовательном плоттере Arduino?
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- Различия между процессором Nodemcu и Arduino