Voglio creare un misuratore di potenza e utilizzare Arduino per registrare le informazioni e inviarle al Web. Esiste una soluzione semplice al misuratore di potenza? Vivo in Argentina e la linea elettrica è a 220V. Grazie
Voglio creare un misuratore di potenza e utilizzare Arduino per registrare le informazioni e inviarle al Web. Esiste una soluzione semplice al misuratore di potenza? Vivo in Argentina e la linea elettrica è a 220V. Grazie
Risposte:
Puoi controllare Tweet-a-Watt e vedere se funzionerà con la tua linea di alimentazione 220V. Quel progetto dovrebbe almeno darti un'idea di come iniziare.
Dai un'occhiata a questi progetti:
Abbastanza? ;-)
Creare un misuratore di potenza accurato non è un compito banale. È necessario un modo per rilevare la tensione e la corrente con sufficiente precisione e velocità da poter rilevare le differenze di fase tra loro (fattore di potenza) e calcolare la potenza reale e apparente. Avresti quasi bisogno di un DSP per questo.
La creazione di un misuratore di potenza rudimentale può essere effettuata rilevando e DC calcolando la media della tensione e della corrente, ignorando la potenza reattiva e la necessità di campionare ad alta velocità. La precisione varia in funzione della qualità del carico.
Esistono sul mercato circuiti integrati specifici per la misurazione della potenza, come il Microchip MCP3909 che potresti essere in grado di utilizzare con il tuo Arduino.
Questo sistema di Smart Energy Groups può essere interessante, è basato sull'hardware Arduino e così via.
Potresti usare un sensore di effetto HALL (10-30e forse?) Con una scheda Arduino.
Ho lavorato ampiamente alla costruzione di monitor di energia connessi al web utilizzando ESP8266 (con Arduino IDE) e vari ADC e DSP dedicati al monitoraggio dell'energia ( ATM90E26 e ADE7763 ).
Di seguito è mostrato il diagramma fritzing di NodeMCU compatibile con Arduino compatibile con ADC + Wifi:
Il codice per l'utilizzo del monitor energetico ESP8266 illustrato sopra è qui. Si prega di notare che questa è una soluzione semplice da implementare a bassa precisione che campiona la tensione usando un trasformatore e la corrente usando un CT. Le soluzioni di maggiore precisione devono campionare direttamente 240 V (utilizzando una scala divisoria di tensione e un resistore di shunt) e richiedere ulteriori considerazioni di progettazione per gestire i problemi derivanti dal lavoro con alte tensioni.
/*
* 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);
}