Modulo ACS712ELCTR-30A

Salve a tutti, vorrei costruire un contatore con questo modulo ACS712ELCTR-30A mi chiedevo come posso calcolare le kw ora che operazione devo fare? Grazie

La prima che mi viene in mente è questa: Ogni secondo sommerei gli Ampere misurati ad una variabile di accumulo Dopo 1 ora prendo il totale e lo divido per 3600 e lo moltiplico per 230 e per 0,7 e divido per 1000 Il risultato sono i KWh da pagare a mamma Enel

Non puoi farlo; devi sapere lo sfasamento tra corrente e tensione per calcolare la potenza reale. http://openenergymonitor.org/emon/guide Ciao Uwe

Testato: La prima che mi viene in mente è questa: Ogni secondo sommerei gli Ampere misurati ad una variabile di accumulo Dopo 1 ora prendo il totale e lo divido per 3600 e lo moltiplico per 230 e per 0,7 Il risultato sono i KWh da pagare a mamma Enel

Molto aprossimato. Chi Ti dice che lo sfasamento é 0,7? Ciao Uwe

Nel momento in cui lui vuole usare solo la misura di corrente è l'unica strada percorribile l'approssimazione :) Se vuole cambiare progetto c'è molto di meglio fa poter fare

io pensavo a fare una variabile che sommo ogni mezzo secondo le ampere tipo l = analogrear(A1) a = (l + l) /2 e ogni ora leggo a magari faccio lo setesso con una lettura di tenzione almeno faccio la media del voltaggio per essere precisi

come faccio elettronicamente a leggere il 220V con arduino?

La mia risposta è per spronare la curiosità e tendere al miglioramento Quando si chiederà cosa sono i numeri che ho citato ed il perché avrà fatto un ampio miglioramento e forse deciderà da solo

danyevo: io pensavo a fare una variabile che sommo ogni mezzo secondo le ampere tipo l = analogrear(A1) a = (l + l) /2 e ogni ora leggo a magari faccio lo setesso con una lettura di tenzione almeno faccio la media del voltaggio per essere precisi

come faccio elettronicamente a leggere il 220V con arduino?

C'é solo un insignificante problemino. Stiamo parlando di tensione alternata a 50Hz. A secondo del momentio di misura misuri un valore tra + Ip e -Ip (Corrente di picco) che é maggiore del fattore 1,41 della corrente efficace che misuri con un tester (se la corrente é sinusoidale). Percui misuri numeri casuali e ne il valore efficace ne il valore di picco della corrente.

danyevo, un consiglio da amico: Dimentica la Tua idea. Ti mancano totalmente le basi e temo anche che non hai la conoscenza necessaria per lavorare a un impinato elettrico.

Ciao Uwe

danyevo, un consiglio da amico: Dimentica la Tua idea. Ti mancano totalmente le basi e temo anche che non hai la conoscenza necessaria per lavorare a un impinato elettrico.

Se ti puo consolare io sono un elettricista.

comunque o trovato anche questo schema: mi manca solo sapere come posso fare il calcolo per trovare le KW ora

questo è il codice trovato ma devo analizzarlo per capire bene

----------------------------------------------------------------------------
INFO:il Powermeter dispone di memoria eeprom interna nella quale salva a cadenza di
4 ore il valore contenuto nei contatori.Se si desidera resettare i contatori :
-disalimentare il circuito
-premere e mantenere premuto il pulsante
-alimentare il circuito
-attendere la scritta "ATTENZIONE RESET CONTATORI TRA 4H"
-rilasciare il pulsante
A questo punto il reset è armato e sarà attivato allo scadere delle 4H.
Quindi se erroneamente si resettano i contatori ,basterà disalimentare e rialimentare il
circuito per recuperare l'ultimo Backup.
-----------------------------------------------------------------
*/
//IMPOSTAZIONI UTENTE (Scegliere le preferenze)

const boolean ConfigB = false; //Configurazione B ? true or false
//Scegli lo schema di installazione piu' adatto
//false = doppio contatore simultaneo
//true = doppio contatore funzionamento selettivo

const byte PagDefault = 0; // Scegli la schermata di default..:-)
//0 = Wattmetro
//1 = Voltmetro + stato UPS
//2 = Amperometro
//3 = Contatori

const int TempoLed = 200; //Scegli il Tempo della retroilluminazione
//allo spengimento si imposterà la pagina di Default
//Ogni unita vale circa 2 secondi :-)


//------------------------------------------------------------
// LIBRERIE
#include <virtualwire.h>
#include <liquidcrystal.h>
#include <eeprom.h>

//-----------------------------------------------------------
// VARIABILI E COSTANTI
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//ASSEGNAZIONE PIN LCD
const int BACKLIGH_PIN = 10;//Assegnazione Retroilluminazione
const int ProdottaPin = A1;
const int AssorbitaPin = A2;
const int TensionePin = A3;
const int transmit_pin = 12;
const int receive_pin = 11;
const int transmit_en_pin = 3;
const int ledPin = 13;
const int ADR=100;//Indirizzo PowerMeter
const int ResetPin = 2;//se posto a 1 resetta i contatori
const int PagPin = 2;//se premuto scorre le pagine
byte pagina = PagDefault; //PAGINA DA VISUALIZZARE SULL'LCD
int Timeout = TempoLed;//Timeout
byte Tensione = 0;
byte Frequenza = 50;
unsigned long ProdottaMedia = 0;//Somma delle campionature
unsigned long AssorbitaMedia = 0;//Somma delle campionature
float ProdottaMediaP = 0;//Amper Prodotti
float AssorbitaMediaP = 0;//Amper Assorbiti
int PotenzaPro;//Potenza Prodotta (Amper Prodotti*Tensione)
int PotenzaAss;//Potenza Assorbita (Amper Assorbiti*Tensione)
unsigned long time = 0;//Tempo dall'ultimo invio via radio
unsigned long Tmemoria = 0;//Tempo dall'ultimo BackUp
unsigned long TCampionature = 0;//Tempo dall'ultima Campionatura
float TotProdotta = 0;//Contatore Totale Prodotta
float TotAssorbita = 0;//Contatore Totale Assorbita




void setup() {
Serial.begin(9600);
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_set_ptt_inverted(true);
vw_setup(2000);
pinMode(ledPin, OUTPUT);
pinMode(ResetPin, INPUT);
lcd.begin(16, 2);
pinMode(BACKLIGH_PIN, OUTPUT);
digitalWrite(BACKLIGH_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PowerMeter V3 By");
lcd.setCursor(0,1);
lcd.print("ElettroshockNow");
delay(2000);

//recupero dati contatori dal BackUp
unsigned char k,mem;
for (k=0;k<4;k++){
mem = EEPROM.read(0x00+k);
((unsigned char*) &TotProdotta)[k]=mem;
}
for (k=0;k<4;k++){
mem = EEPROM.read(0x05+k);
((unsigned char*) &TotAssorbita)[k]=mem;
}
if (digitalRead(ResetPin) == HIGH) {//se premuto Resetta i contatori
TotProdotta = 0;
TotAssorbita = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ATTENZIONE RESET");
lcd.setCursor(0,1);
lcd.print("CONTATORI TRA 4H");
delay(5000);
}
}


void loop() {


//-----------------------------------------------------------------
//MISURA I SENSORI E CALCOLA LE CORRENTI E LE POTENZE E LA TENSIONE
int Tensionepicco = 0;
ProdottaMedia = 0 ;
AssorbitaMedia = 0 ;
for (int i=0;i<1000;i++){
ProdottaMedia += abs(analogRead(ProdottaPin)-510);
AssorbitaMedia += abs(analogRead(AssorbitaPin)-510);
int Tensioneinst = analogRead(TensionePin);
if (Tensionepicco<tensioneinst)Tensionepicco=Tensioneinst;
}
Tensione=Tensionepicco*.45;//Taratura sensore Tensione

ProdottaMediaP= (ProdottaMedia*.000079)-0.032;//calcola gli Amper istantanei Prodotti
AssorbitaMediaP= (AssorbitaMedia*.000079)-0.032;//calcola gli Amper istantanei Assorbiti
if (ConfigB & AssorbitaMediaP > 0.2)ProdottaMediaP=0;
PotenzaPro=int(ProdottaMediaP*Tensione/10)*10;//Calcola Potenza istantanea Prodotta (Step da 10W)
PotenzaAss=int(AssorbitaMediaP*Tensione/10)*10;//Calcola Potenza istantanea Assorbita (Step da 10W)

//Calcola e memorizza in EEPROM i Contatori Potenze
if (micros()>TCampionature){// if è per prevenire il reset del contatore ogni 70ore!!
TotProdotta+=ProdottaMediaP*Tensione*(micros()-TCampionature)/1000000/3600/1000;//Calcola i Kwh Prodotti
TotAssorbita+=AssorbitaMediaP*Tensione*(micros()-TCampionature)/1000000/3600/1000;//Calcola i Kwh Consumati
}
TCampionature=micros();
if (millis()>(Tmemoria + 14400000)){//BackUp ogni 4 ore= 14400000mS
unsigned char k,mem;
for (k=0;k<4;k++){
mem = ((unsigned char*) &TotProdotta)[k];
EEPROM.write(0x00+k,mem);
}
for (k=0;k<4;k++){
mem = ((unsigned char*) &TotAssorbita)[k];
EEPROM.write(0x05+k,mem);
}
Tmemoria=millis();
}
//---------------------------------------------------------------


//VISUALIZZA E SPENGE IL DISPLAY SE NON USATO
if (digitalRead(PagPin) == HIGH & Timeout<=0){
digitalWrite(BACKLIGH_PIN, HIGH);//accendi LCD
Timeout=TempoLed;
delay(1000);
}
if (Timeout>0) {
digitalWrite(BACKLIGH_PIN, HIGH);//accendi LCD
Timeout--;
if (digitalRead(PagPin) == HIGH){
pagina++;
if (pagina>3)pagina=0;
}

switch (pagina){
case 0 :
lcd.setCursor(0, 0);
lcd.print ("Assorbita= ");
lcd.print (PotenzaAss);
lcd.print ("W ");
lcd.setCursor(0,1);
lcd.print ("Prodotta = ");
lcd.print (PotenzaPro);
lcd.print ("W ");
break;
case 1 :
lcd.setCursor(0, 0);
lcd.print ("Tensione= ");
lcd.print (Tensione);
lcd.print ("V ");
lcd.setCursor(0,1);
if(ConfigB){
lcd.print ("Stato UPS=");
if (AssorbitaMediaP > 0.2) lcd.print ("STBY ");
else lcd.print ("ACTIVE ");
}
else lcd.print ("----------------");

break;
case 2 :
lcd.setCursor(0, 0);
lcd.print ("CorrenteA= ");
lcd.print (AssorbitaMediaP,2);
lcd.print ("A ");
lcd.setCursor(0,1);
lcd.print ("CorrenteP= ");
lcd.print (ProdottaMediaP,2);
lcd.print ("A ");
break;
case 3 :
lcd.setCursor(0, 0);
lcd.print ("TotA= ");
lcd.print (TotAssorbita,1);
lcd.print ("Kwh ");
lcd.setCursor(0,1);
lcd.print ("TotP= ");
lcd.print (TotProdotta,1);
lcd.print ("Kwh ");
break;

}
}
else {
digitalWrite(BACKLIGH_PIN, LOW);//Spenge LCD
pagina=PagDefault;//imposta la pagina default
}

Serial.write ("Tensione= ");
Serial.println(Tensione);
Serial.write ("Frequenza= ");
Serial.println(Frequenza);
Serial.write ("Amper RMS assorbiti= ");
Serial.println(AssorbitaMediaP);
Serial.write ("Amper RMS Prodotti= ");
Serial.println(ProdottaMediaP);
Serial.write ("Potenza assorbita= ");
Serial.println(PotenzaAss);
Serial.write ("Potenza Prodotta= ");
Serial.println(PotenzaPro);
Serial.write ("Totale consumata= ");
Serial.println(TotAssorbita);
Serial.write ("Totale Prodotta= ");
Serial.println(TotProdotta);
Serial.write ("Taratura Sensore Assorbita= ");
Serial.println(AssorbitaMedia);
Serial.write ("Taratura Sensore Prodotta= ");
Serial.println(ProdottaMedia);


//TRASMETTI DATI OGNI 15 SECONDI OPPURE IMMEDIATAMENTE SE LA POTENZA PRODOTTA
//E' PROSSIMA ALLA POTENZA ASSORBITA
if (ProdottaMediaP != 0 && (ProdottaMediaP > (AssorbitaMediaP - 0.30)) && ConfigB==false || millis() > (time + 15000)){
time = millis();
byte Pro1 = PotenzaPro&0xFF;
byte Pro2=(PotenzaPro&0xFF00)>>8;
byte Ass1=PotenzaAss&0xFF;
byte Ass2=(PotenzaAss&0xFF00)>>8;
byte CPro1= int(ProdottaMediaP*100)&0xFF;
byte CPro2= (int(ProdottaMediaP*100)&0xFF00)>>8;
byte CAss1= int(AssorbitaMediaP*100)&0xFF;
byte CAss2= (int(AssorbitaMediaP*100)&0xFF00)>>8;
byte TPro1= long(TotProdotta*10)&0xFF;
byte TPro2= (long(TotProdotta*10)&0xFF00)>>8;
byte TPro3= (long(TotProdotta*10)&0xFF0000)>>16;
byte TAss1= long(TotAssorbita*10)&0xFF;
byte TAss2= (long(TotAssorbita*10)&0xFF00)>>8;
byte TAss3= (long(TotAssorbita*10)&0xFF0000)>>16;
byte CKS = (ADR+Tensione+Pro1+Pro2+Ass1+Ass2+CPro1+CPro2+CAss1+CAss2+TPro1+TPro2+TPro3+TAss1+TAss2+TAss3)/16;
char msg[17] = {ADR,Tensione,Pro1,Pro2,Ass1,Ass2,CPro1,CPro2,CAss1,CAss2,TPro1,TPro2,TPro3,TAss1,TAss2,TAss3,CKS};
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, 17 );
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
}
}

danyevo:

danyevo, un consiglio da amico: Dimentica la Tua idea. Ti mancano totalmente le basi e temo anche che non hai la conoscenza necessaria per lavorare a un impinato elettrico.

Se ti puo consolare io sono un elettricista.

Non mi consola tanto visto come volevi misurare la corrente alternata. :~

Riguarda allo schema: cerca di trovare un trasformatore con uscite secondarie da 8V e da 4V. :astonished: :astonished: prendine 2 diversi.

Quel Sketch vale poco. Non considera lo sfasamento e c'é un delay(1000); che lo ferma per 1 secondo. Se non misuro lo sfasamento non ha neanche senso misurare la tensione. É piú semplice e non aumenta l' errore di misura in modo significante considerare la tensione fissa 230V.

Ciao Uwe

Uwe: Per il trasformatore quello indicato e' precisamente quello che si vuole usare, non ci sono problemi a trovarlo http://www.abb.it/productdetails/ABB2CSM151021R0801

Per lo sketch sono in gran parte d'accordo con UWE, prendere a spot singoli il valore della tensione e della corrente non significa niente, serve un campionamento di almeno un centinaio di valori al secondo, piu' sono meglio e', tanto vale tornare a valori fissi come avevo detto all'inizio sia per V che per cosfi. se capici il perche' di quei valori puoi poi approfondire.