• Система автоматизации с открытым исходным кодом на базе 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
{
   датчик сработал
}
 
Сверху Снизу