Варианты снятия данных датчика на герконе

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

Введение: нужен был датчик осадков (колличества дождя). Для экспериментов купил китайский осадкомер. Принцип его работы - когда идёт дождь, периодически на долю секунды замыкается геркон.

Не могу придумать хорошего способа подсчёта этих замыканий.
Способ 1. Самый простой, который и использую. Замыкание пропускает 3.3В на любой из аналоговых входов. Опрашиваем аналоговый вход, подсчитываем если на нём есть напряжение.
Недостатки: легко прозевать этот момент замыкания геркона, так как контроллер занят кучей других дел и я использую паузы в програмном коде и паузы длинные и по 2 и по 4 секунды бывает.
Второй недостаток, контроллер постоянно включён. А пока он у меня отправлялся в спячку.

Способ 2 (теоретический). Что, если перед аналоговым входом добавить конденсатор? Чтобы он секунд 10-20 еще мог показывать какое-то напряжение. Тогда я могу как обычно, отправлять в спячку Атмега328, а она это делает на 8 секунд максимум, каждые 8 секунд или реже, опрашивать аналоговый вход и если на нём заряд выше, чем был в предыдущий раз измерения, то значит геркон замыкался, подсчитываем.

Способ 3 (замороченный). В датчике осадков поставить свой отдельный контроллер в постоянной спячке. Замыкание геркона - это как кнопка пробуждения. Проснулся, подсчитал, заснул. А главрый контроллер может обращаться к этому контроллеру осадков по мере надобности, хоть раз в час. Просто забрать цифру, сколько было замыканий геркона.
Недостатки: сложно в реализации.

Сейчас обдумываю второй способ с конденсатором. Теоретически он может быть идеальный. Всё правильно? Чтобы подсчитывать замыкания геркона и не прозевать эти моменты нужен один конденсатор?

axill
Offline
Зарегистрирован: 05.09.2011

Единственно правильный способ это геркон на цифровом входе (или аналоговом, но в цифровом режиме) и обрабатывать прерывание по изменению входа. Геркон лучше замыкать на GND, а сверху к +5в поставить подтяжку порядка 5.1к

sadman41
Offline
Зарегистрирован: 19.10.2016

4) ATMega328 external interrupt

5) PCF8583 (http://tinkerman.cat/counting-events-with-arduino-and-pcf8583/)

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

ATMega328 external interrupt - вроде похоже на то, что надо. Но мне надо будет уделить не мало времени, чтобы более точно разобраться.
5-й способ, там где статья на английском - это как предложенный мною третий способ. Когда датчик имеет свой собственный контроллер. Там предлагают PCF8583. Насколько я понял.
Снимкть же прерывания просто с цыфрового входа, как пишет axill, не выйдет, так как можно это прерывание прозевать. Или... Разве что поставить еще датчик дождя и если дождь идёт, то не отвлекаться ни на что (и не засыпать) и подсчитывать эти замыкания геркона.

А у меня была надежда, что может... Всё можно реализовать одним маленьким конденсатором.

Хотя,.теперь думаю, что надо смотреть в сторону ATMega328 external interrupt.

axill
Offline
Зарегистрирован: 05.09.2011

Если руки из нужного места то прозевать прерывание не возможно

sadman41
Offline
Зарегистрирован: 19.10.2016

Weisnar пишет:
ATMega328 external interrupt - вроде похоже на то, что надо

Они умеют контроллер из Sleep Mode вытаскивать.

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

По всей видимости, из всех рассмотренных вариантов, в данном случае оптимальный - 4-й, внешние прерывания:
"...допустим у вас в основном цикле программы используются задержки (например, для мигания светодиодом), при этом вам кнопкой нужно перевести работу светодиода в другой режим. Если обработка кнопки находится в основном цикле, то придется ждать пока не отработают все фрагменты кода и очередь не дойдет до обработки кнопки. Иногда это не удобно.

Поэтому в микроконтроллерах придумали такую удобную вещь, как внешнее прерывание. Это значит, что при подаче сигнала на ножку микроконтроллера, основная программа остановится и начнет выполняться такой код, который вы напишите в функции прерывания. После выполнения данной функции, основная программа продолжит выполняться с места, где ее прервали."

А код подсчёта будет выглядеть приблизительно так:
"interrupt [EXT_INT0] void ext_int0_isr(void)
{
i++;
}"
В общем, буду экспериментировать с этими внешними прерываниями. Спасибо.

axill
Offline
Зарегистрирован: 05.09.2011

Имейте в виду, что атмега328 две системы прерываний, INT0/1 и PCINT

Первая работает только на двух ножках. Вторая на всех. Ваш пример протпервую систему

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Weisnar пишет:
По всей видимости, из всех рассмотренных вариантов, в данном случае оптимальный - 4-й, внешние прерывания:

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

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

Чечако
Offline
Зарегистрирован: 15.06.2018

Я бы тоже делал опрос по таймеру, а от пауз в коде ушел бы вообще - обычно все можно реализовать через millis, что позволяет делать достаточно точные паузы, но не останавливать работу.

Хотя если очень хочется конденсатор - то его можно совместить с прерыванием. :)

axill
Offline
Зарегистрирован: 05.09.2011

Нет никакого геморроя. Если автор готов освоить прерывания и сон, с дребезгом справится

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

да и пробоема дребезга с герконом сильно преувеличена

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

axill пишет:

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

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

Недаром станками управляют PLC, которые все делают циклически, а не по прерываниям. А по прерываниям всякие оффисные устройства делают, где надежность не играет роли.

axill
Offline
Зарегистрирован: 05.09.2011

triac так и поставьте PLC, в чем проблема?

на ардуине чтобы ловить замыкание на долю секунды делая это частыми опросами? да еще и с батарейным питанием? умно

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

axill, вот, вот, вот. И я о том же. Постоянно держать контроллер включённым, постоянно крутить цикл опроса цифрового входа и всё это от аккумулятора и всё ради того, чтобы раз в месяц выявить 5 замыканий геркона - мне это показалось не рациональным. Думал, другого способа и нет по этому, хотел хоть конденсатор применить, чтобы не так часто опрашивать. А тут оказывается есть прерывание, которое и в delay может сработать и в sleep mode. Это же круто.
Про ложные срабатывания - покажет практика. Ведь есть разные события на прерываниее. И нарастающий сигнал. И спадающий. Какой-то же из них явно не должен глючить.
Мне пока одно не понятно. Все пишут, чтобы через геркон я проводил минус GRD. Как же ножка прерывания поймёт, что это логическая единица, когда цепь будет замыкаться.
С остальным, всё понятно. Рабочую схему и код я тут запощу, как реализую, Вдруг еще кому-то понадобится геркон мониторить.

axill
Offline
Зарегистрирован: 05.09.2011

Между ногой контроллера и +5в надо поставить резистор порядка 5.1к. Когда геркон разомкнут, нога будет притянута к плюсу. Когда геркон замкнут - притянута к минусу (логические 1/0)

дребезг у герконов минимальный. Но и его можно убить как программно так и RC фильтром на входе

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

может легче подтяжку включить ?

axill
Offline
Зарегистрирован: 05.09.2011

Внутренняя подтяжка порядка 20ком. Великовата для длинных проводов, может срабатывать на помехи

Logik
Offline
Зарегистрирован: 05.08.2014

Вобще чтоб определится между прерываниями и переодическим опросом полезно знать сколько в цифрах будут это "периодически на долю секунды замыкается геркон." Но при слипе 8сек похоже таки прерывания предпочтительней. Или слип уменшать до долей секунды, что вобщем тоже вариант, потребление не должно заметно изменится. Подтяжка в  5.1КОм тоже многовато для внешнего провода, подтяжка в 1КОм понадежней. 

INT0/1 или PCINT? - умеючи любой.

 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

axill пишет:

triac так и поставьте PLC, в чем проблема?

на ардуине чтобы ловить замыкание на долю секунды делая это частыми опросами? да еще и с батарейным питанием? умно


Для батарейного питания очевидных вариантов два:
- понизить тактовую частоту, скажем, до 32 кГц, и тем самым снизить потребление примерно до 20-50 мкА, при этом непрерывно проверяя состояние входов
- спать и просыпаться по прерываниям по изменению состояния пина, после чего через равные промежутки времени брать самплы до без пор, пока последние несколько самплов не станут одинаковыми

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

ВН
Offline
Зарегистрирован: 25.02.2016

Weisnar пишет:
Введение: нужен был датчик осадков (колличества дождя). Для экспериментов купил китайский осадкомер. Принцип его работы - когда идёт дождь, периодически на долю секунды замыкается геркон.

насколько часто это периодически при дожде? и насколько точно желательно измерять в этих попугаях?

Weisnar
Weisnar аватар
Offline
Зарегистрирован: 19.07.2018

ВН пишет:

насколько часто это периодически при дожде?

Это бы показала практика, так как не знаю. Предположительно, раз в 10 секунд. 

Напомню суть вопроса. Я интересовался, как способом оптимально подсчитывать замыкания геркона. Вариантов много, но в моём случае идеальным оказался External interrupt.

triac пишет:

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

axill пишет:

Нет никакого геморроя. Если автор готов освоить прерывания и сон, с дребезгом справится

да и пробоема дребезга с герконом сильно преувеличена

Я тоже изначально не увидел никакой проблемы. Действительно, при замыкании контактов (а в будущем геркона) прерывания во всех вариациях (LOW, HIGE, CHANGE, FALLING) срабатывали многократно за одно замыкание на D2. Я думал фиксировать это, как собитые (что показатели счётчика изменились) и  в коде программы подсчитывать эти события. Мол, не важно, сколько раз сработали внешние прерывания, важно, что в определённый момент времени они были. Но потом придумал более простой вариант: после первого же срабатывания прерывания - отключить опрос прерываний. 

CHANGE

Вариант кода, который у меня работает, привожу ниже:

unsigned int ger_count = 0;

void GerkOn ()
{
  ger_count++;
  detachInterrupt (digitalPinToInterrupt (2));      
}  

void setup ()
{
  Serial.begin(9600);
  digitalWrite (2, HIGH);
} 

void loop ()
{
  delay(1000);
  Serial.println(ger_count); 
  attachInterrupt (digitalPinToInterrupt (2), GerkOn, LOW); 
}