Как стать автором
Обновить

Комментарии 36

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

Или поставить ионисторы в цепь питания и писать блоками покрупнее - хоть раз в полчаса, на сколько памяти хватит, предусмотрев экстренный сброс данных на флешку при отключении питания.

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

P.S. Код нашёл :-D Пишет дату/время и данные в файл .txt (FAT16)

Обычная сдыхает очень быстро при "ежесекундной" записи.

На деле там запись идет примерно раз в 5 с. Неужели такое может быстро повредить SD-карты, учитывая, что каждый раз запись дополняется, а не производится поверх предыдущих данных?

Возможно, зависит от способа записи. У меня файл открывается каждый раз, и закрывается.

Мне не понятен смысл данной статьи. Я проффесионально занимаюсь разаботкой подобных устройств( и софтом и железом). Тут речь об уровне школьной поделки, а не о проффесиональном подходе. В принципе подобное соберет и пятикалсник из кружка робототехники. А людям наверно было бы интерестно как решать такие задачи с проффесианальным, а не с дилетанским подходом. Если решать такую задачу проффесионально то стоит использовать совсем другие подходы.

Я бы взял за основу esp32 , в нем много оперативки, встроенного флеша, wi-fi и блютус. Внешний ADC избыточен, есть свой 12ти разрядный. Собранные данные можно будет сразу просматревать на смартфоне или отправлять на сервер. Можно строить графики и таблицы непосредственно на вебинтерфейсе чипа. Так же избыточна флешка, встроенной в чип памяти хватит для хранения миллионов измерений. Так же нет смысла в трансформаторном питании, можно использовать любой импульсный ас-dc модуль. Не стоит использовать arduino IDE, он сильно снижает ваши возможности разработки. А вот arduino sdk использовать можно. Так же даже такой простейший проект требует использования freeRtos. Так же код стои разделять на юниты и использовать классы. Это сильно олегчает программирование. Так же в схематехнике стоит уделить внимание аналоговой части, сильных шумов и смещений если все правильно сделано не должно быть, а слабые шумы гасятся за счет интегрирования.

В целом идея интерестная, но при проффесиональном подходе устройство получится очень компактным, с меньшем колличеством деталей и гораздо более функциональным.

Если речь о функциональном концепте ( то что сделал автор) то работы на несколько вечеров. Если делать полностью готовое решение которое можно массово штамповать в Китае, то такая разработка делается за 2-3 месяца...

"Внешний ADC избыточен, есть свой 12ти разрядный"
Насколько я знаю, встроенный АЦП в ESP32 довольно убогий. Там есть зоны нечувствительности и нелинейности. Калибровки - та еще морока.
https://w4krl.com/esp32-analog-to-digital-conversion-accuracy/

"Так же избыточна флешка"
С SD-карты зато удобно данные забирать на ПК.
"Можно строить графики и таблицы непосредственно на вебинтерфейсе чипа"
Но функциональность будет ограничена прошивкой, текстовые данные можно обработать как угодно в каком угодно софте.

Да. Ацп убогий, но для задачи измерить 220в с точностью до 0.5 а может и 0.1в с небольшой скоростью пойдет.

Тот же текстовый или в любом другом формате лог можно скачивать через тот же вебинтерфейс.

 Тут речь об уровне школьной поделки, а не о проффесиональном подходе. 

В целом, так и есть, поэтому первым хабом идет "Электроника для начинающих".

 В принципе подобное соберет и пятикалсник из кружка робототехники. 

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

Я бы взял за основу esp32 , в нем много оперативки, встроенного флеша, wi-fi и блютус. 

Может и так, но arduino я знаю гораздо лучше чем esp32.

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

Не подскажите, что по существу я сделал не так? LC-фильтр я поставил, конденсаторы разных типов использовал, длину проводов где смог уменьшил. Мне правда интересно, как можно устройство улучшить.

В целом идея интерестная, но при проффесиональном подходе устройство получится очень компактным, с меньшем колличеством деталей и гораздо более функциональным.

Безусловно. я не могу тягаться с командой профессионалов, я сделал устройство на базе того, что знал и на базе того, что лежало в моей радиолюбительской "сокровищнице". Вы же не думаете, что я предлагаю кому-то сейчас на полном серьезе ставить в промышленное устройство, например, конденсаторы К50-24? Сделал я это устройство, когда посмотрел на ценник вольтамперфазометров и понял, что для моих целей подобный аппарат явно избыточен.

Так esp32 это то же arduino. Вообще вы путаете понятия. Есть arduino IDE, очень убогая штука, крайне не рекомендую. Есть платы arduino, это по сути девкиты различных чипов, есть atmega ( то что вы видимо называете arduino), есть esp32, есть stm итд. Есть arduino sdk, у нее замечательное ядро, его с некоторыми натяжками можно использовать для проф. решений. Это sdk является оберткой над sdk чипа и дает возможность работать с разными чипами используя один и тот же код. Те при использовании arduino sdk для вас переход с atmega на esp или stm будет практически не заметен, код останется почти таким же. И есть arduino библиотеки, их много, но все они в основном деманстрационные, призваны только продемонстрировать подход для реализации чего ни будь. Но эти библиотеки можно "допиливать" и на их основе писать проффесиональные решения, это сильно быстрее чем писать с нуля.

Откуда у вас шумы можно только предпологать, но мне кажется что скорей всего проблема с землей. У вас я так понимаю нет гальванической развязки между 220в и контроллером. Скорей всего есть какие то разности потенциалов земли входа и контроллера, отсюда перекос. Для начала замкните вход на землю и посмотрите что считывает АЦП, должен быть 0 или почти 0. Так же стоит помотреть высокочастотные помехи по земле, это делается осциллографом. Так же на входе АЦП должны быть вч фильтры ( несколько паралельных керамических конденсатров разной емкости - 1мф, 0.1мф, 100нф, 100пф итд) часто это сильно помагает. А вот индуктивность может наоборот вносить помехи "разгоняя" ВЧ составляющую. Так же наблюдал, например, такую картину- если на какой либо ноге МК даже через резистор подано напряжение выше напряжения питания это тут же сбивает все АЦП в чипе.

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

И в цепи питания и в измерительной цепи стоят трансформаторы. Я всегда думал, что гальваническая развязка это отсутствие связи между цепями непосредственного электрического контакта. Или я не прав?

Скорей всего есть какие то разности потенциалов земли входа и контроллера, отсюда перекос. 

Что вы понимаете под "землей входа"?

Так же на входе АЦП должны быть вч фильтры ( несколько паралельных керамических конденсатров разной емкости - 1мф, 0.1мф, 100нф, 100пф итд) часто это сильно помагает.

Так я вроде ты так и сделал, или вы имеете ввиду, что надо вдоль всей сигнальной линии разместить большее количество керамических конденсаторов? Пленочные не подходят?

Так же наблюдал, например, такую картину- если на какой либо ноге МК даже через резистор подано напряжение выше напряжения питания это тут же сбивает все АЦП в чипе.

Ну если выйти за допустимые пределы, то конечно всякое может случиться, если например на вход стабилизатора питания MassDuino UNO подать 6 В (для нормальной работы надо больше 7 В), то плата будет работать, но АЦП будет сильно завышать свои показания. Но у меня же не просто резистор, а делитель напряжения, с которого в норме снимается напряжение примерно 2 В, т. е. почти середина диапазона АЦП.

Посмотрел схему. До этого как то пропустил ее. Гальваническая развязка есть. Мое мнение: вторая цепь измерения вообще не нужна. Дроссель L1 надо выкинуть, он у вас ни чего не фильтрует, не понятно зачем он, если хотите что бы он что то фильтровал конденсатор нужен и перед ним. Делитель подключить непосредственно к + С1, и за делителем на входе A0 несколько конденсаторов разной емкости, как писал. Единственно возможно стоить уменьшить емкость с1,с2 помоему она избыточна и будет сглаживать измерения. После этого не вижу причин почему не будет мерить точно.

Дроссель L1 надо выкинуть, он у вас ни чего не фильтрует, не понятно зачем он, если хотите что бы он что то фильтровал конденсатор нужен и перед ним

А разве дроссель L1 не сглаживает переходные процессы в момент подачи питания?

Единственно возможно стоить уменьшить емкость с1,с2 помоему она избыточна и будет сглаживать измерения. 

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

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

С работой от конденсаторов при перебоях крайне спорное решение. На долго их все равно не хватит. Зато крайне вероятен сценарий когда при исчезновении сети напряжение опустится например до 3в, и в это время сеть появится. Это приведет к зависанию МК, и он уже не заработает хотя питание есть. Если все таки хотите пойти по такому пути то вторая обмотка все равно не нужна. Разделите емкости диодами, и все.

А разве дроссель L1 не сглаживает переходные процессы в момент подачи питания?

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

RTC в такой проект так и просится - данные времени полезны, когда пишутся долговременные логи. Можно уникальные названия файлам давать.

Насколько я понял, функция Volt() вызывается из прерывания. Обычно в разработке софта для MCU из прерываний большие функции стараются не вызывать.

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

По прерыванию обычно флаг ставят, сигнализирующий основной программе, то что прерывание произошло.
"За пределами прерывания почти ни какого кода и нет"
В Arduino, если не ошибаюсь, есть скрытые от пользователя прерывания - UART и TIM0.
Пока программа выполняет длительное прерывание, остальные прерывания не будут обрабатываться.

По прерыванию обычно флаг ставят, сигнализирующий основной программе, то что прерывание произошло.

Не первый раз уже слышу о таком подходе. В чем суть таких манипуляций? Ведь тогда теряется весь смысл использования прерывания - отреагировать на событие сразу же как оно произошло. А тут еще надо заводить отдельный флаг, расходовать на него память. А в итоге программа отреагирует на событие только потом, где то в основном цикле, когда доберется до опроса этого флага. И далее, если все равно опрашивается флаг, то зачем заводить для этого новый, отдельный флаг, почему бы тогда не опрашивать уже существующий аппаратный флаг, а прерывание и вовсе выключить? Предвижу ответ - так вы пытаетесь бороться с приоритетами и коллизиями прерываний. Но ведь у современных ядер есть весьма гибкие настройки приоритетов и всего остального, почему бы не воспользоваться ими? Да и у старых ядер, где всего этого не было, тоже не припомню особых проблем.

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

Ну, наверное, не остальные [ВСЕ], а только конкретно того, обработка которого идет в настоящий момент.

У вас в MassDuino UNO архитектура - AVR.
Обратимся к документации производителя - https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/interrupts/
"When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled."

В Arduino, насколько я знаю, прерывание TIM0 используется для подсчета времени в системны функциях. Так что длительное выполнение других прерываний нарушит счет времени.

В принципе, просто флаг ставить - действительно, мало пользы, вместо этого можно анализировать состояние регистров в loop(). Более правильное решение, когда требуется серьезное быстродействие - запуск другого аппаратного модуля, например, запуск АЦП из прерывания таймера. В итоге может выйти целая цепочка из прерываний, и только в одном из них, при выполнении каких-то нескольких условий, будет выставляться флаг в ОЗУ.

Вы совершенно верно привели цитату. Но, вот буквально в следующем предложении там пишут что:

The user software can write logic one to the I-bit to enable nested inter-
rupts. All enabled interrupts can then interrupt the current interrupt routine. The I-bit is
automatically set when a Return from Interrupt instruction – RETI – is executed.

То есть, если сильно надо, то пользователь может не дожидаться окончания обработки текущего прерывания и вручную (первой же командой, например) разрешить глобальные прерывания. И счет времени нарушен не будет.

Но вы же у себя этого не делаете?

Тем, кто предпочитает готовые устройства, подойдут регистраторы MI1AC, например.

Как я понял данный прибор может отправлять данные по RS-485, а сам вести лог он может? Но спасибо за наводку у этого прибора ценник хотя бы не шестизначный.

Может, в этом и есть цель и смысл существования регистраторов. Конкретно этот, как понял из РЭ, пишет на микроСД и скидывает на усбфлешку.

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

А чем не угодил PZEM-004t с подключением к обычной Ардуино/esp?

Тем, что я про него не знал, спасибо за информацию.

ну вообще все делается гораздо компактней. есть очень полезная статья https://easyelectronics.ru/zamer-setevogo-napryazheniya.html лично я опробовал связку esp8266 как хост и arduino nano в роли i2c датчика измеряющего rms через трансформатор ZMPT. отлично работает. ну а питается все от модуля HILINK. показания в умный дом esp8266 отдает через mqtt.

А зачем пихать два мк, если 8266 отлично справится и самостоятельно?

а если 3 фазы мониторить? семплировать синус в реалтайме. а вообще у меня модульная конструкция в стандартных корпусах на din рейку. вот тут в моей статье https://habr.com/ru/articles/422435/ есть фото "ранних" прототипов/

Да, если три фазы - то у 8266 банально не хватит аналоговых входов. Можно, наверное, поизвращаться и как-то три zmpt на один вход коммутировать, но...

А за ссылку статью спасибо, интересно

Статья интересная, в итоге пришли к самому простому решению ;)

А еще можно к снятию напряжения добавить датчик тока (индуктивный или на эффекте Холла) и мониторить вообще все параметры электросети. Благо производительности контроллеров за глаза хватит. Если надо пафоса и премию - можно туда и нейросеть прикрутить, пусть смотрит на форму синуса и косинус фи ;)

проще счетчик купить и интерфейс подключения к нему.

а так есть у меня такой прибор LPW-305 (https://www.chipdip.ru/product/lpw-305-6?ysclid=m2udg8rugz799172915) в разработке которого я участие принимал... сейчас сняли его с производства. а так валяется в столе и лень его подключать. хотя штука прикольная.

Второй трансформатор не нужен и дроссели можно смело выкинуть

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации