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);
    }
  }
}

, 👍-1

Обсуждение

Вы говорите, что «индикатор «L» остается включенным». Что такое индикатор "L"? Кроме того, на какое время настроены потенциометры включения на устройствах PIR? Если установить на несколько секунд, может быть причиной проблемы., @James Waldby - jwpat7

@ Джеймс Уолдби - jwpat7, это светодиод, помеченный буквой «L» на плате. светодиод близко к 13-му контакту. над светодиодами TX, RX. PIR установлены на самое низкое время, средняя чувствительность. Проблема существует даже без подключения PIR/реле. Раздается один звуковой сигнал от зуммера, это происходит через 4-5 секунд после включения платы, при этом светодиод "L" горит - вечно., @Shijil T


4 ответа


1

Убедитесь, что все ИК-датчики и ЖК-дисплей запитаны. это может решить вашу проблему.

Я говорю это, потому что в симуляции работает то же самое. Питать 3 ИК-датчика и ЖК-дисплей через USB — не лучшая идея.

,

Но то же самое только с 1 PIR и 1 зуммером не работает? без нашего ЖК-дисплея/дополнительных ИК-датчиков, @Shijil T

ДА, я пытался переподключиться примерно 2-0 раз за последние 3-4 дня. Также тестировался с более высоким напряжением. Другие скетчи PIR работают., @Shijil T


1

Я действительно не знаю, в чем проблема с вашей настройкой, но вот несколько советов, которые можно попробовать:

  1. Несколько руководств PIR (1,2,3 ,4) рекомендуется использовать подтягивающий резистор сигнальный контакт с открытым коллектором некоторых моделей ИК-датчиков. Вы также можете (или вместо этого) сказать pinMode(pir1Pin, INPUT_PULLUP); (и так далее), а не pinMode(pir1Pin, INPUT);. Обратите внимание: для каждого пассивного инфракрасного датчика подключите вольтметр к его выходу (или к его входу на Uno). Запустите PIR и убедитесь, что сигнал действует так, как вы ожидаете.

  2. Используйте номер контакта, отличный от 13, для вашего backlightPin. Цифровой контакт 13 Uno соответствует встроенному светодиоду (предположительно светодиод, который в вашем вопросе называется «L»). Если вы используете отдельные контакты для подсветки и встроенного светодиода, вы можете использовать встроенный светодиод в качестве средства отладки.

  3. Расстановка вашего кода if(digitalRead(pir1Pin)== HIGH){ ... lcd.print(...); ... звуковой сигнал(); }иначе {... lcd.print(...); ... } (и аналогично для pir2Pin) будет выводить данные на ЖК-дисплей при каждом проходе через loop(), то есть каждые несколько миллисекунд. Возможно, имеет смысл иметь переменные, которые записывают предыдущие показания на этих выводах и обновляют ЖК-дисплей только при изменении показаний на выводах. (Без других изменений это изменение привело бы к одному звуковому сигналу при срабатывании ИК-датчика, а не к последовательности звуковых сигналов с интервалом в одну секунду. В этом случае, если вам нужна последовательность звуковых сигналов, вам потребуется переменная beep-status. )

,

0

В качестве дополнения используйте рюкзак I2C для ЖК-дисплея и новую библиотеку LiquidCrystal от fmalpartida. Установите перемычку для автоматического сброса триггера.

Подключите VCC к 5 В

Подключите S+ (выход 3V3 при срабатывании) к D2 (INT0) - или как вы используете...

Подключить GND к GND

,

0

Это не полный ответ, потому что я не мог понять, почему звуковой сигнал звучит только один раз. Но если я не ошибаюсь, если ваш код будет работать так, как вы задумали, первое движение будет обнаружено, и код перейдет к звуковому сигналу. Там он застрянет на 500x(500+500) мс. Вы никогда не получите результатов для pir2 или pir3, если установка такова, что вы не можете запускать pir2 независимо от других.

Поэтому:

Используйте подтягивающие резисторы, как упоминалось другими.

Прочитайте все состояния пиров и сохраните их, а затем запустите код ЖК-дисплея, а затем звуковой код.

Ваша система не будет отвечать, пока звучит звуковой сигнал.

,