Saya ingin membuat pengukur daya dan menggunakan Arduino untuk mencatat info dan mengirim ke web. Apakah ada solusi mudah untuk meteran listrik? Saya tinggal di Argentina dan saluran listriknya 220V. Terima kasih
Saya ingin membuat pengukur daya dan menggunakan Arduino untuk mencatat info dan mengirim ke web. Apakah ada solusi mudah untuk meteran listrik? Saya tinggal di Argentina dan saluran listriknya 220V. Terima kasih
Jawaban:
Anda mungkin memeriksa Tweet-a-Watt dan melihat apakah itu akan berfungsi dengan saluran listrik 220V Anda. Proyek itu setidaknya harus memberi Anda ide tentang cara memulai.
Lihatlah proyek-proyek ini:
Cukup? ;-)
Membuat pengukur daya yang akurat bukanlah tugas yang sepele. Anda memerlukan cara merasakan tegangan dan arus dengan akurasi dan kecepatan yang cukup sehingga Anda dapat mendeteksi perbedaan fasa di antara mereka (faktor daya) dan menghitung daya nyata dan nyata. Anda hampir menginginkan DSP untuk ini.
Membuat meteran listrik yang belum sempurna dapat dilakukan dengan merasakan dan DC rata-rata tegangan dan arus, mengabaikan daya reaktif dan kebutuhan untuk sampel pada kecepatan tinggi. Akurasi akan bervariasi sebagai fungsi dari kualitas beban.
Ada IC di pasaran khusus untuk pengukuran daya, seperti Microchip MCP3909 yang mungkin dapat Anda gunakan dengan Arduino Anda.
Sistem ini dari Smart Energy Groups mungkin menarik, didasarkan pada perangkat keras Arduino dan sebagainya.
Anda dapat menggunakan sensor efek HALL (10-30e mungkin?) Dengan papan Arduino.
Saya telah bekerja secara luas membangun Monitor Energi yang terhubung dengan web menggunakan ESP8266 (dengan Arduino IDE) dan berbagai DSC dan DSC pemantauan Energi khusus ( ATM90E26 dan ADE7763 ).
Diagram fritzing dari ADC + Wifi diaktifkan NodeMCU yang kompatibel dengan Arduino ditampilkan di bawah ini:
Kode untuk menggunakan monitor Energi ESP8266 yang diilustrasikan di atas ada di sini. Harap dicatat bahwa ini adalah akurasi rendah yang sederhana untuk mengimplementasikan solusi pengambilan sampel tegangan menggunakan transformator dan arus menggunakan CT. Solusi dengan akurasi yang lebih tinggi perlu mengambil sampel 240V secara langsung (menggunakan tangga pembagi tegangan dan shunt resistor) dan memerlukan pertimbangan desain tambahan untuk menangani masalah yang timbul akibat bekerja dengan tegangan tinggi.
/*
* 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);
}