Если вы очень переживаете за расход электро энергии и жуть как хочется вычислить виновника - это ваш день. Мы соберем датчик тока напишем простую логику для обработки входных значений для пересчета значений в киловаты/ч.

Для сборки я использовал плату Arduino nano (никто не мешаем вам использовать тот же код для ESP или STM плат), LCD экранный шилд, резистор на 56 Ом, резисторы 100 кОм, конденсатор 10 мКф, датчик тока CT - Talema AC103 (с номинальным измерением 30A и максимальным 75A).
Что такое датчик тока?

Датчик тока - это магнитопровод с зазором и обмоткой компенсации, а так же встроенный датчик Холла и плата управления. Датчик Холла размещается в зазоре магнитопровода и реагирует на создаваемое катушкой магнитное поле. Чем сильнее напряженность магнитного поля, тем сильнее датчик Холла подает сигнал, который усиливается платой управления.
Датчики тока бывают для измерения переменного тока и постоянного тока. Наш - CT-Talema AC103 - для переменного.
Соберем наше устройство согласно схеме:

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

Не забываем, что нам нужно выполнить калибровку нагрузочного резистора R3. Формула расчета R = V / I - R = 2,5 / 0,042 = 59,5 Ом где 2,5 - опорное напряжение на плате, а 42mA - потребление платы. По тому принимаем самый близкий резистор по номиналу - 56 Ом.
Для деление основного напряжения питания до опорного 5/2 вам потребуется поставить два одинаковых резистора R1 и R2.
Остается только загрузить пример кода в Arduino:
//Michael Klements //The DIY Life //27 October 2014 #include <LiquidCrystal.h> int currentPin = 1; //Assign CT input to pin 1 double kilos = 0; int peakPower = 0; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Assign LCD screen pins, as per LCD shield requirements void setup() { lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc. lcd.clear(); lcd.setCursor(0,0); // set cursor to column 0, row 0 (the first row) lcd.print("Running"); } void loop() { int current = 0; int maxCurrent = 0; int minCurrent = 1000; for (int i=0 ; i<=200 ; i++) //Monitors and logs the current input for 200 cycles to determine max and min current { current = analogRead(currentPin); //Reads current input and records maximum and minimum current if(current >= maxCurrent) maxCurrent = current; else if(current <= minCurrent) minCurrent = current; } if (maxCurrent <= 517) { maxCurrent = 516; } double RMSCurrent = ((maxCurrent - 516)*0.707)/11.8337; //Calculates RMS current based on maximum value int RMSPower = 220*RMSCurrent; //Calculates RMS Power Assuming Voltage 220VAC, change to 110VAC accordingly if (RMSPower > peakPower) { peakPower = RMSPower; } kilos = kilos + (RMSPower * (2.05/60/60/1000)); //Calculate kilowatt hours used delay (2000); lcd.clear(); lcd.setCursor(0,0); // Displays all current data lcd.print(RMSCurrent); lcd.print("A"); lcd.setCursor(10,0); lcd.print(RMSPower); lcd.print("W"); lcd.setCursor(0,1); lcd.print(kilos); lcd.print("kWh"); lcd.setCursor(10,1); lcd.print(peakPower); lcd.print("W"); }
Завершающим шрихом нашей установки станет калибровка. Ее лучше выполнять при включенной эталонной нагрузке известной мощности. Для этого хорошо подходят мощные лампы накаливания. Возьмем лампу на 100 Ват. Включаем плату и высчитываем поправочный коэффициент:
Двойной RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337 где 11.8337 - подобранный коэффициент для компенсации расхождений в измерениях.
