Je veux créer un wattmètre et utiliser Arduino pour enregistrer les informations et les envoyer sur le Web. Existe-t-il une solution simple au wattmètre? J'habite en Argentine et la ligne électrique est de 220V. Merci
Je veux créer un wattmètre et utiliser Arduino pour enregistrer les informations et les envoyer sur le Web. Existe-t-il une solution simple au wattmètre? J'habite en Argentine et la ligne électrique est de 220V. Merci
Réponses:
Vous pouvez vérifier Tweet-a-Watt et voir si cela fonctionnera avec votre ligne électrique 220V. Ce projet devrait au moins vous donner une idée de la façon de commencer.
Jetez un œil à ces projets:
Suffisant? ;-)
La création d'un wattmètre précis n'est pas une tâche triviale. Vous avez besoin d'un moyen de détecter la tension et le courant avec une précision et une vitesse suffisantes pour détecter les différences de phase entre eux (facteur de puissance) et calculer la puissance réelle et apparente. Vous voudriez presque un DSP pour cela.
La création d'un wattmètre rudimentaire peut être effectuée en détectant et en faisant la moyenne CC de la tension et du courant, en ignorant la puissance réactive et la nécessité d'échantillonner à des vitesses élevées. La précision variera en fonction de la qualité de la charge.
Il existe des circuits intégrés sur le marché spécifiquement pour la mesure de puissance, comme le Microchip MCP3909 que vous pourrez peut-être utiliser avec votre Arduino.
Ce système de Smart Energy Groups peut être intéressant, il est basé sur du matériel Arduino et ainsi de suite.
Vous pouvez utiliser un capteur à effet HALL (10-30e peut-être?) Avec une carte Arduino.
J'ai beaucoup travaillé à la création de moniteurs d'énergie connectés au Web en utilisant l'ESP8266 (avec Arduino IDE) et divers ADC et DSP de surveillance de l'énergie dédiés ( ATM90E26 et ADE7763 ).
Le diagramme de Fritzing du NodeMCU compatible Arduino compatible ADC + Wifi de base est illustré ci-dessous:
Le code d'utilisation du moniteur d'énergie ESP8266 illustré ci-dessus est ici. Veuillez noter qu'il s'agit d'une solution de faible précision simple à implémenter d'échantillonnage de la tension à l'aide d'un transformateur et du courant à l'aide d'un TC. Les solutions de plus grande précision doivent échantillonner 240 V directement (en utilisant une échelle de diviseur de tension et une résistance de shunt) et nécessitent des considérations de conception supplémentaires pour gérer les problèmes résultant du travail avec des tensions élevées.
/*
* 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);
}