Счетчик импульсов.
- Войдите на сайт для отправки комментариев
Приветствую участников форума!
Спасибо, что обратили внимание на мой пост. Буду благодарен за помощь и советы. Сейчас продумываю проект домашней системы раздельного учета электроэнергии. То есть от плиты отдельно, от холодильника отдельно и так далее. Теория пока такая. Поставить несколько (на каждую линию потребления, которую буду учитывать) самых дешевых электросчетчиков типа "нева 102 или 105". У каждого из них имеется светодиод, который моргает 1000 раз на один киловаттчас. Вот эти импульсы я и хочу считать и собирать раз в сутки или час (тут пока неважно) их количество. Почитав форум узнал, что такой счетчик проще всего сделать на прерываниях. Но у меня планируется несколько таких счетчиков. Точное количество не могу пока сказать, но допустим пусть их будет 10 (десять). То есть мне нужно считать импульсы от 10 источников. Существует способ с дополнительными внешними прерываниями, который возможно подойдет для моей задачи, но понимание прерываний пока мне дается с очень большим трудом. И я пытаюсь придумать алгоритм подсчета, который позволил бы обойтись без прерываний.
Хотел узнать смогу ли я обойтись простым опросом пинов функцией DigitalRead()? Из инструкции к счетчику известно, что "минимальная длительность импульса, формируемого устройством не менее 30 мс". Время выполнения функции DigitalRead() около 110 мкс, если я не ошибаюсь. Так вот, если я в цикле буду постоянно опрашивать состояние 10 пинов, смогу ли я "поймать" эти импульсы?
самый простой вариант, конечно, это собрать да и пропробовать, но у меня, к сожалению, нет пока счетчиков и свободной ардуины. Да и не очень хочется траться, если окажется, что это заведомо неверное решение.
Алексей Н, и аппаратно и программно вы задумали чудовищный колхоз. Всё это в лучшем случае если и заработает - будет обязательно глючить и абы как считать. Так что совет либо купить необходимое готовое решение, либо делать как пологается с адекватной технической и программной разработкой.
Алексей Н, и аппаратно и программно вы задумали чудовищный колхоз. Всё это в лучшем случае если и заработает - будет обязательно глючить и абы как считать. Так что совет либо купить необходимое готовое решение, либо делать как пологается с адекватной технической и программной разработкой.
Использовать эектросчетчик, специально для этого разработанный, это колхоз? Или Вы про подсчет импульсов? Так в этих счетчиках есть опять же заводские выводы для снятия этих импульсов. Вопрос только в том, как эти импульсы посчитать и сохранить в удобном виде.
Готовое решение, конечно, всегда самый правильный выбор. А если его установкой будут заниматься профессионалы, то вообще нужда в ардуине и в данном форуме (да и вообще в интернете) отпадает :) Только цена вопроса начинается от 75 000 руб. Так что "лучше помучиться".
Алексей Н, для связи с внешними устройствами специально выпускаются счётчики с шиной ModBUS/RS485. Это точно не колхоз :-)
А не проще купить что-то подобное
http://mysku.ru/blog/aliexpress/39864.html
Так вот, если я в цикле буду постоянно опрашивать состояние 10 пинов, смогу ли я "поймать" эти импульсы?
самый простой вариант, конечно, это собрать да и пропробовать, но у меня, к сожалению, нет пока счетчиков и свободной ардуины. Да и не очень хочется траться, если окажется, что это заведомо неверное решение.
По моему мнению, с десяти пинов корректно собрать и посчитать импульсы не выйдет. Надо ли бо городить отдельные счетчики на логике, а ардуина по графику будет снимать с них показания или на каждый электро счетчик вешать по ардуине pro mini с фотодатчиком, блоком питания и модулем rs485 (в сумме 500-600 р на один электросчетчик). На каждом счетчике своя ардуина, считает импульсы и по запросу от главной полученную сумму отсылает.
Согласен. Про RS485 я даже знаю. Но это значит, что для сбора и хранения статистики должен быть всегда включен компьютер. Плюс необходимость писать какую-то собственную программу для регулярного сбора данных.
В общем, пока не отказываюсь от "колхоза" на ардуино. Буду думать как его реализовать. И все еще надеюсь на советы.
JasKo, там не нужен фотодатчик. Есть специально выведенные контакты, с которых можно снимать импульсы параллельно с миганием светодиода. И это как раз меня и подталкивает к мыслям об их использовании.
Согласен. Про RS485 я даже знаю. Но это значит, что для сбора и хранения статистики должен быть всегда включен компьютер. Плюс необходимость писать какую-то собственную программу для регулярного сбора данных.
С чего такие выводы? Чем отличается сбор моргания светодиода от сбора информации по rs485 ? И в том и другом случае можно исплользовать ардуино, и в том и другом случае нужно писать программу. Только в первом случае вы соберте все возможные глюки и помехи, а во втором нет.
Да, по поводу контактов глянул действительно есть - значит оптопара потребуется.
Зачем отдельный комп- можно сбор данных и на ардуине отдельной организавать на туже SD карту запихивать.
JasKo, именно так я и планировал. Собирать данные ардуиной и писать на карту. А по мере надобности запускать компьютер и получать эти данные и уже строить из них всякие графики. Но вот как это реализовать пока не знаю. Можно чуть поподробнее про "счетчики на логике"?
dimax, если Вы уже отвечаете на мои вопросы, то не согласитесь ли ответить еще на пару? :) Про rs485 я знаю. И, в принципе, можно найти относительно недорогие китайские электросчетчики с rs485. Но вот как подключить десяток таких счетчиков к ардуино и собирать с них данные я не могу понять. Не могли бы вы дать ссылку на какой-нибудь похожий проект? Первичный поиск в интернете выдал только про подключение ардуин между собой. Опять же при посчете импульсов каждый день/час можно просто сбрасывать счетчик, а при считывании данных по rs485 придется как-то запоминать последнее значение и из него вычитать новое каждый день?
dimax, посмотри что представляют собой счетчики neva 102 и сразу станет ясно от куда соблазн считать с них импульсы одной ардуиной. Все счетчики легко смонтируются в одном ящике и тамже поместятся ардуинки. В принципе там и 485 не нужен будет, можно все по I2C соеденить, в одном корпусе то. Это ж не раскиданные в пространстве.
Но вот как подключить десяток таких счетчиков к ардуино и собирать с них данные я не могу понять. Не могли бы вы дать ссылку на какой-нибудь похожий проект? Первичный поиск в интернете выдал только про подключение ардуин между собой. Опять же при посчете импульсов каждый день/час можно просто сбрасывать счетчик, а при считывании данных по rs485 придется как-то запоминать последнее значение и из него вычитать новое каждый день?
rs485 это физическая реализация последовательного интерфейса для больших расстояний и плохих условий.
В описании к счетчику наверняка есть указание какую последовательность бит ему послать, что бы в ответ он выслал свои показании. И укаждого счетчика своя последовательность бит на которые он отвечает, это если в общих чертах.
Вот еще вариант. На каждый счетчик повесить по ардуино про мини. При цене менее ста рублей вполне демократичный вариант. Каждая про мини будет имет счетчик на прерываниях. Соединить их между собой и "мастер-ардуиной", которая (в смысле "мастер") будет подавать сигнал на передачу данных или обнуление счетчиков. Или тоже адский колхоз?
Алексей Н, я вам просто подаю идею как технически грамотно сделать, (и как сделал бы сам) А подробностей к сожалению не знаю, т.к. счётчики никогда не подключал. Но раз есть счётчики с такой шиной , стало быть и документация на протокол общения с ним должна быть. Соединить все 10 счётчиков двумя проводами -в любом случае лучше чем тянуть от каждого сигнал фотодиодов. Конечно если все 10 счётчиков и арудино стоят в одном шкафу -то да, можно рассмотреть вариант ловить ардуиной моргания. Но если всё разбросано по квартире -то однозначное нет.
Использовать эектросчетчик, специально для этого разработанный, это колхоз?
Специально разработанного - нет, но Вы же планируете использовать счётчики специально разработанные для того, чтобы с них можно было автоматически снимать показания, правда? Вы хотите мигание считать - это даже не колхоз, это значительно более бардачно - скорее на армию похоже.
А в профессиональном решении ничего особо дорого нет. Счётчики не такие уж и дорогие, а связать их с компьютером по RS-485 много ума не надо. Вот, для начала почитайте - http://electrik.info/main/master/103-pro-yelektronnye-schetchiki-i-askuye-dlya.html
Честно говоря, не понимаю, зачем нужно 10 ардуин, если все счетчики собраны в одной коробке, у каждого есть контакт, на который подается импульс и длительность импульса не менее 30 мс.
Кстати, более 100 мкс - это analogRead, а digitalRead выполняется во много раз быстрее.
ЕвгенийП, почему Вы считаете это бардаком, если даже в статье по Вашей ссылке (кстати, спасибо, интересно, хотя и довольно общие сведения) написано про телеметрический выход (импульсный датчик), обеспечивающий передачу по двухпроводной линии связи информации о проходящей через счетчик активной (реактивной) энергии в систему дистанционного сбора и обработки данных?
andriano, счетчики все будут собраны в одной коробке. И я тоже не уверен, что мне необходимо 10 ардуин. Но я пока так и не узнал ответ на свой первый вопрос. Можно ли считывать импульсы электросчетчика функцией DigitalRead? Это же все равно что посчитать количество нажатий на кнопку. Или я ошибаюсь?
Ну, как почему, Вам же уже объясняли, что измерять импульсы digitalRead'ом - это половину пропутить, а другую учесть дважды. В результате - вместо измеренных значений - цена на овёс. Либо уж надо снимать показания вручную, либо брать (делать) счётчики, которые умеют передавать свои показания в нормальном цифровом виде.
Но я пока так и не узнал ответ на свой первый вопрос. Можно ли считывать импульсы электросчетчика функцией DigitalRead? Это же все равно что посчитать количество нажатий на кнопку. Или я ошибаюсь?
Если Вы о digitalRead (это - разные функции, С - регистрочувствительный язык), то нельзя. Ею можно считывать только уровень сигнала. А определять, гда закончился один импульс и начался другой - это уже самостоятельно. Аналогия с кнопкой в целом уместная, но здесь проще, т.к. известна хотя бы одна характеристика импульса - ограничение на его длительность.
Так в том то и дело, что никто не объснил почему половина импульсов окажется пропущенной. И в общем-то Вы первый кто это написал.
Ну, как почему, Вам же уже объясняли, что измерять импульсы digitalRead'ом - это половину пропутить, а другую учесть дважды.
Как показывают несложные подсчеты, если пропустить половину импульсов, а оставшуюся половину учесть дважды, мы получим точный ответ в случае четного количества импульсов и ошибку в один импульс - в случе нечетного. Впрочем, если импульсов будет нечетное число, то нам никак не удасттся пропустить ровно половину из них, т.е. условие не выполняется.
Вывод: результат во всех случаях будет точный.
...либо брать (делать) счётчики, которые умеют передавать свои показания в нормальном цифровом виде.
Так в том то и дело, что никто не объснил почему половина импульсов окажется пропущенной. И в общем-то Вы первый кто это написал.
Лично я здесь вижу только одну потенциальную причину - Вашу недостаточную квалификацию. То есть, когда Вы будете писать скетч, Вам придется заботиться о том, чтобы импульсы не были пропущены и не были посчитаны дважды (а то и тысячи раз). digitalRead это за Вас не сделает.
..... Аналогия с кнопкой в целом уместная, но здесь проще, т.к. известна хотя бы одна характеристика импульса - ограничение на его длительность.
Вот вам и ответ (правильно заданный вопрос это 99% ответа). У вас есть уверенность что при равной длинне импульса, не будет одновременно импульсов на 1, 5, 7, и еще каком входе, в то время как вы будете проверять первый вход?
В данном случае количество потребленной энергии есть функция частоты импульсов, поэтому на ардуине надо делать частотомер, и проще взять одну копечную ардуину на один электросчетчик, чем городить программный огрод и оргебать глюки по полной. Не согласны?
А взять Due и не париться? Там на каждую цифровую ногу, емнип, можно прерывание повесить.
Повесить то можно, но где уверенность, что корректно отработаешь пяток одновременных прерываний.
Ведь в большинстве электросчетчиков с АСКУЭ как раз атмеловские процы и стоят. По одному в каждом.
Вот вам и ответ (правильно заданный вопрос это 99% ответа). У вас есть уверенность что при равной длинне импульса, не будет одновременно импульсов на 1, 5, 7, и еще каком входе, в то время как вы будете проверять первый вход?
В данном случае количество потребленной энергии есть функция частоты импульсов, поэтому на ардуине надо делать частотомер, и проще взять одну копечную ардуину на один электросчетчик, чем городить программный огрод и оргебать глюки по полной. Не согласны?
У меня есть такая уверенность. Время импульса не менее 30 мс. Скорость выполнения digitalRead во много раз меньше. То есть совпадение по времени digitalRead и импульса получится в любом случае. Ну в 99,9% так точно. Пока только я не продумал алгоритм фиксации и учета импульсов. А вот как раз с прерываниями может и не получиться именно по этой причине
Ну что ж, раз уверены, не буду разубеждать, реализуйте.
Создание нескольких тахометров на отдельных ардуинах и объединение их в сеть наверное самый оптимальный вариант. Но тут получается, что единственный способ обмена данными это I2C. Прерывания-то будут заняты. Сгодится ли такой способ обмена данными? Просто я про объединение в сеть и обмен данными пока даже не читал.
Надо признать, что я был не прав, так как не оценил быстротечность процессов счетчика.
А быстртечность здесь вообще никая - максимум 2,5 импульса в секунду на одной ноге(это соответсвует 8,8 квтч при токе 40А -максимальном для счетчика, 8800 импульсов в час).
Так что все можно сделать одной ардуиной, так как чтение одного регистра, анализ измененых в HIGH битов и увеличение соответсвующих счетчиков на еденицу заняло в у меня в тестовом примере 24 микросекунды, что более чем достаточно для мониторинга электросчетчиков с длинной импульса от 30 милисек.
Тестовый пример на скорую руку
Спасибо всем отвечавшим. Я даже не ожидал такого.
JasKo отдельное спасибо за код. Мне даже неудобно перед Вами, потому что воспользоваться Вашими советами прямо сейчас я не смогу. Но всю тему себе сохранил.
Алексей Н, вы не обольщайтесь выводами JasKo, скетч то писать Вам, и сколько процессорного времени у вас уйдёт на побочные расходы - никому сейчас не известно. Информацию нужно читать,хранить, выводить на дисплей, и всё это складывается в единицы и десятки миллисекунд. Может в какой нибудь библе запросто стоять скрытый delay и мешать алгоритму, а то ещё и сами влепите delay, и всей конструкции крышка. А главное когда вы через месяц пользования подобъёте сумму всех счётчикв и она сильно не сойдётся с основным -то искать где у вас идут потери будет просто нереально. А если вы будете читать специализированный счётчик через RS485 то всего этого гарантированно можно избежать :)
dimax, я совершенно не питаю иллюзий. Проблемы могут быть и в скетче и в подключении и вообще где угодно. Но теперь у меня есть еще несколько предложенных вариантов, которые я буду рассматривать подробнее. А это уже лучше чем мусолить одну единственную идею, заранее неверную. Да и я не собираюсь прямо сейчас бросаться это делать. У меня есть достаточно времени, чтобы все хорошо обдумать, создать еще пару тем :) с вопросами и только потом все это начать.
Для передачи на другую ардуино, где может быть развернут сервер с аналитикой рекомендую посмотреть вот этоинтересное решение http://lesson.iarduino.ru/page/urok-26-3-soedinyaem-dve-arduino-po-shine-i2c/
Как показывают несложные подсчеты, если пропустить половину импульсов, а оставшуюся половину учесть дважды, мы получим точный ответ в случае четного количества импульсов и ошибку в один импульс - в случе нечетного. Впрочем, если импульсов будет нечетное число, то нам никак не удасттся пропустить ровно половину из них, т.е. условие не выполняется.
Вывод: результат во всех случаях будет точный.
:---))))))
Это если пропустить ровно половину и учесть ровно дважды :) Боюсь, что ТС собирается пропускать и учитывать "как получится" :-) Но в среднем, всё равно всё будет замечательно - Вы правы! ТС развлечётся, поковыряется, удовольствие получит :)))
Вот давайте только без этих ехидных комментариев. Я не собираюсь делать "как получится". Именно для этого я и задаю здесь вопросы. Сейчас, кстати, нашел достаточно много информации на англоязычных ресурсах, посвященных АСКУЭ. На всякий случай оставляю здесь ссылки openenergymonitor.org http://www.airsensor.co.uk/component/zoo/item/energy-monitor.html Там не все так просто, как я думал с начала, но результат стоит того, чтобы разобраться.
Я не собираюсь делать "как получится"
"Оно т, конечно, ничего, ежели бы кабы то. Но так как оно не токмо то, а прямо почём зря, постольку поскольку оно, дескать, так сказать, а потому так шож! Но ежели коснуться относительно безусловно, то кудыж там. И тем не менее, однако, случись, так вот тебе и пожалуйста!!! "
Ну а если серьёзно, то если хотите "не как попало", то попробуйте для разминки сделать 1 (один) счётчик, чтобы он спокойно работал и отдавал свои результаты персоналке или там ещё кому. Запустите и добейтесь чтобы он работал нормально, отладьте, дополируйте. И только потом, когда один образец уже есть, начинайте думать о 10-ти.
Вот вам и ответ (правильно заданный вопрос это 99% ответа). У вас есть уверенность что при равной длинне импульса, не будет одновременно импульсов на 1, 5, 7, и еще каком входе, в то время как вы будете проверять первый вход?
Время проверки одного входа - менее 10 мкс.
Длительность импульса - не менее 30000 мкс.
Входов всего 10 штук.
Вы всерьез считаете, что я не успею зафиксировать несколько импульсов с разных входов?
Вы всерьез считаете, что я не успею зафиксировать несколько импульсов с разных входов?
Нет, уже так не считаю, и уже написал об этом в посте http://arduino.ru/forum/obshchii/schetchik-impulsov#comment-208079
Насколько помню, у Невы 123 есть вариант исполнения с выходм по RS-485 интерфейсу. В общем-то у меня такой и стоит. Программа учета качается из сети ,она строит почасовые графики потребления. По этим графикам прекрасно видно, где включатеся стиральная машина, где посудойка, а где постоянно потребляет холодильник.
тут подробности http://shyza.ru/forum/viewtopic.php?f=12&t=102
ВН, не совсем то что я хочу сделать. Я и так знаю когда включена стиралка, чайник или токарный станок. Цель в том, чтобы подсчитать на что именно расходуется электроэнергия и в конечном итоге деньги. По Вашему графику Вы можете сказать что больше потребляет энергии (и тратит денег): стиральная машина, мощная, но редко включаемая, или холодильник, экономичный, но работающий постоянно? В посте ЕвгенийП выше есть ссылка про основы АКСУЭ.
Сейчас курю материал по ссылке https://openenergymonitor.org/emon/buildingblocks/12-input-pulse-counting Вроде именно то, что мне нужно. Но опять же не факт, что я остановлюсь на этом варианте.
Вы же сами писали "Поставить несколько (на каждую линию потребления, которую буду учитывать) ...электросчетчиков типа "нева..."
У меня описано, что может делать один. а там уже дело хозяйское, ставить несколько готовых девайсов или что-то там изобретать.
Доброго времени суток!
Подобная задача решена много раз. Один из примеров решения: http://www.sysmc.ru/documentation/sensor_network/SysMC%20Sub1G%20Sensor%20Network.pdf
Строится беспроводная сеть, к каждому узлу подключается до двух счетчиков. А координатор подключается к ардуино и опрашивается ею по цифровому интерфейсу (где-то у меня пример был, если надо, потом найду).
При этом, со стороны ардуино можно управлять несколькими цифровыми выходами (то есть, к примеру включать-отключать нагрузку).
Я не программист...может что-то глупое скажу. Но мне кажется, что если 10 счетчиков представить как десятибитный регистр и считывать его (т.е. одновременно состояние каждой линии каждого счетчика) по быстренькому много-много раз в секунду одной ардуинкой, а по состоянию битов (т.е. по изменению состояния включился выключился) плюсовать, в соответствующую каждому счетчику переменную, одну единичку.
Такое возможно программно реализовать?
Для электро счетчиков с их небольшой частотой импульсов можно. Уже обсудили тут всё.
Для электро счетчиков с их небольшой частотой импульсов можно. Уже обсудили тут всё.
Joiner, можно конечно. Но вы видите только "фасад", за которым скрывается серьёзная рутина. Начиная с того, что алгоритм должен четко различать когда идёт повторное считывание лог. уровня сигнала, а когда это уже новое состояние. Значит как минимум нужен ещё один 10 битный "регистр" с флагами, которые так же в цикле нужно проверять и обновлять. Далее обрабатывать полученную информацию тоже нужно, сохранять периодически всё на флэшкарту или куда-то в еепром, выводить на дисплей, и прочее прочее. Хватит ли скорости на всё это, особенно если писать "размашисто" ардуиновскими командами, - вот в чём вопрос.
Joiner, можно конечно..................
Мне такая задача не по зубам. Просто быстренько прочитал тему, мелькнула такая мысля.
А зачем счетчики? Давно уже делал измеритель мощности ещё на msp430. Повторить на ардуине не проблема. Маленькая плата с вилкой и розеткой. Включаешь любое устройство и имеешь активную реактивную и полную мощность. Легко объединяются с помощью RS485. Можно опрашивать по ModBus. Иметь полную статистику по мощности и энергии. Учитывая разброс потребителей по пространству мне кажется такое решение и гибче и проще в коммуникации.
Я не программист...может что-то глупое скажу. Но мне кажется, что если 10 счетчиков представить как десятибитный регистр и считывать его (т.е. одновременно состояние каждой линии каждого счетчика) по быстренькому много-много раз в секунду одной ардуинкой, а по состоянию битов (т.е. по изменению состояния включился выключился) плюсовать, в соответствующую каждому счетчику переменную, одну единичку.
Такое возможно программно реализовать?
Можно. По последней ссылке, кторую я приводил имеено так и сделано. И я буду начинать пробовать именно так.
Вывод: по ссылкам никто никогда не ходит :)
Про msp430 погуглил. В принципе интересный вариант. Но я пока чайник даже в ардуино. Боюсь, что этот вариант будет пока сложноват для меня.
А зачем считать импульсы со счетчиков? Счетчики и так сами все считают и хранят результат. То есть достаточно считать (от слова считывать) готовые данные в любое удобное для нас время. Можно и на ардуину (их кстати много всяких). Какой там в счетчиках интерфейс?