• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Wemos D1 шумы на цифровых входах

YaSerg

New member
Что вы подключили через 0.1 мкФ? Вы 0.1 мкФ в питание модуля PIR поставили, поближе к нему? Имейте ввиду, там между входом питания модуля и регулятором стоит диод, поэтому эффект от конденсатора на входе питания нгевысок. Конденсатор надо впаивать прямо на ножки регулятора, как я указал выше.

И что значит "питается от ESP"? Выражайтесь яснее, чтобы не приходилось гадать.

На сигнальном выходе модуля PIR уже стоит резистор 1 к. Чтобы был эффект от второго резистора, он должен стоять как можно ближе к ESP.

Это выглядит как баг где-то в вашей программе.
PIR реле и датчик температуры находятся в 10 см от esp. Соединены по витой паре.
Конденсатор расположен прямо на ножках ПИРа.

Скетч тестирую базовый:
Код:
#define pirPin 2
#define ledPin 13

void setup()
{
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  int pirVal = digitalRead(pirPin);

  //Если обнаружили движение
  if(pirVal == HIGH)
  {
    digitalWrite(LedPin, HIGH);
    Serial.print("Motion detected");
    delay(2000);
  }
  else
  {
    Serial.print("No motion");
    digitalWrite(LedPin,LOW);
  }
}
 

Сергей_Ф

Moderator
Команда форума
@YaSerg, вам уже сказали куда конденсатор НАДО припаять. На выводах модуля PIR от него толку нет. И приведите весь свой скетч, если хотите избавится от зависания и отставания времени.
 

pvvx

Активный участник сообщества
С большого бодуна pvvx решил, что у топикстартера PIR смотрит на расположенные в нескольких сантиметрах ESP и реле, и теперь будет флудить бесконечно.
Повтор для флудера =AK=:
А может ТС следит за скачками температуры какого другого устройства? Он про это не описывал, а с тепловизором мы там не стояли. :)
Та и древняя плата со старым PIR больше принимает изменение местной температуры, а не внешние излучения :)
Сразу видно, что =AK= в глаза не видел PIR датчиков... По этому и продают как/из брак(а) для Arduino-поломников...
Без заднего экранирования оно принимает всё.
 
Последнее редактирование:

=AK=

New member
Скетч тестирую базовый
Ранее вы писали "Ещё заметил что контроллер как бы повисает в момент появления человека в зоне датчика на 1-2 сек., наблюдается это при обновлении странички веб интерфейса контроллера". Я не вижу в вашем скетче никаких веб-страничек. Зато вижу задержку в 2 секунды при обнаружении движения.

Та и древняя плата со старым PIR больше принимает изменение местной температуры, а не внешние излучения
Так вы там с тепловизором стояли или со свечкой? =:D=
 

=AK=

New member
PIR подключил через конденсатор 0,1 мкф (питается от ESP), сигнальный провод через резистор 220 ом. Заметных глазом результатов это не дало.
PIR реле и датчик температуры находятся в 10 см от esp. Соединены по витой паре.
Ранее в посте #33 описывали свою систему совсем иначе: "в доме имеется щиток на входе с 220В откуда расходится витая пара по комнатам (расстояние 5-8м) до мини щитков с контроллерами, по ней единственная возможность осуществлять питание этих самых контроллеров. К контроллерам подключены (короткими проводами реле) и дисплеи. От контроллеров до потолка и окон каждой комнаты идет витая пара (3-6м.). На потолке расположены PIRы, на окнах герконы."

Исходя из этого описания вам были даны рекомендации в посте #34. А теперь вдруг оказывается, что PIR у вас не 3-6 метрах, а в 10 см от контроллера. Вы способны описать свою систему, или будете всем голову морочить?

Есть большая разница между кабелем длиной в несколько метров и проводами длиной 10 см. Довольно глупо в первую очередь выполнять рекомендации, которые были даны для системы с кабелями длиной в несколько метров, на самые короткие 10 см участки.

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

YaSerg

New member
Моя проблема с ложным срабатыванием PIRов считыванием состояния датчика раз в секунду.

Уже неделю эксперементов и всё работает как часы. Всем спасибо за советы.
 

YaSerg

New member
То есть, вы свою задачу как-то решили, а там хоть трава не расти. Рассказать, что вам конкретно помогло, конечно, влом - жалко времени, ага?
Я написал: моя проблема с ложным срабатыванием PIRов считыванием (ограничением считывания) состояния датчика раз в секунду.
В обычных скетчах состояния датчика считывается каждый цикл loop.
Может я что-то упустил? Направьте меня, я с удовольствием поясню.
 

=AK=

New member
Я написал: моя проблема с ложным срабатыванием PIRов считыванием (ограничением считывания) состояния датчика раз в секунду.
В обычных скетчах состояния датчика считывается каждый цикл loop.
Может я что-то упустил? Направьте меня, я с удовольствием поясню.
Ну давайте я погадаю, что бы это значило:
- "моя проблема с ложным срабатыванием PIRов считыванием состояния датчика раз в секунду ознаменовала смычку города и деревни"
- "моя проблема с ложным срабатыванием PIRов считыванием состояния датчика раз в секунду исчезла сама собой"
- "моя проблема состояла в том, что я считывал PIR датчики раз в секунду, а надо было считывать в каждом цикле"
- "моя проблема решилась, когда я стал считывать PIR датчики раз в секунду, вместо того, чтобы считывать в каждом цикле"
Так что же произошло с вашей проблемой? Где глагол?

Все озвученные варианты звучат как чистый бред, особенно в контексте 5-страничного обсуждения.

Если есть ложные срабатывания PIR датчика, то никаким прореженным (раз в секунду) считыванием ее не решить. Hа выходе обычного PIR модуля после срабатывания сигнал держится дольше, чем 1 сек. Кроме того, даже если (вопреки вашим заявлениям) нет ложных срабатываний PIR модуля, а есть короткие помеховые импульсы на его выходе, то рано или поздо даже редкое - раз в секунду - считывание поймает ложное состояние.
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@YaSerg, вообще-то, @=AK= прав. Считывание раз в секунду не спасет, если глючит датчик. Если это всё же помеха, то нужно с ней бороться как с дребезгом - поймали изменение и проверили его через 0.1-0.5 секунды.
 

YaSerg

New member
Если есть ложные срабатывания PIR датчика, то никаким прореженным (раз в секунду) считыванием ее не решить. Hа выходе обычного PIR модуля после срабатывания сигнал держится дольше, чем 1 сек. Кроме того, даже если (вопреки вашим заявлениям) нет ложных срабатываний PIR модуля, а есть короткие помеховые импульсы на его выходе, то рано или поздо даже редкое - раз в секунду - считывание поймает ложное состояние.
Я ещё раз повторю результаты двух недельных эксперементов:
1. напайка диодов и резисторов по руководству никакого абсолютно результата не дало.
2. на данный момент, после изменения считывания показания датчика на раз в секунду вместо в каждом цикле, проблема исчезла на 100%. Если вернуть обратно на считывание в каждом цикле, ложные срабатывания возвращаются.

Более никаких измерений не делал т.к. просто не умею и ответить на ваши доводы могу только результатом
эксперимента, поскольку так же не имею опыта в электротехнике.

@YaSerg, вообще-то, @=AK= прав. Считывание раз в секунду не спасет, если глючит датчик. Если это всё же помеха, то нужно с ней бороться как с дребезгом - поймали изменение и проверили его через 0.1-0.5 секунды.
Мне не хватает опыта делать эти измерения и я не знаю что с ними делать дальше, к моему сожалению.
Если интересно можно это сделать, но мне понадобится руководство.
 

=AK=

New member
2. на данный момент, после изменения считывания показания датчика на раз в секунду вместо в каждом цикле, проблема исчезла на 100%.
Она исчезла на 99 с чем-то процентов. При этом у вас сигнал PIR отрабатывется с задержкой в среднем 0.5 сек, иногда до 1 сек.

Более корректно было бы делать считывание, например, так:
- раз в 10 мс считываем сигнал с PIR и заносим его в 16-битный сдвиговый регистр, что-нибудь типа
Код:
sreg <<= 1;
sreg = (PIR)?   (sreg | 1)  :  (sreg);
- после это проверяем значение сдвигового регистра sreg; если в нем все 1 - значит, PIR сработал.

Это даст задержку срабатывания в 160 мс, при этом вероятность появления ложного сигнала будет намного меньше.
 

YaSerg

New member
Она исчезла на 99 с чем-то процентов. При этом у вас сигнал PIR отрабатывется с задержкой в среднем 0.5 сек, иногда до 1 сек.

Более корректно было бы делать считывание, например, так:
- раз в 10 мс считываем сигнал с PIR и заносим его в 16-битный сдвиговый регистр, что-нибудь типа
Код:
sreg <<= 1;
sreg = (PIR)?   (sreg | 1)  :  (sreg);
- после это проверяем значение сдвигового регистра sreg; если в нем все 1 - значит, PIR сработал.

Это даст задержку срабатывания в 160 мс, при этом вероятность появления ложного сигнала будет намного меньше.
И снова для меня дебри, хотя прочитав и поняв логику не могу с Вами не согласиться.
По запросу "сдвиговый регистр arduino" я понял что это отдельный модуль, хотя судя по логике и вашему предложению нет.
Можете прокоментировать это и не могли бы пояснить как работает ваш код. Я такую запись в первые вижу.
 

=AK=

New member
Можете прокоментировать это и не могли бы пояснить как работает ваш код. Я такую запись в первые вижу.
Объявляете глобальную переменную sreg, это и будет сдвиговый регистр. При объявлении задаете ему значение 0 (хотя это не обязательно):
Код:
unsigned integer sreg = 0;
В основном цикле заводите код, который срабатывает раз в 10 мс. Делаете это так же, как сейчас делаете выборки раз в 1 сек. Туда и вставляете то, что я написал выше. Чтобы было понятнее, вот тот же код в менее компактной форме:
Код:
sreg = (sreg << 1);  // сдвигаем регистр влево на один разряд
if (PIR == 1)  // если сигнал с датчика имеет активный высокий уровень
{
  sreg = sreg | 1; // устанавливаем 1 в младший разряд сдвигового регистра
} // а если сигнал с датчика имеет пассивный низкий уровень то
  // ничего не делаем, в младшем разряде сдвигового регистра оставляем 0
 

YaSerg

New member
Объявляете глобальную переменную sreg, это и будет сдвиговый регистр. При объявлении задаете ему значение 0 (хотя это не обязательно):
Код:
unsigned integer sreg = 0;
В основном цикле заводите код, который срабатывает раз в 10 мс. Делаете это так же, как сейчас делаете выборки раз в 1 сек. Туда и вставляете то, что я написал выше. Чтобы было понятнее, вот тот же код в менее компактной форме:
Код:
sreg = (sreg << 1);  // сдвигаем регистр влево на один разряд
if (PIR == 1)  // если сигнал с датчика имеет активный высокий уровень
{
  sreg = sreg | 1; // устанавливаем 1 в младший разряд сдвигового регистра
} // а если сигнал с датчика имеет пассивный низкий уровень то
  // ничего не делаем, в младшем разряде сдвигового регистра оставляем 0
Простите мне мою безграмотность, а можете пояснить как работают эти строки sreg = sreg | 1; sreg <<= 1; ?
И как по итогам опросов корректно произвести анализ?

Эту строку sreg = (PIR)? (sreg | 1) : (sreg); я понимаю так. Если пир true положить в переменную sreg значение 1, если пир false то ничего не ложить. Как я понял двоеточие разделяет действие из условия if, а именно true : false?
 

=AK=

New member
Эту строку sreg = (PIR)? (sreg | 1) : (sreg); я понимаю так. Если пир true положить в переменную sreg значение 1, если пир false то ничего не ложить. Как я понял двоеточие разделяет действие из условия if, а именно true : false?
Если PIR не равен нулю то положить в переменную sreg значение (sreg | 1), если PIR равен нулю то положить в переменную sreg значение sreg.

И как по итогам опросов корректно произвести анализ?
Для проверки 8 бит (при опросе 10 мс реакция будет за 80 мс)
Код:
if ((sreg & 0x00FF) == 0x00FF)  // если младшие 8 бит установлены в 1
{
   датчик сработал
}
 
Сверху Снизу