Tôi muốn tạo một đồng hồ đo điện và sử dụng arduino để ghi thông tin và gửi lên web. Có bất kỳ giải pháp dễ dàng cho đồng hồ điện? Tôi sống ở Argentina và đường dây điện là 220v. Cảm ơn
Tôi muốn tạo một đồng hồ đo điện và sử dụng arduino để ghi thông tin và gửi lên web. Có bất kỳ giải pháp dễ dàng cho đồng hồ điện? Tôi sống ở Argentina và đường dây điện là 220v. Cảm ơn
Câu trả lời:
Bạn có thể kiểm tra Tweet-a-Watt và xem liệu nó có hoạt động với đường dây điện 220 V của bạn không. Dự án đó ít nhất nên cung cấp cho bạn một ý tưởng về cách bắt đầu.
Hãy xem các dự án này:
Đủ? ;-)
Tạo một đồng hồ đo điện chính xác không phải là một nhiệm vụ tầm thường. Bạn cần một cách cảm nhận điện áp và dòng điện với độ chính xác và tốc độ đủ để bạn có thể phát hiện sự lệch pha giữa chúng (hệ số công suất) và tính toán công suất thực và biểu kiến. Bạn gần như muốn có một DSP cho việc này.
Tạo một đồng hồ đo công suất thô sơ có thể được thực hiện bằng cách cảm nhận và DC lấy trung bình điện áp và dòng điện, bỏ qua công suất phản kháng và nhu cầu lấy mẫu ở tốc độ cao. Độ chính xác sẽ thay đổi như một chức năng của chất lượng của tải.
Có các IC trên thị trường dành riêng cho đo năng lượng, như Microchip MCP3909 mà bạn có thể sử dụng với Arduino của mình.
Hệ thống này từ Nhóm năng lượng thông minh có thể được quan tâm, nó dựa trên phần cứng Arduino, v.v.
Bạn có thể sử dụng cảm biến hiệu ứng HALL (có thể 10-30e?) Với bảng Arduino.
Tôi đã và đang làm việc rộng rãi để xây dựng các Màn hình năng lượng được kết nối web bằng cách sử dụng ESP8266 (với Arduino IDE) và các DSP theo dõi năng lượng chuyên dụng và khác nhau của ADC ( ATM90E26 và ADE7763 ).
Sơ đồ Fritzing cơ bản của ADC + Wifi hỗ trợ NodeMCU tương thích với Arduino được hiển thị bên dưới:
Mã để sử dụng màn hình năng lượng ESP8266 được minh họa ở trên là ở đây. Xin lưu ý rằng đây là một đơn giản có độ chính xác thấp để thực hiện giải pháp lấy mẫu điện áp bằng máy biến áp và dòng điện sử dụng CT. Các giải pháp độ chính xác cao hơn cần lấy mẫu trực tiếp 240V (sử dụng thang chia điện áp và điện trở shunt) và yêu cầu xem xét thiết kế bổ sung để xử lý các vấn đề phát sinh khi làm việc với điện áp cao.
/*
* 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);
}