Помогите с датчиком напряжения ZMPT101B!
- Войдите на сайт для отправки комментариев
Сб, 10/02/2018 - 21:10
Больше месяца вожусь с этим датчиком (ZMPT101B) не могу понять код. Сколько раз не переделал показывает совсем не те значения, которые надо. Подскажите может кто-то сталкивался.
Поделитесь пожалуйста опытом и скетчем.
покажите код который вы месяц понять не можете.
1. Зачем вы используете какую-то библиотеку? Получение данных с этого датчика - две строки кода.
2. У вас дачтчик подключен к пину 2? - почему именно к нему? Вообще, по описанию - датчик выдает аналоговый сигнал и должен подключаться к аналоговым входам А0 - А7
Он подключён к А0, 2 пин это диод
Спасибо за код, сегодня попробую
Он подключён к А0, 2 пин это диод
Какой диод? И где в вашем скетча указано, что датчик подключен к А0 ? Как библиотека узнает, на каком пине датчик?
Так, как это сейчас у вас прописано в строке 15 скетча - библиотека будет читать сигнал с пина А2.
Вы вообще понимаете этот код или вы его просто скопировали в инете и даже не настраивали под ваше подключение?
Я понимаю что так нужно?
Я указывал A0 просто это я взял стандартый который у меня был и без настроек моих, я только менял 2 pin на А0
Или мне эти переменные нужно по другому объявить?
https://forum.arduino.cc/index.php?topic=511707.0
Из топика следует, что на выходе блока переменное напряжение, смещённое так, что бы можно было измерять ардуиной. Одно значение брать бесполезно. Получите случайное значение. Надо считывать 20 мс потом обробатывать.
Дайте пожалуйста нормальный рабочий скетч, чтоб он работа и только показывал напряжение.
https://www.youtube.com/watch?v=97kkHynR72Q
Я смотрел это видео не один десяток раз, скетч я этот пробовал ОН НЕ РАБОТАЕТ!
орать не надо.
сними видео и покажи что именно не работает или работает не так.
Мне хотелось бы просто скетч который снимает показания с пина, без библиотек, мне человек дал строки которые будут снимать статистику, но там не объявлены переменные, и у меня вопрос как их правильно объявить.
МОЖЕТ кто-то сталкивался с этим датчиком, у кого-то может отстался код, пожалуйста, покажите!
Мне человек дал эти строки, да понятные, но как правильно объявить эти переменные.
Очевидно, переменные должны быть объявлены как float.
Очевидно, переменные должны быть объявлены как float.
С чего бы это? Особенно первая, которая читает из analogRead? :)
Мне человек дал эти строки, да понятные, но как правильно объявить эти переменные.
слушайте, ну нельзя же быть настолько неучем, чтобы за 3 дня не разобраться, как обьявить две переменные?
Вот:
слушайте, ну нельзя же быть настолько неучем, чтобы за 3 дня не разобраться, как обьявить две переменные?
А зачем? Пивас подолбить приятней, чем всю эту муру учить. Код же вы напишете.
Очевидно, переменные должны быть объявлены как float.
С чего бы это? Особенно первая, которая читает из analogRead? :)
Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0. Значит, целые (а вместе с ним и булевы) - отпадают. Из плавающей точки double не имеет на AVR полноценной поддержки (не говоря о long double), так что остается единственный вариант - float.
Из плавающей точки double не имеет на AVR полноценной поддержки (не говоря о long double), так что остается единственный вариант - float.
Э.... а float имеет полноценную поддержку, получается?
И как теперь быть с этим: Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.
Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0.
adriano, вы что-то покурили, видимо.
Если делить не на 1024, а на 1024.0 - то на выходе получается не 0, а вполне вменяемое число :)
Э.... а float имеет полноценную поддержку, получается?
Да.
И как теперь быть с этим: Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.
Именно этот факт я и назвал отсутствием полноценной поддержки double.
Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0.
adriano, вы что-то покурили, видимо.
Если делить не на 1024, а на 1024.0 - то на выходе получается не 0, а вполне вменяемое число :)
Перечитайте сообщение 16: нужна не правка указанных двух строк, а дополнение описанием переменных так, чтобы при существующем коде работало.
Вы же вместо этого предлагаете внести правку в код. Т.е. решаете совсем другую задачу.
Никто не подвергает сомнению тот факт, что внесение правки в одном месте прогшраммы может потребовать правки и в каком-то другом.
Перечитайте сообщение 16: нужна не правка указанных двух строк, а дополнение описанием переменных так, чтобы при существующем коде работало.
Вы же вместо этого предлагаете внести правку в код. Т.е. решаете совсем другую задачу.
Да, согласен. Вы абсолютно правы.
Я попробовал целый этот код, не робит(((
я использую Лабораторный автотрансформатор и ставлю на 50v
Так скажите, правильно выражено?
читать до посинения пост #10, если просветления не наступит, вернуться к ипользованию библиотеки EmonLib.
описалово на родном https://voltiq.ru/shop/zmpt101b-voltage-transformer/
Ну с библиотекой у меня тоже не работало
Забей, лучше выпей пиваса.
Как с датчиком разберусь, можно будет)))
Не, лучше щас выпей, не мучай себя - месяц маяться такой хернёй - это никаких нервов не хватит. Тут тебе не помогут, тут все злые и безграмотные. Лучше выпей пиваса.
Я тоже за пивас, коль возможности нет померять прибором что у него из VOUT лезет.
Ну зачем же так. К пиву можно после того как быстренько в цикле просуммировать раз 60 а потом на 60 поделить и будет счастье обладанием результата. Иначе ни как. Одно чтение - случайная величина от синусоиды. В идеале надо читать и суммировать 20 или 40 миллисекунд.
Ну если не сложно покажите код весь, а то я уже зодолбался с этим датчиком
Привет!! Тоже маясь с этим датчиком, вот только у меня работает самый первый скетч, который ты прикладывал. может проблема со скоростью? значения смотришь в терминале, там скорость совпадает со скоростью из скетча? Или у тебя просто значения не те? какая проблема то?? Ребята, кто шарит в программировании - подскажите пожалуйста, что означает phase_shift из его первого скетча??? пытаюсь разобраться в этом. и еще не понятно -- float Vrms = (emon1.Vrms - 3); при чем здесь 3 - ума не приложу...
и возможно, здесь есть те, кто работал с этим датчиком - подскажите, пожалуйста с какой логикой крутится подстрочечный резистор на плате, а то пока я тупо лью скетч с калибровкой, которую советуют на ютубе, а потом, снимая значение напряжения и зная правильное - подгоняю резистором чтоб показывало верно
И так смотри, я разобрался с этим!
На вот этих двух контактах которые обведены на картинке, подстрой это крутилкой, чтобы сопросивление было 48,8кОм (ну это у меня так)
И коллибровку вместо 109, я поставил 660.
А "2" это пин к которому подключен датчик, НО, этот пин аналоговый, и тут не пишеться А2 а просто 2
Так что попробуй так сделать
Я собрал так 2 датчика таких, для станции, и нормально работают.
Но я дома настроил на двух, у меня латер стоит и 220, я отстроил, все как часики, без проблем.
Потом поехали на место устоновки, и там пришлось курутить чтоб подогнать под то напряжение, что в сети.
И вот прям щас собирал вторую такую устоновку. Сначала подключил тоже 2 датчика. Даже на них не подано 220, но оно мне на выходе сыпало высокие значения, и эти значения понижась.
Потом я взял ещё датчик, подлючил и все нормально работало. Как оказалось если наживать на чип (на тех не правильно работающи) показания начали какие-то хоть показываться, попробовал пропоять. Не помогло. Короче эти 2 дачтика бракованые.
На счёт 3, тут скорей всего её не трогай, пусть оно так и будет.
И на счёт phase_shift, я смотрел, это значение не изменяемо, но я так и не понял для чего оно
Ребята, привет. Тоже планирую использовать этот датчик в приборе простого мониторинга трехфазных установок. Нашёл инфо по нему, на выходе он имеет нормализованную синусоиду с постоянной составляющей (VCC/2), т. е. оба полупериода смещены в положительный квадрант, в диапазон от 0 до VCC. Подстроечником изменяется амплитуда синусоиды. Таким образом, изначально грубо можно подсчитать поправочный коэффициент (Uвх / Uвых). А дальше уже калибровать, изменяя коэфф. Подстроечник стоит дешевый, термостабилизации, судя по доступным снимкам девайса, нет. Соответственно, корректно он будет работать только в "тепличных условиях". В данный момент пока что жду посылку из шанхая :)
кста... датчик здорово просел в цене. Нашёл на али, поиском по названию, ценник 82 руб.
Как получу, потестирую, отпишусь
По поводу параметра fase_shift 1,7. Предполагаю, это как раз в случае применения трех датчиков на трех фазах. Каждый датчик должен иметь свой сдвиг. Было бы достаточно знаний, покопал бы либу Emoblib, вдруг там есть ещё и функция определения правильности чередования. Это же специально для энергомониторинга затачивалось.
Привет, друг. Я не только изучал библеотеку, но и кучу сайтов и форумов, посвященных этой теме. Твоя догадка имеет место быть, но на мой взгляд она не верна. Прочти и попытайся вникнуть в эту информацию
http://robotclass.ru/articles/low-pass-filter/#comment-37865
https://learn.openenergymonitor.org/electricity-monitoring/ctac/explanation-of-the-phase-correction-algorithm?redirected=true
в первой ссылке обрати внимание на то, что при использовании программного низкочастотного фильтра (фильтрация помех), аналогичного тому, что реализован и в библеотеке, фильтрованный сигнал отстает по фазе от действительного, читай вторую ссылку, из нее понятно, что эта процедура phaseShiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV) служит для компенсации данного сдвига. Прочти, пожалуйста, возможно тебе удастся разобраться во всех тонкостях, я например пока так и не понял, как же в моем конкретном случае подобрать коээффициент сдвига фазы. Это описано в конце второй ссылки, но осмыслить это мне пока не удалось, может ты поймешь и внесешь ясность.
Чем конкретно ты занимаешься? Ты собираешься контролировать трехфазное напряжение 380В? в таком случае просто датчик не подойдет, он рассчитан всего на 250В, а при уменьшении напряжения дает неслабую погрешность в измерении. Это связано с переменным резистором. Давай вместе думать, как можно избавиться от переменного резистора, собрав свой собственный датчик, включающий в себя трансформатор с zmpt (на али можно купить транс отдельно) Я нашел информацию об этом (она содержится в даташите на датчик, кроме того я беседовал с одним очень умным иностранцем, который так же поделился со мной информацией по этой теме) Если нужно - я с радостью поделюсь ей с тобой. Можешь подсказать - какой скетч ты будешь использовать?? потому что я пока что так и не понял, почему и зачем в скетче, который я использовал вычитается эта тройка... float Vrms = (emon1.Vrms - 3);
Я очень долго и трепетно изучал библеотеку, попытался нарисовать блок схему ее действия. В итоге решил что хватит морочить голову этим низкочастотным фильтром, я вроде нашел про него достаточно информации(я тебе рассказал ее) Передо мной стоит цель - разобраться досконально в этом вопросе, чтобы максимально увеличить точность показаний датчика, а для этого нужно было и следует еще перерыть тонну информации, но это очень увлекательно и интересно, давай заниматься этим вместе и помогать друг другу, я очень рад что спуся 8 месяцев появился еще один исследователь))
Ознакомься так же с этой информацией https://hackingmajenkoblog.wordpress.com/2016/02/01/making-accurate-adc-readings-on-the-arduino/
Здесь один из самых эффективных способов повысить точность. Речь об стабилизации опорного напряжения. Однако нечто подобное вроде как есть и в библеотеке, так что пока я не понял - реализовано это в ней или нет.
почитай эту серьезную статью о датчике http://www.arpnjournals.org/jeas/research_papers/rp_2017/jeas_0217_5728.pdf
Там говорится о двух путях получения значения напряжения(два варианта написания скетча) Но из этого файла я мало что понял, особенно об этих ваших ПОЛИНОМАХ. Пытался писать скетч по аналогии с приведенным, но не получилось почему то нифига. Там скетчи приведены не полные я так понял, переменные не обозначены.
У меня есть идея научиться работать в программе MATLAB и попытаться смоделировать ардуино и датчик для измерения напруги. Только тут вообще делов очень дофига, но интересно. Вот - почитай https://cyberleninka.ru/article/v/ustroystvo-kontrolya-peremennyh-trehfaznoy-seti-na-baze-mikroprotsessornogo-komplekta-arduino
Это помогло бы спроектировать точное и дешевое устройство, которое можно внедрять в производство или использовать на подстанциях или еще как то. Вообще я занялся этим для того чтобы попытаться решить проблему, возникающую при обрыве одной из фаз линии передач 0.4 кВ при обрыве одного из проводов при некоторых условиях или при большой удаленности действующая защита(предохранители) может не справиться, есть случаи со смертельным исходом.
Но в этом устройстве не должно быть всяких ваших переменных резисторов, от него нужно избавиться!!! и оно должно быть максимально точным и быстрым
Кстати еще кое чем могу поделиться, если интересно - это схема датчика. Я слаб в схемотехнике к сожалению( но схема верная 100 проц - проверяд сопротивления резисторов и сошлось) может она пригодится тебе. Если я буду пытаться моделировать zmpt101b в MATLAB - мне она точно очень пригодится. Я пока ведь не знаю даже толком - каким образом этот элемент влияет на показания датчика(
Здравствуй, друже. Рад, что тема жива и люди заинтересованы.
Благодарю за ссылки, ознакомился со статьями, пока что кроме применения полиномов, тут мне, вероятно, не хватит багажа знаний ;)
По поводу калибровки сдвига фаз - тоже не совсем понял, есть ли способ это сделать кроме чисто эмпирического. Один нюанс уловил. Если PHASECAL задать 1,28, то компенсируется сдвиг, связанный с разным временем просчета результатов сэмплирования для напряжения и тока. То есть, я так понимаю, если на выходе важно сохранить коэффициент мощности (уже соответствующий некоторому сдвигу фаз) и исходный сдвиг, присущий объекту измерений.
Цель моего проекта - сбор статистики потребляемой мощности на различных установках потребителей, с логированием в текстовый файл на сд-карте с дальнейшей ручной обработкой, скорее всего, в экселе. С выведением графиков, выявлением пиков и спадов потребления и их продолжительности. Это нужно для правильного подбора резервных источников питания, как то ИБП и дизельген. установок. Промышленные приборы для этого есть, но в данный момент недоступны по ценнику.
Включать датчики я планирую в фазное напряжение, звездой,это как раз те самые <250 В. Скетч буду писать на основе примера volage_and_current из либы EmonLib. Останется допилить для трёх фаз, привязать выборки к часам реального времени, суммировать мощности и параллельно записи на карту, выводить на lcd дисплей. С украшательствами и плюхами :)
Точность мне требуется едва ли выше "оценочной", стремиться к коммерческим 0,5% или прецизионке - лишнее. Наверняка для этого придется проектировать не на любительском, как у меня, уровне, на основе не столь поделочных, как zmpt, модулей. А то и с нуля.
По теме аналоговых измерений ардуиной в принципе, посоветую вот эту статейку. Автор провел хорошую работу, а не просто перевёл буржуинскую статью. http://robotosha.ru/arduino/analog-measurements-arduino.html
Можешь вкратце пояснить, почему тебе нужна высокая точность прибора для контроля обрыва фазы по НН? И на чём, кроме электродвигателя, это может фатально отразиться? Другое дело - обрыв нуля, там последствия могут иметь взрывной характер, даже в быту. По-моему, с этим вполне может справляться реле напряжения. Если не устроит РНПП, можно нарыть что-нибудь более скорострельное
Вот вы ребята заморочились-то...
Казалось бы. что сложного - сигнал на выходе датчика - синусоида с частотой питающей сети, сдвинутая вверх на 512 единиц. Из этого очевидный вывод - что брать мгновенные значения с датчика бессмысленно, получишь случайную величину. Усреднять тоже - получишь ноль (среднее значение синуса за период = ноль).
Чтобы получить с датчика уровень напряжения в сети, нужно либо взять среднеквадратичное значение (первый вариант кода из "умной статьи"), либо тупо просканировать максимумы и минимумы(второй вариант из той же статьи). Я бы еще добавил третий - можно проинтегрировать синусоиду. В любом случае собирать эти данные надо не менее 5-10 периодов, иначе о любой точности можно забыть - так что датчик, прямо скажем, не быстрый, одно измерение не должно быть быстрее 0.1-0.3 сек для 50 Гц
Собственно, это вся та премудрость, что изложена в статье. Вся математика с кучей полиномов - не более чем инструмент для более-менее точной калибровки переменного резистора. Если не понимаете - можете не заморачиваться. особо ничего не потеряете. Все эти зубодробительные уравнения можно за пару минут вывести в обычном Экселе. Причем, если посмотреть таблицы - видно что с усложнением уравнения точность растет несущественно, если вас устраивает ошибка в 2-3% - можете остановится на линейной зависиимости, все равно точнее 1-1.5% получить не выйдет.
Основные проблемы ардуинщиков с этим датчиком связаны с тем, что его нельзя использовать по принципу - "купил, включил и работает". Чтобы получить с него более-менее реальные значения, его нужно сначала откалибровать на разных напряжениях, а потом построить в любой мат-программке, типа Экселя - уравнение регрессии для поправочного коэффициента.
Ну и чисто практически - ардуино-коды из статьи вполне рабочие, не хватает только описания переменных, но они очевидны. А вот коэффициенты уравнения из статьи (и из обзоров на Ютубе) смысла переписывать нет - они В КАЖДОМ ДАТЧИКЕ будут свои. Из чего следует, что процедуру калибровки надо для каждого девайса делать заново.
Добавлю еще насчет переменного резистора. Если смущает его стабильность, а особенно вероятность, что кто-то случайно начнет крутить движок (в этом случае всю калибровку придется делать заново)- можно посоветовать подобрать переменником более-менее подходящее значение для своего диапазона напряжений, а потом выпаять его и заменить на постоянное сопростивление того же номинала.
Повышение точности не нужно мне для выявления обрывая нуля или фазы, я изучаю это в рамках научной работы в вузе. Обрыв фазы может фатально отразиться на организме человека, который может прямо или косвенно прикоснуться к нему. Спасибо за статью) Реле напряжения - это устройство, которое ставят в домовых щитах для защиты от перенапряжений, вызванных в том числе и обрывом нуля. Эти устройства служат достойно и стоят не малых денежек (не слышал, чтобы подобные устройства устанавливали на низковольтных ТП или линиях передач). Можно сказать, что я должен сделать свое реле напряжения, работающее на ардуино, только при этом должен разобраться как повысить точность и скорость работы до максимума, а зачем - это уже вопрос другой(второстепенный). Первостепенно - это процесс познания так сказать