Помогите с датчиком напряжения ZMPT101B!

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Больше месяца вожусь с этим датчиком (ZMPT101B) не могу понять код. Сколько раз не переделал показывает совсем не те значения, которые надо. Подскажите может кто-то сталкивался.

Поделитесь пожалуйста опытом и скетчем.

vvadim
Offline
Зарегистрирован: 23.05.2012

покажите код который вы месяц понять не можете.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h"             // Include Emon Library
EnergyMonitor emon1;             // Create an instance

int i = 0;
float tenvals = 0.0;
float minval = 1000;
float maxval = 0.0;

void setup()
{  
  Serial.begin(115200);
  
  emon1.voltage(2, 109, 1.7);  // Voltage: input pin, calibration, phase_shift
//  emon1.current(1, 111.1);       // Current: input pin, calibration.
}

void loop()
{
  emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
//  emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
  
//  float realPower       = emon1.realPower;        //extract Real Power into variable
//  float apparentPower   = emon1.apparentPower;    //extract Apparent Power into variable
//  float powerFActor     = emon1.powerFactor;      //extract Power Factor into Variable
//  float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable
//  float Irms            = emon1.Irms;             //extract Irms into Variable

 float Vrms = (emon1.Vrms - 3);
 if (Vrms < 0) { Vrms = 0.0; }
 
 tenvals += Vrms;
 if (minval > Vrms) { minval = Vrms; }
 if (maxval < Vrms) { maxval = Vrms; }
 
 i++;

 if (i == 10)
 {
  Serial.print("Avg: ");
  Serial.print(tenvals/10);
  Serial.print(" (");
  Serial.print(Vrms);
  Serial.print(") Min: ");
  Serial.print(minval);
  Serial.print(" Max: ");
  Serial.println(maxval);

  i = 0;
  tenvals = 0.0;
  minval = 1000.0;
  maxval = 0.0;
 }
  delay(100);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

1. Зачем вы используете какую-то библиотеку? Получение данных с этого датчика - две строки кода.

sensor_Value = analogRead (A0);     // read the analog in value:
 v_Out = 250 * (sensor_Value / 1024);

 

2. У вас дачтчик подключен к пину 2? - почему именно к нему? Вообще, по описанию - датчик выдает аналоговый сигнал и должен подключаться к аналоговым входам А0 - А7

 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Он подключён к А0, 2 пин это диод

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Спасибо за код, сегодня попробую

b707
Offline
Зарегистрирован: 26.05.2017

Nekut_Nekut пишет:

Он подключён к А0, 2 пин это диод

Какой диод? И где в вашем скетча указано, что датчик подключен к А0 ? Как библиотека узнает, на каком пине датчик?

Так, как это сейчас у вас прописано в строке 15 скетча  - библиотека будет читать сигнал с пина А2.

Вы вообще понимаете этот код или вы его просто скопировали в инете и даже не настраивали под ваше подключение?

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018
int sensor_Value = 00;
int v_Out = 00;
void setup()
{
  Serial.begin(9600);              //  setup serial
}

void loop()
{
sensor_Value = analogRead (A0);     // read the analog in value:
v_Out = 250 * (sensor_Value / 1024);
Serial.println(v_Out);
delay(1000);
}

Я понимаю что так нужно?

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Я указывал A0 просто это я взял стандартый который у меня был и без настроек моих, я только менял 2 pin на А0

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Или мне эти переменные нужно по другому объявить?

nik182
Offline
Зарегистрирован: 04.05.2015

https://forum.arduino.cc/index.php?topic=511707.0

Из топика следует, что на выходе блока переменное напряжение, смещённое так, что бы можно было измерять ардуиной. Одно значение брать бесполезно. Получите случайное значение. Надо считывать 20 мс потом обробатывать. 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

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

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

Я смотрел это видео не один десяток раз, скетч я этот пробовал ОН НЕ РАБОТАЕТ!

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

орать не надо.

сними видео и покажи что именно не работает или работает не так.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

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

МОЖЕТ кто-то сталкивался с этим датчиком, у кого-то может отстался код, пожалуйста, покажите!

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018
sensor_Value = analogRead (A0);     // read the analog in value:
 v_Out = 250 * (sensor_Value / 1024);

Мне человек дал эти строки, да понятные, но как правильно объявить эти переменные.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Очевидно, переменные должны быть объявлены как float.

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

Очевидно, переменные должны быть объявлены как float.

С чего бы это? Особенно первая, которая читает из analogRead? :)

b707
Offline
Зарегистрирован: 26.05.2017

Nekut_Nekut пишет:

sensor_Value = analogRead (A0);     // read the analog in value:
 v_Out = 250 * (sensor_Value / 1024);

Мне человек дал эти строки, да понятные, но как правильно объявить эти переменные.

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

Вот:

int sensor_Value ;
float  v_Out ;
void setup()
{
  Serial.begin(9600);              //  setup serial
}

void loop()
{
sensor_Value = analogRead (A0);     // read the analog in value:
v_Out = 250 * (sensor_Value / 1024.0);
Serial.println(v_Out);
delay(1000);
}

 

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

b707 пишет:

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

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

andriano пишет:

Очевидно, переменные должны быть объявлены как float.

С чего бы это? Особенно первая, которая читает из analogRead? :)

Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0. Значит, целые (а вместе с ним и булевы) - отпадают. Из плавающей точки double не имеет на AVR полноценной поддержки (не говоря о long double), так что остается единственный вариант - float.

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

andriano пишет:

Из плавающей точки 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.

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0.

adriano, вы что-то покурили, видимо.

Если делить не на 1024, а на 1024.0 - то на выходе получается не 0, а вполне вменяемое число :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Э.... а 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.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

andriano пишет:

Потому, что потом она делится на 1024. Учитывая, что максимальное значение с analogRead() равно 1023, очевидно, что для любого целого типа результат будет равен 0.

adriano, вы что-то покурили, видимо.

Если делить не на 1024, а на 1024.0 - то на выходе получается не 0, а вполне вменяемое число :)

Перечитайте сообщение 16: нужна не правка указанных двух строк, а дополнение описанием переменных так, чтобы при существующем коде работало.

Вы же вместо этого предлагаете внести правку в код. Т.е. решаете совсем другую задачу.

Никто не подвергает сомнению тот факт, что внесение правки в одном месте прогшраммы может потребовать правки и в каком-то другом.

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

Перечитайте сообщение 16: нужна не правка указанных двух строк, а дополнение описанием переменных так, чтобы при существующем коде работало.

Вы же вместо этого предлагаете внести правку в код. Т.е. решаете совсем другую задачу.

 

Да, согласен. Вы абсолютно правы.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018
int sensor_Value ;
float  v_Out ;
void setup()
{
  Serial.begin(9600);              //  setup serial
}

void loop()
{
sensor_Value = analogRead (A0);     // read the analog in value:
v_Out = 250 * (sensor_Value / 1024.0);
Serial.println(v_Out);
delay(1000);
}

Я попробовал целый этот код, не робит(((

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

я использую Лабораторный автотрансформатор и ставлю на 50v

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018
int sensor_Value ;
float  v_Out ;

Так скажите, правильно выражено? 

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

читать до посинения пост #10, если просветления не наступит, вернуться к ипользованию библиотеки EmonLib.

описалово на родном https://voltiq.ru/shop/zmpt101b-voltage-transformer/

 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Ну с библиотекой у меня тоже не работало

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Забей, лучше выпей пиваса.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Как с датчиком разберусь, можно будет)))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Не, лучше щас выпей, не мучай себя - месяц маяться такой хернёй - это никаких нервов не хватит. Тут тебе не помогут, тут все злые и безграмотные. Лучше выпей пиваса.

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

Я тоже за пивас, коль возможности нет померять прибором что у него из VOUT лезет.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну зачем же так. К пиву можно после того как быстренько в цикле просуммировать раз 60 а потом на 60 поделить и будет счастье обладанием результата. Иначе ни как. Одно чтение - случайная величина от синусоиды. В идеале надо читать и суммировать 20 или 40 миллисекунд.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Ну если не сложно покажите код весь, а то я уже зодолбался с этим датчиком

 

Керил
Offline
Зарегистрирован: 10.03.2018

Привет!! Тоже маясь с этим датчиком, вот только у меня работает самый первый скетч, который ты прикладывал. может проблема со скоростью? значения смотришь в терминале, там скорость совпадает со скоростью из скетча? Или у тебя просто значения не те? какая проблема то?? Ребята, кто шарит в программировании - подскажите пожалуйста, что означает phase_shift из его первого скетча??? пытаюсь разобраться в этом. и еще не понятно -- float Vrms = (emon1.Vrms - 3); при чем здесь 3 - ума не приложу...

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

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

И так смотри, я разобрался с этим!
На вот этих двух контактах которые обведены на картинке, подстрой это крутилкой, чтобы сопросивление было 48,8кОм (ну это у меня так)

emon1.voltage(2, 109, 1.7);  // Voltage: input pin, calibration, phase_shift

И коллибровку вместо 109, я поставил 660.
А "2" это пин к которому подключен датчик, НО, этот пин аналоговый, и тут не пишеться А2 а просто 2

Так что попробуй так сделать

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Я собрал так 2 датчика таких, для станции, и нормально работают.
Но я дома настроил на двух, у меня латер стоит и 220, я отстроил, все как часики, без проблем.
Потом поехали на место устоновки, и там пришлось курутить чтоб подогнать под то напряжение, что в сети.
И вот прям щас собирал вторую такую устоновку. Сначала подключил тоже 2 датчика. Даже на них не подано 220, но оно мне на выходе сыпало высокие значения, и эти значения понижась.
Потом я взял ещё датчик, подлючил и все нормально работало. Как оказалось если наживать на чип (на тех не правильно работающи) показания начали какие-то хоть показываться, попробовал пропоять. Не помогло. Короче эти 2 дачтика бракованые.

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

На счёт 3, тут скорей всего её не трогай, пусть оно так и будет.

И на счёт phase_shift, я смотрел, это значение не изменяемо, но я так и не понял для чего оно

 

SkyCatcher
SkyCatcher аватар
Offline
Зарегистрирован: 15.08.2018

Ребята, привет. Тоже планирую использовать этот датчик в приборе простого мониторинга трехфазных установок. Нашёл инфо по нему, на выходе он имеет нормализованную синусоиду с постоянной составляющей (VCC/2), т. е. оба полупериода смещены в положительный квадрант, в диапазон от 0 до VCC. Подстроечником изменяется амплитуда синусоиды. Таким образом, изначально грубо можно подсчитать поправочный коэффициент (Uвх / Uвых). А дальше уже калибровать, изменяя коэфф. Подстроечник стоит дешевый, термостабилизации, судя по доступным снимкам девайса, нет. Соответственно, корректно он будет работать только в "тепличных условиях". В данный момент пока что жду посылку из шанхая :)
кста... датчик здорово просел в цене. Нашёл на али, поиском по названию, ценник 82 руб.
Как получу, потестирую, отпишусь

SkyCatcher
SkyCatcher аватар
Offline
Зарегистрирован: 15.08.2018

По поводу параметра fase_shift 1,7. Предполагаю, это как раз в случае применения трех датчиков на трех фазах. Каждый датчик должен иметь свой сдвиг. Было бы достаточно знаний, покопал бы либу Emoblib, вдруг там есть ещё и функция определения правильности чередования. Это же специально для энергомониторинга затачивалось.

Керил
Offline
Зарегистрирован: 10.03.2018

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

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 месяцев появился еще один исследователь)) 

Керил
Offline
Зарегистрирован: 10.03.2018

Ознакомься так же с этой информацией 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 - мне она точно очень пригодится. Я пока ведь не знаю даже толком - каким образом этот элемент влияет на показания датчика( 

SkyCatcher
SkyCatcher аватар
Offline
Зарегистрирован: 15.08.2018

Здравствуй, друже. Рад, что тема жива и люди заинтересованы.
Благодарю за ссылки, ознакомился со статьями, пока что кроме применения полиномов, тут мне, вероятно, не хватит багажа знаний ;)
По поводу калибровки сдвига фаз - тоже не совсем понял, есть ли способ это сделать кроме чисто эмпирического. Один нюанс уловил. Если PHASECAL задать 1,28, то компенсируется сдвиг, связанный с разным временем просчета результатов сэмплирования для напряжения и тока. То есть, я так понимаю, если на выходе важно сохранить коэффициент мощности (уже соответствующий некоторому сдвигу фаз) и исходный сдвиг, присущий объекту измерений.
Цель моего проекта - сбор статистики потребляемой мощности на различных установках потребителей, с логированием в текстовый файл на сд-карте с дальнейшей ручной обработкой, скорее всего, в экселе. С выведением графиков, выявлением пиков и спадов потребления и их продолжительности. Это нужно для правильного подбора резервных источников питания, как то ИБП и дизельген. установок. Промышленные приборы для этого есть, но в данный момент недоступны по ценнику.
Включать датчики я планирую в фазное напряжение, звездой,это как раз те самые <250 В. Скетч буду писать на основе примера volage_and_current из либы EmonLib. Останется допилить для трёх фаз, привязать выборки к часам реального времени, суммировать мощности и параллельно записи на карту, выводить на lcd дисплей. С украшательствами и плюхами :)
Точность мне требуется едва ли выше "оценочной", стремиться к коммерческим 0,5% или прецизионке - лишнее. Наверняка для этого придется проектировать не на любительском, как у меня, уровне, на основе не столь поделочных, как zmpt, модулей. А то и с нуля.
По теме аналоговых измерений ардуиной в принципе, посоветую вот эту статейку. Автор провел хорошую работу, а не просто перевёл буржуинскую статью. http://robotosha.ru/arduino/analog-measurements-arduino.html

SkyCatcher
SkyCatcher аватар
Offline
Зарегистрирован: 15.08.2018

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

b707
Offline
Зарегистрирован: 26.05.2017

Вот вы ребята заморочились-то...

Казалось бы. что сложного - сигнал на выходе датчика - синусоида с частотой питающей сети, сдвинутая вверх на 512 единиц. Из этого очевидный вывод - что брать мгновенные значения с датчика бессмысленно, получишь случайную величину. Усреднять тоже - получишь ноль (среднее значение синуса за период = ноль).

Чтобы получить с датчика уровень напряжения в сети, нужно либо взять среднеквадратичное значение (первый вариант кода из "умной статьи"), либо тупо просканировать максимумы и минимумы(второй вариант из той же статьи). Я бы еще добавил третий - можно проинтегрировать синусоиду. В любом случае собирать эти данные надо не менее 5-10 периодов, иначе о любой точности можно забыть - так что датчик, прямо скажем, не быстрый, одно измерение не должно быть быстрее 0.1-0.3 сек для 50 Гц

Собственно, это вся та премудрость, что изложена в статье. Вся математика с кучей полиномов - не более чем инструмент для более-менее точной калибровки переменного резистора. Если не понимаете - можете не заморачиваться. особо ничего не потеряете. Все эти зубодробительные уравнения можно за пару минут вывести в обычном Экселе. Причем, если посмотреть таблицы - видно что с усложнением уравнения точность растет несущественно, если вас устраивает ошибка в 2-3% - можете остановится на линейной зависиимости, все равно точнее 1-1.5% получить не выйдет.

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

Ну и чисто практически - ардуино-коды из статьи вполне рабочие, не хватает только описания переменных, но они очевидны. А вот коэффициенты уравнения из статьи (и из обзоров на Ютубе) смысла переписывать нет - они В КАЖДОМ ДАТЧИКЕ будут свои. Из чего следует, что процедуру калибровки надо для каждого девайса делать заново.

b707
Offline
Зарегистрирован: 26.05.2017

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

Керил
Offline
Зарегистрирован: 10.03.2018

Повышение точности не нужно мне для выявления обрывая нуля или фазы, я изучаю это в рамках научной работы в вузе. Обрыв фазы может фатально отразиться на организме человека, который может прямо или косвенно прикоснуться к нему. Спасибо за статью) Реле напряжения - это устройство, которое ставят в домовых щитах для защиты от перенапряжений, вызванных в том числе и обрывом нуля. Эти устройства служат достойно и стоят не малых денежек (не слышал, чтобы подобные устройства устанавливали на низковольтных ТП или линиях передач). Можно сказать, что я должен сделать свое реле напряжения, работающее на ардуино, только при этом должен разобраться как повысить точность и скорость работы до максимума, а зачем - это уже вопрос другой(второстепенный). Первостепенно - это процесс познания так сказать