• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

анемометр и esp8266

uvtbrest

New member
Добрый день!
Подскажите пожалуйста, в каком направлении двигаться ? Хочу прикрутить к esp датчик ветра , на базе которого геркон. Не могу сообразить какой скетч или библиотека нужна для считывания показаний с геркона?
 

nikolz

Well-known member
Добрый день!
Подскажите пожалуйста, в каком направлении двигаться ? Хочу прикрутить к esp датчик ветра , на базе которого геркон. Не могу сообразить какой скетч или библиотека нужна для считывания показаний с геркона?
А что собственно надо мерить?
Варианты для ответа:
1) Момент замыкания геркона,
2) число замыканий в единицу времени,
3) интервал между замыканиями,
4) включать свисток по замыканию,
5) количество выпитого пива,
6) длину тени от столба ночью
7) иное, но пока не придумал.
 

uvtbrest

New member
А что собственно надо мерить?
Варианты для ответа:
1) Момент замыкания геркона,
2) число замыканий в единицу времени,
3) интервал между замыканиями,
4) включать свисток по замыканию,
5) количество выпитого пива,
6) длину тени от столба ночью
7) иное, но пока не придумал.



Хе хе...хороший ответ.)
Да есть анемометр от станции погоды...так вот там , я читал, при полном обороте скорость 1 м/с, соответственно и считывать есть желание, один оборот 1 м/с.
Получается 2) число замыканий в единицу времени,
 

MihaNN52

Member
Геркон лучше подключить через оптрон иначе будет много левых импульсов, это проще всего по мне).
Выбери пин на ESP и включи по нему прерывания.
Например 14-й
attachInterrupt(14, Counter, RISING);// это включает прерывание на 14 порту режим RISING. Режимов несколько. По спадающему фронту по нарастающему и по обоим. См описание attachInterrupt
Counter это название функции которая будет вызываться при появлении внешнего прерывания на 14 порту по условиям.
обьявим переменную для счетчика
unsigned long steps = 0;
// функция счетчика импульсов
void Counter(void) {
steps++;
}

Далее если нам надо считать сколько импульсов за n-нное время то
нужен будет где то хранить время
unsigned long time = 0;
и переменная для скорости
float speed= 0;
а так же чтоб не обнулять steps лучше сделать еще одну переменную.
unsigned long prev_steps = 0;
далее в основном цикле надо каждые 5 сек например смотреть сколько было импульсов... если они были
if (millis() - time >= 5000 && steps - prev_steps > 0){
time = millis();
speed = (steps - prev_steps) / 5.0;//считаем скорость
printf("Speed:%.2f",speed);//выводим
prev_steps = steps;

}
Как то так можно, вообще вариантов масса, но для данной задачи думаю что так проще всего будет.
 

nikolz

Well-known member
Хе хе...хороший ответ.)
Да есть анемометр от станции погоды...так вот там , я читал, при полном обороте скорость 1 м/с, соответственно и считывать есть желание, один оборот 1 м/с.
Получается 2) число замыканий в единицу времени,
Как понял Вы не будете писать прогу а хотите халяву.
Ищите какие либо счетчики расхода воды - там обычно датчик холла и тоже подсчет импульсов в единицу времени
или какие либо измерители частоты.
 

=AK=

New member
Геркон лучше подключить через оптрон иначе будет много левых импульсов, это проще всего по мне).
Выбери пин на ESP и включи по нему прерывания.
Нафиг там нужен оптрон и прерывания. В соседней теме человек которую неделю мучается и с тем и с другим. Сначала тоже совершенно ненужный оптрон поставил от балды, получил кучу ложных срабатываний потому что оптрон ловил помехи. Потом удалось его уговорить избавиться от оптрона, зато теперь ловит ложные срабатывания потому что сигнал обрабатывается по прерываниям, за счет этого ловится каждая помешка на входе.
 

MihaNN52

Member
Прерывания и ESP с WIFI вещи не совместимые. Я пол года бился чтоб работало нормально в итоге ушел на STM32. На оптроне нормально работает ни каких левых импульсов не ловит. Кстати у меня и холла ловили помехи пока провод экранированный не поставил. Рация дает наводку, ну и всякие там холодильники. Как вы там без прерываний собрались импульсы считать?))) Не ну в STM32 может TIM считать тут то нефига нет, голой жопой на геркон?))
upload_2018-4-9_14-39-26.png
я много времени с счетчиками провожу))
iu4nFtqZ8NY.jpg

вот нарыл... сигналы до оптрона 5189(точка S-COUNT3) и после 1101 (точка S-COUNT4)
ни какого левака нет т.к у меня он недопустим
LXIrBS5jiuU.jpg

Это собственно дребезг геркона
R2GwG_mvrOI.jpg

При датчике холла количество импульсов до оптрона = после оптрона
В мае будет год как я вожусь с разными счетчиками. Почти все что есть на рынке прошло через меня.
 
Последнее редактирование:

=AK=

New member
На оптроне нормально работает ни каких левых импульсов не ловит.
Пока помех мало, то не ловит. Посчитаем, какую мощность должна иметь помеха, чтобы вызвать ложное срабатывание. Для простоты примем, что ложное срабатывание будет, когда напряжение на COUNT упадет с 3.3В до 1 В. Ток через R34 при этом должен составить 2.3 мА. Коэффициент передачи оптрона PC817 по току - в диапазоне от 50% до 600%.

Если вам повезло и оптрон ослабляет ток вдвое, то для ложного срабатывания ток светодиода должен быть 4.3 мА. Падение напряжения на R35 составит 0.95В. При типичном напряжении на светодиоде 1.2 В мощность помехи должна быть 9.22 мВт (влиянием R37 для простоты можно пренебречь, оно мало)

Если вам не повезло и оптрон усиливает ток в 6 раз, то для ложного срабатывания ток светодиода должен быть 0.383 мА. Падение напряжения на R35 составит 0.084В, в сумме с 1.2 В на светодиоде это будет меньше 1.3 В. Ток в R37 будет 0.13 мА. Суммарный ток помехи должен быть 0.51 ма, мощность помехи всего 0.67 мВт.

Вот в этом диапазоне, от 0.67 мВт до 9.22 мВт находится помехоустойчивость вашего устройства.

Если оптрон выкинуть и оставить просто резистор подтяжки R34, то для ложного срабатывания помеха должна будет развить мощность 5.3 мВт. Если резистор R34 уменьшить вдвое, до 470 Ом, то помеха должна будет иметь мощность не менее 11 мВт, что уже лучше, чем при самом благоприятном раскладе параметров оптрона. Если напряжение count_v больше, чем 3.3 В, то после резистора подтяжки его надо ослабить делителем, за счет этого помехоустойчивость будет еще выше.
 

MihaNN52

Member
Изначально пробовал без оптрона, просто с подтяжкой, результат не устроил. Подбирал разные номиналы, один фиг иногда два три импульса от куда то прилетят. Но я не претендую на истину в последней инстанции.
На схеме номиналы относительные, напряжение на count_v = 3.6 вольта в данный момент.
Вообще все стало стабильно после замены проводов на экранированные , а далее после перехода на оптрон. Все внешние помехи пропали сразу. А так сразу не вьехал. За несколько секунд прилетает 200-300 импульсов при том что счетчик стоит. Оказалось в этот момент идет автовещание по радиостанции.
Накидайте пож свое виденье на схему. Я попробую сравнить результат и обязательно отпишусь.
 

nikolz

Well-known member
На форуме так заколебали кнопки, что написал прогу которая работает по прерываниям с двумя кнопками подключенными к одному пину и определяет какая кнопка нажата.
Все работает без проблем и помех.
Довешу еще реле и выложу прошивку для тестов стонущим.
WiFi тоже работает без проблем и с кнопками и другими внешними устройствами подключаемыми по прерыванию.
 

MihaNN52

Member
Не стал бы сравнивать кнопку которую один раз нажали и все с счетчиком который может пол часа гнать импульсы. Вопрос в том сколько импульсов он потеряет и зловещий вачдог который любит все отрубить в самый неподходящий момент. Мне вот нельзя терять импульсы, по этому перед работой счетчика отключал все и перезагружал ESP по завершению.
Конечно выкладывайте, заценим.
 

nikolz

Well-known member
Не стал бы сравнивать кнопку которую один раз нажали и все с счетчиком который может пол часа гнать импульсы. Вопрос в том сколько импульсов он потеряет и зловещий вачдог который любит все отрубить в самый неподходящий момент. Мне вот нельзя терять импульсы, по этому перед работой счетчика отключал все и перезагружал ESP по завершению.
Конечно выкладывайте, заценим.
И со счетчиком будет без проблем если работаете с прерываниям.
Работу с WIFI ставите либо в задаче либо в колбеке таймера, а импульсы считаете по прерываниям.
Сейчас точно не помню, но килогерцы или десятки килогерц без проблем.
Не думаю что счетчик воду у Вас быстрее работает.
 

MihaNN52

Member
я не понимаю как вы можете считать импульсы без прерываний.)) НЕ работает не фига. Нет стабильности.
 

=AK=

New member
Накидайте пож свое виденье на схему. Я попробую сравнить результат и обязательно отпишусь.
Вместо кнопки - контакт геркона:
pushbutt.png
Конденсатор ставить необязательно, а вот резистор R2 - обязательно

я не понимаю как вы можете считать импульсы без прерываний.)) НЕ работает не фига. Нет стабильности.
Исходные данные - минимальное время замкнутого и разомкнутого состояния геркона, или макс. частота срабатываний. Положим, макс. частота 10 Гц, а время замкнутого и разомкнутого состояний отличаются друг от друга не более чем в 3 раза. Значит, надо ловить импульсы минималной длительности 25 мс.

Текущее значение состояния контакта держим в глобальной переменной cont.

Для этого в основном цикле раз в 1 мс обращаемся к процедуре подавления дребезга контакта. Процедура делает вот что:
-- использует 16-битную глобальную (или статическую) переменную shreg
-- про вызове процедуры сдвигаем переменную shreg влево на один разряд
-- если на входном пине 1 то в младший разряд shreg пишем 1
-- далее проверяем значение shreg; если в ней все 0 - контакт замкнут, устанавливаем cont=1; если в ней все 1 - контакт разомкнут, устанавливаем cont=0; любые другие значения игнорируем
-- если контакт был разомкнут, а стал замкнут, то увеличиваем счетик импульсов

Код:
void debounce(void)
{
  static unsigned short int shreg;
  shreg <<= 1;
  if (pin_state(X)) // читаем пин
  {
    shreg |= 1;
  }
  if (shreg == 0xFFFF)
  {
    cont <<= 1;  // в младшем разряде 0, контакт разомкнут
  }
  else if (shreg == 0)
  {
    cont <<= 1;
    cont |= 1; // в младшем разряде 1, контакт зaмкнут
    if ((cont & 3) == 1)  // если контакт был разомкнут, а стал замкнут
    {
       // увеличиваем счетик импульсов
    }
  }
}
 

nikolz

Well-known member
Вместо кнопки - контакт геркона:
Посмотреть вложение 6220
Конденсатор ставить необязательно, а вот резистор R2 - обязательно


Исходные данные - минимальное время замкнутого и разомкнутого состояния геркона, или макс. частота срабатываний. Положим, макс. частота 10 Гц, а время замкнутого и разомкнутого состояний отличаются друг от друга не более чем в 3 раза. Значит, надо ловить импульсы минимальной длительности 25 мс.
Поясните
1) каким образом эта функция реализует измерение длительностью 25 мс?
2) Как к Вы узнаете момент замыкания без прерываний?
3) Какое будет максимальное запаздывание реакции в таком алгоритме?
4) Сколько времени процессора надо затратить на обнаружение одного нажатия?
 

=AK=

New member
Поясните
1) каким образом эта функция реализует измерение длительностью 25 мс?
Она убирает дребезг, при этом позволяет ловить импульсы длительностью более 16 мс

2) Как к Вы узнаете момент замыкания без прерываний?
3) Какое будет максимальное запаздывание реакции в таком алгоритме?
Определение момента прерывания будет иметь неопределенность, зависящую от длительности дребезга. Если дребезга нет, то замыкание/размыкание будет отловлено с задержкой 16...17 мс. Если есть - то к этомy надо прибавить время дребезга.

4) Сколько времени процессора надо затратить на обнаружение одного нажатия?
Посмотрите на код. Он очень простой, а исполняется всего один раз в миллисекунду. Голый вызов и возврат из прерывания наверное больше процессорного времени возьмут.
 

nikolz

Well-known member
Она убирает дребезг, при этом позволяет ловить импульсы длительностью более 16 мс


Определение момента прерывания будет иметь неопределенность, зависящую от длительности дребезга. Если дребезга нет, то замыкание/размыкание будет отловлено с задержкой 16...17 мс. Если есть - то к этомy надо прибавить время дребезга.


Посмотрите на код. Он очень простой, а исполняется всего один раз в миллисекунду. Голый вызов и возврат из прерывания наверное больше процессорного времени возьмут.
Т е Вы данный код ставите в колбек таймера?
А это тоже прерывание. Т е без прерываний нельзя?
---------------------------
что же относительно прерывания от пина, то замечу что в этом случае будет лишь два вызова функции на каждый импульсвне зависимости от длительности импульса, а не каждую миллисекунду как у Вас. Если импуль длинный например сели на кнопку то будет сотня вызовов т е в десятки раз больше траты времени процессора чем с прерыванием.
При этом с прерываниями я легко настрои временные ворота для любой длительности импульса а ширина ворот будет определяться стабильностью этой длительности.
В вашем варианте если длительность 1 сек то надо сколько ячеек памяти c квантом 1 мс?
 

MihaNN52

Member
Обработку дребезга надо делать снаружи. Не нравицо оптрон можно триггер поставить, по мне так же замечательно работает.
 

=AK=

New member
Т е Вы данный код ставите в колбек таймера?
А это тоже прерывание. Т е без прерываний нельзя?
Я вообще-то писал "в основном цикле раз в 1 мс обращаемся к процедуре подавления дребезга контакта". Если хотите, то можете и обработку прерывания таймера вставить, но это хуже, поскольку из-за этого будет притормаживать обработка других прерываний.

В вашем варианте если длительность 1 сек то надо сколько ячеек памяти c квантом 1 мс?
Столько же. Для обычных кнопок я вызываю процедуру раз в 10 мс, задержка обнаружения 160 мс. Это определяется длительностью дребезга.
 
Сверху Снизу