Я хочу створити вимірювач потужності і використовувати arduino для реєстрації інформації та надсилання в Інтернет. Чи є якесь просте рішення лічильника електроенергії? Я живу в Аргентині, а лінія електропередач - 220В. Спасибі
Я хочу створити вимірювач потужності і використовувати arduino для реєстрації інформації та надсилання в Інтернет. Чи є якесь просте рішення лічильника електроенергії? Я живу в Аргентині, а лінія електропередач - 220В. Спасибі
Відповіді:
Ви можете перевірити Tweet-a-Watt і побачити, чи буде він працювати з вашою лінією електроживлення 220В. Цей проект повинен хоча б дати вам уявлення про те, як розпочати роботу.
Погляньте на ці проекти:
Достатньо? ;-)
Створення точного лічильника потужності - не тривіальне завдання. Вам потрібен спосіб зондування напруги та струму з достатньою точністю та швидкістю, щоб ви могли виявити різницю фаз між ними (коефіцієнт потужності) та обчислити реальну та уявну потужність. Ви майже хочете отримати для цього DSP.
Створення рудиментарного лічильника електроенергії можна здійснити зондуванням та постійним усередненням напруги та струму, ігноруючи реактивну потужність та необхідність вибірки на високих швидкостях. Точність буде змінюватися залежно від якості навантаження.
На ринку є ІМС, спеціально для вимірювання електроенергії, як Microchip MCP3909, який ви можете використовувати з Arduino.
Ця система від Smart Energy Group може представляти інтерес, вона заснована на апаратному забезпеченні Arduino тощо.
Ви можете використовувати датчик ефекту HALL (можливо, 10-30e?) З платою Arduino.
Я широко працював над створенням підключених до Інтернету енергомоніторів, використовуючи ESP8266 (з Arduino IDE), а також різні АЦП та спеціалізовані ЦОП енергомоніторингу ( ATM90E26 та ADE7763 ).
Схема фризингу базового ADC + Wifi з підтримкою Arduino, сумісного з NodeMCU, показана нижче:
Код для використання монітора енергії ESP8266, проілюстрований вище, тут. Зверніть увагу, що це невисока точність простої реалізації рішення відбору проб напруги за допомогою трансформатора і струму за допомогою КТ. Рішення з більш високою точністю повинні пробувати 240В безпосередньо (використовуючи сходи подільника напруги та резистор маневри) та потребують додаткових міркувань щодо проектування для вирішення проблем, що виникають при роботі з високою напругою.
/*
* This sketch sends ads1115 current sensor data via HTTP POST request to thingspeak server.
* It needs the following libraries to work (besides the esp8266 standard libraries supplied with the IDE):
*
* - https://github.com/adafruit/Adafruit_ADS1X15
*
* designed to run directly on esp8266-01 module, to where it can be uploaded using this marvelous piece of software:
*
* https://github.com/esp8266/Arduino
*
* 2015 Tisham Dhar
* licensed under GNU GPL
*/
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>
// replace with your channel's thingspeak API key,
String apiKey = "XXXXXXXXXXXXX";
//WIFI credentials go here
const char* ssid = "XXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXXXXXXXXXX";
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
const char* server = "api.thingspeak.com";
WiFiClient client;
double offsetI;
double filteredI;
double sqI,sumI;
int16_t sampleI;
double Irms;
double squareRoot(double fg)
{
double n = fg / 2.0;
double lstX = 0.0;
while (n != lstX)
{
lstX = n;
n = (n + fg / n) / 2.0;
}
return n;
}
double calcIrms(unsigned int Number_of_Samples)
{
/* Be sure to update this value based on the IC and the gain settings! */
float multiplier = 0.125F; /* ADS1115 @ +/- 4.096V gain (16-bit results) */
for (unsigned int n = 0; n < Number_of_Samples; n++)
{
sampleI = ads.readADC_Differential_0_1();
// Digital low pass filter extracts the 2.5 V or 1.65 V dc offset,
// then subtract this - signal is now centered on 0 counts.
offsetI = (offsetI + (sampleI-offsetI)/1024);
filteredI = sampleI - offsetI;
//filteredI = sampleI * multiplier;
// Root-mean-square method current
// 1) square current values
sqI = filteredI * filteredI;
// 2) sum
sumI += sqI;
}
Irms = squareRoot(sumI / Number_of_Samples)*multiplier;
//Reset accumulators
sumI = 0;
//--------------------------------------------------------------------------------------
return Irms;
}
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
ads.begin();
}
void loop() {
//Serial.print("Differential: "); Serial.print(results); Serial.print("("); Serial.print(trans_volt); Serial.println("mV)");
double current = calcIrms(2048);
if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
String postStr = apiKey;
postStr +="&field1=";
postStr += String(current);
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
}
client.stop();
//Serial.println("Waiting...");
// thingspeak needs minimum 15 sec delay between updates
delay(20000);
}