PIR с Arduino — обнаруживает только первое движение
Ниже приведен скетч Arduino для 3 датчиков PIR. Два ИК-датчика могут активировать 1 зуммер и отображать статус на ЖК-дисплее. Третий ИК-датчик активирует реле.
Проблема в том, что обнаруживается только первое движение, а индикатор "L" остается включенным. После этого активности нет.
Та же плата Arduino Uno отлично работает с другими скетчами. Датчики PIR тоже работают. Скетч, похоже, работает и над симуляцией.
Ссылка на симуляцию
Светодиод "L" расположен рядом с 13-м контактом. над светодиодами TX, RX. PIR установлены на самое низкое время, средняя чувствительность. Проблема существует даже без подключения PIR/реле. Раздается один сигнал зуммера, это происходит через 4-5 секунд после включения платы, при этом горит светодиод "L" - вечно.
ЖК-дисплей также имеет проблему, он показывает заполненные блоки в первой строке и больше ничего.
Я пытался подключить к плате только один ИК-датчик и 1 зуммер.
Что не так?
#include <LiquidCrystal.h>
unsigned long time;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int pir1Pin =9;
int pir2Pin =10;
int pir3Pin =11;
int buzzerPin =8;
int relayPin = 12;
int backlightPin = 13;
long previousMillis = 0;
long interval = 1000;
void setup() {
lcd.begin(16, 2);
pinMode(pir1Pin, INPUT);
pinMode(pir2Pin, INPUT);
pinMode(pir3Pin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(backlightPin, OUTPUT);
digitalWrite(relayPin,HIGH);
delay(1000);
digitalWrite(relayPin,LOW);
Serial.begin(9600);
}
void loop() {
if(digitalRead(pir1Pin)== HIGH) {
digitalWrite(backlightPin,HIGH);
lcd.setCursor(0, 0);
lcd.print("Pir 1 Active");
beep();
} else {
lcd.setCursor(0, 0);
lcd.print("Pir 1 is off");
digitalWrite(backlightPin,LOW);
}
if(digitalRead(pir2Pin)== HIGH) {
digitalWrite(backlightPin,HIGH);
lcd.setCursor(0, 1);
lcd.print("Pir 2 Active ");
beep();
} else {
lcd.setCursor(0, 1);
lcd.print("Pir 2 is off");
digitalWrite(backlightPin,LOW);
}
if(digitalRead(pir3Pin)== HIGH) {
while(digitalRead(pir3Pin)==HIGH) {
digitalWrite(relayPin,HIGH);
}
} else {
digitalWrite(relayPin,LOW);
}
}
void beep() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
for (int i=0; i<500; i++) {
digitalWrite(buzzerPin, HIGH);
delayMicroseconds(500);
digitalWrite(buzzerPin, LOW);
delayMicroseconds(500);
}
}
}
@Shijil T, 👍-1
Обсуждение4 ответа
Убедитесь, что все ИК-датчики и ЖК-дисплей запитаны. это может решить вашу проблему.
Я говорю это, потому что в симуляции работает то же самое. Питать 3 ИК-датчика и ЖК-дисплей через USB — не лучшая идея.
Но то же самое только с 1 PIR и 1 зуммером не работает? без нашего ЖК-дисплея/дополнительных ИК-датчиков, @Shijil T
ДА, я пытался переподключиться примерно 2-0 раз за последние 3-4 дня. Также тестировался с более высоким напряжением. Другие скетчи PIR работают., @Shijil T
Я действительно не знаю, в чем проблема с вашей настройкой, но вот несколько советов, которые можно попробовать:
Несколько руководств PIR (1,2,3 ,4) рекомендуется использовать подтягивающий резистор сигнальный контакт с открытым коллектором некоторых моделей ИК-датчиков. Вы также можете (или вместо этого) сказать
pinMode(pir1Pin, INPUT_PULLUP);(и так далее), а неpinMode(pir1Pin, INPUT);. Обратите внимание: для каждого пассивного инфракрасного датчика подключите вольтметр к его выходу (или к его входу на Uno). Запустите PIR и убедитесь, что сигнал действует так, как вы ожидаете.Используйте номер контакта, отличный от 13, для вашего
backlightPin. Цифровой контакт 13 Uno соответствует встроенному светодиоду (предположительно светодиод, который в вашем вопросе называется «L»). Если вы используете отдельные контакты для подсветки и встроенного светодиода, вы можете использовать встроенный светодиод в качестве средства отладки.Расстановка вашего кода
if(digitalRead(pir1Pin)== HIGH){ ...lcd.print(...); ... звуковой сигнал(); }иначе {...lcd.print(...); ... }(и аналогично дляpir2Pin) будет выводить данные на ЖК-дисплей при каждом проходе черезloop(), то есть каждые несколько миллисекунд. Возможно, имеет смысл иметь переменные, которые записывают предыдущие показания на этих выводах и обновляют ЖК-дисплей только при изменении показаний на выводах. (Без других изменений это изменение привело бы к одному звуковому сигналу при срабатывании ИК-датчика, а не к последовательности звуковых сигналов с интервалом в одну секунду. В этом случае, если вам нужна последовательность звуковых сигналов, вам потребуется переменная beep-status. )
В качестве дополнения используйте рюкзак I2C для ЖК-дисплея и новую библиотеку LiquidCrystal от fmalpartida. Установите перемычку для автоматического сброса триггера.
Подключите VCC к 5 В
Подключите S+ (выход 3V3 при срабатывании) к D2 (INT0) - или как вы используете...
Подключить GND к GND
Это не полный ответ, потому что я не мог понять, почему звуковой сигнал звучит только один раз. Но если я не ошибаюсь, если ваш код будет работать так, как вы задумали, первое движение будет обнаружено, и код перейдет к звуковому сигналу. Там он застрянет на 500x(500+500) мс. Вы никогда не получите результатов для pir2 или pir3, если установка такова, что вы не можете запускать pir2 независимо от других.
Поэтому:
Используйте подтягивающие резисторы, как упоминалось другими.
Прочитайте все состояния пиров и сохраните их, а затем запустите код ЖК-дисплея, а затем звуковой код.
Ваша система не будет отвечать, пока звучит звуковой сигнал.
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Как получить данные о весе с датчиков стеклянных электронных весов для ванной?
- Получение BPM из данного кода
- Датчик Arduino Uno DHT11 Не удалось прочитать данные с датчика DHT
- Как подключить более 10 датчиков к Arduino uno r3
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
Вы говорите, что «индикатор «L» остается включенным». Что такое индикатор "L"? Кроме того, на какое время настроены потенциометры включения на устройствах PIR? Если установить на несколько секунд, может быть причиной проблемы., @James Waldby - jwpat7
@ Джеймс Уолдби - jwpat7, это светодиод, помеченный буквой «L» на плате. светодиод близко к 13-му контакту. над светодиодами TX, RX. PIR установлены на самое низкое время, средняя чувствительность. Проблема существует даже без подключения PIR/реле. Раздается один звуковой сигнал от зуммера, это происходит через 4-5 секунд после включения платы, при этом светодиод "L" горит - вечно., @Shijil T