Варианты снятия данных датчика на герконе
- Войдите на сайт для отправки комментариев
Введение: нужен был датчик осадков (колличества дождя). Для экспериментов купил китайский осадкомер. Принцип его работы - когда идёт дождь, периодически на долю секунды замыкается геркон.
Не могу придумать хорошего способа подсчёта этих замыканий.
Способ 1. Самый простой, который и использую. Замыкание пропускает 3.3В на любой из аналоговых входов. Опрашиваем аналоговый вход, подсчитываем если на нём есть напряжение.
Недостатки: легко прозевать этот момент замыкания геркона, так как контроллер занят кучей других дел и я использую паузы в програмном коде и паузы длинные и по 2 и по 4 секунды бывает.
Второй недостаток, контроллер постоянно включён. А пока он у меня отправлялся в спячку.
Способ 2 (теоретический). Что, если перед аналоговым входом добавить конденсатор? Чтобы он секунд 10-20 еще мог показывать какое-то напряжение. Тогда я могу как обычно, отправлять в спячку Атмега328, а она это делает на 8 секунд максимум, каждые 8 секунд или реже, опрашивать аналоговый вход и если на нём заряд выше, чем был в предыдущий раз измерения, то значит геркон замыкался, подсчитываем.
Способ 3 (замороченный). В датчике осадков поставить свой отдельный контроллер в постоянной спячке. Замыкание геркона - это как кнопка пробуждения. Проснулся, подсчитал, заснул. А главрый контроллер может обращаться к этому контроллеру осадков по мере надобности, хоть раз в час. Просто забрать цифру, сколько было замыканий геркона.
Недостатки: сложно в реализации.
Сейчас обдумываю второй способ с конденсатором. Теоретически он может быть идеальный. Всё правильно? Чтобы подсчитывать замыкания геркона и не прозевать эти моменты нужен один конденсатор?
Единственно правильный способ это геркон на цифровом входе (или аналоговом, но в цифровом режиме) и обрабатывать прерывание по изменению входа. Геркон лучше замыкать на GND, а сверху к +5в поставить подтяжку порядка 5.1к
4) ATMega328 external interrupt
5) PCF8583 (http://tinkerman.cat/counting-events-with-arduino-and-pcf8583/)
ATMega328 external interrupt - вроде похоже на то, что надо. Но мне надо будет уделить не мало времени, чтобы более точно разобраться.
5-й способ, там где статья на английском - это как предложенный мною третий способ. Когда датчик имеет свой собственный контроллер. Там предлагают PCF8583. Насколько я понял.
Снимкть же прерывания просто с цыфрового входа, как пишет axill, не выйдет, так как можно это прерывание прозевать. Или... Разве что поставить еще датчик дождя и если дождь идёт, то не отвлекаться ни на что (и не засыпать) и подсчитывать эти замыкания геркона.
А у меня была надежда, что может... Всё можно реализовать одним маленьким конденсатором.
Хотя,.теперь думаю, что надо смотреть в сторону ATMega328 external interrupt.
Если руки из нужного места то прозевать прерывание не возможно
Они умеют контроллер из Sleep Mode вытаскивать.
По всей видимости, из всех рассмотренных вариантов, в данном случае оптимальный - 4-й, внешние прерывания:
"...допустим у вас в основном цикле программы используются задержки (например, для мигания светодиодом), при этом вам кнопкой нужно перевести работу светодиода в другой режим. Если обработка кнопки находится в основном цикле, то придется ждать пока не отработают все фрагменты кода и очередь не дойдет до обработки кнопки. Иногда это не удобно.
Поэтому в микроконтроллерах придумали такую удобную вещь, как внешнее прерывание. Это значит, что при подаче сигнала на ножку микроконтроллера, основная программа остановится и начнет выполняться такой код, который вы напишите в функции прерывания. После выполнения данной функции, основная программа продолжит выполняться с места, где ее прервали."
А код подсчёта будет выглядеть приблизительно так:
"interrupt [EXT_INT0] void ext_int0_isr(void)
{
i++;
}"
В общем, буду экспериментировать с этими внешними прерываниями. Спасибо.
Имейте в виду, что атмега328 две системы прерываний, INT0/1 и PCINT
Первая работает только на двух ножках. Вторая на всех. Ваш пример протпервую систему
Оптимального в вашем списке нет: опрашивать дискретный вход через равные промежутки времени, устранять дребезг контактов геркона и после этого считать его импульсы.
А с прерываниями вы получите много ложных срабатываний, если контакты геркона дребезжат. А все механические контакты имеют свойство дребезжать. Конечно, и с прерываниями можно справиться с дребезгом, но геморроя будет намного больше.
Я бы тоже делал опрос по таймеру, а от пауз в коде ушел бы вообще - обычно все можно реализовать через millis, что позволяет делать достаточно точные паузы, но не останавливать работу.
Хотя если очень хочется конденсатор - то его можно совместить с прерыванием. :)
Нет никакого геморроя. Если автор готов освоить прерывания и сон, с дребезгом справится
в данной задаче опрос по интервалам легко даст ошибку
да и пробоема дребезга с герконом сильно преувеличена
в данной задаче опрос по интервалам легко даст ошибку
Какую еще ошибку? Опрос должен быть достаточно частым, товарщ Котельников с господином Найквистом уверяют, что тогда ошибок не будет. Наоборот, опросом можно еще избавится от ошибок, вызванных внешними помехами.
Недаром станками управляют PLC, которые все делают циклически, а не по прерываниям. А по прерываниям всякие оффисные устройства делают, где надежность не играет роли.
triac так и поставьте PLC, в чем проблема?
на ардуине чтобы ловить замыкание на долю секунды делая это частыми опросами? да еще и с батарейным питанием? умно
axill, вот, вот, вот. И я о том же. Постоянно держать контроллер включённым, постоянно крутить цикл опроса цифрового входа и всё это от аккумулятора и всё ради того, чтобы раз в месяц выявить 5 замыканий геркона - мне это показалось не рациональным. Думал, другого способа и нет по этому, хотел хоть конденсатор применить, чтобы не так часто опрашивать. А тут оказывается есть прерывание, которое и в delay может сработать и в sleep mode. Это же круто.
Про ложные срабатывания - покажет практика. Ведь есть разные события на прерываниее. И нарастающий сигнал. И спадающий. Какой-то же из них явно не должен глючить.
Мне пока одно не понятно. Все пишут, чтобы через геркон я проводил минус GRD. Как же ножка прерывания поймёт, что это логическая единица, когда цепь будет замыкаться.
С остальным, всё понятно. Рабочую схему и код я тут запощу, как реализую, Вдруг еще кому-то понадобится геркон мониторить.
Между ногой контроллера и +5в надо поставить резистор порядка 5.1к. Когда геркон разомкнут, нога будет притянута к плюсу. Когда геркон замкнут - притянута к минусу (логические 1/0)
дребезг у герконов минимальный. Но и его можно убить как программно так и RC фильтром на входе
может легче подтяжку включить ?
Внутренняя подтяжка порядка 20ком. Великовата для длинных проводов, может срабатывать на помехи
Вобще чтоб определится между прерываниями и переодическим опросом полезно знать сколько в цифрах будут это "периодически на долю секунды замыкается геркон." Но при слипе 8сек похоже таки прерывания предпочтительней. Или слип уменшать до долей секунды, что вобщем тоже вариант, потребление не должно заметно изменится. Подтяжка в 5.1КОм тоже многовато для внешнего провода, подтяжка в 1КОм понадежней.
INT0/1 или PCINT? - умеючи любой.
triac так и поставьте PLC, в чем проблема?
на ардуине чтобы ловить замыкание на долю секунды делая это частыми опросами? да еще и с батарейным питанием? умно
Для батарейного питания очевидных вариантов два:
- понизить тактовую частоту, скажем, до 32 кГц, и тем самым снизить потребление примерно до 20-50 мкА, при этом непрерывно проверяя состояние входов
- спать и просыпаться по прерываниям по изменению состояния пина, после чего через равные промежутки времени брать самплы до без пор, пока последние несколько самплов не станут одинаковыми
Для тока потребления оба варианта будут примерно равноценны, поскольку кроме потребления МК есть иные издержки, например, утечки электролитов или ток через резистор подтяжки, который, для предложенного вами номинала 5.1к будет на порядок больше тока потребления МК.
насколько часто это периодически при дожде? и насколько точно желательно измерять в этих попугаях?
насколько часто это периодически при дожде?
Это бы показала практика, так как не знаю. Предположительно, раз в 10 секунд.
Напомню суть вопроса. Я интересовался, как способом оптимально подсчитывать замыкания геркона. Вариантов много, но в моём случае идеальным оказался External interrupt.
А с прерываниями вы получите много ложных срабатываний, если контакты геркона дребезжат. А все механические контакты имеют свойство дребезжать.
Нет никакого геморроя. Если автор готов освоить прерывания и сон, с дребезгом справится
да и пробоема дребезга с герконом сильно преувеличена
Я тоже изначально не увидел никакой проблемы. Действительно, при замыкании контактов (а в будущем геркона) прерывания во всех вариациях (LOW, HIGE, CHANGE, FALLING) срабатывали многократно за одно замыкание на D2. Я думал фиксировать это, как собитые (что показатели счётчика изменились) и в коде программы подсчитывать эти события. Мол, не важно, сколько раз сработали внешние прерывания, важно, что в определённый момент времени они были. Но потом придумал более простой вариант: после первого же срабатывания прерывания - отключить опрос прерываний.
Вариант кода, который у меня работает, привожу ниже: