Se sei già registrato           oppure    

Orario: 29/03/2024 07:44:45  

 

Energia Alternativa ed Energia Fai Da Te > Applicazioni E Realizzazioni Pratiche

VISUALIZZA L'ALBUM

Pagine: (18)   1   2   3   4   5   [6]   7   8   9   10   11   12   13   14   15   16   17   18    (Ultimo Msg)


Voltmetro, Amperometro, Wattmetro, Contatori Assorbimento
FinePagina

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 25/9/2013,12:06

Sisi lo schema con il piccolo trasformatore viene usato usato per rilevare la tensione di rete.

Per il resto credo che sia tutto ok .....

Buon lavoro

 

dinoch

Avatar
Watt


Gruppo:Utente
Messaggi:56

Stato:



Inviato il: 2/10/2013,09:18

Sto facendo anche io delle prove.. ma dopo aver fatto una taratura intorno ai 60W di assorbimento quando assorbo circa 1200W (misurati con amperometro) l'uscita di arduino mi dice che sono altre 5000.. Devo rivedere lo Sketck faccine/sad.gif

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 5/10/2013,11:15

------Qualche giorno fà ...... boom faccine/sad.gif -------

In un momento di rinc....mento totale ho erroneamente causato un corto netto sull'impianto di casa ......
Nulla di preoccupante se non fosse che il solare non produceva più faccine/sad.gif ...

Il motivo era semplice :
Durante il corto ,la corrente circolante nel sensore ACS712 ha superato il valore massimo sopportabile (100A *100mS) causando la rottura dello stesso e del microcontrollore faccine/cry.gif faccine/cry.gif ad esso collegato ....

Quindi ho introdotto una semplice modifica che allontana la ricomparsa del problema.
Consiste nel sostituire i sensori ACS712 con dei sensori non invasivi SCT-013-030 (o simili) secondo lo schema di seguito
http://www.energialternativa.info/Public/NewForum/ForumEA/B/y9y0.jpg
Con una resistenza di schunt di 100Ohm ho riscontrato una sensibilità simile all'ACS712 30A ,attestandosi a 50mV/A invece dei 66mV/A ,quindi bisognerà solo ritarare i fattori di conversione e il gioco è fatto faccine/smile.gif

Ecco l'interno del nuovo powerMeter faccine/smile.gif
http://www.energialternativa.info/Public/NewForum/ForumEA/lfgu.jpg

Ciao
ElettroshockNow



Modificato da BellaEli - 13/11/2015, 12:37:31
 

eliafino

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:1419

Stato:



Inviato il: 6/10/2013,08:52

Bella idea Elettro,
mi dispiace che è venuta dopo un botto... ma succede... sapessi quante volte faccine/happy.gif

Mi sa che al posto dei sensori hall seguirò il tuo consiglio! Il rischio come hai visto tu è alto...
... grazie per la condivisione!



---------------
Impianto Fotovoltaico "eliafino" in Tempo Reale.
http://www.eliafino.it:3000/d/solare/impianto-fotovoltaico-eliafino

 

PinoTux

Avatar
GigaWatt


Gruppo:AMMINISTRATORE
Messaggi:3509

Stato:



Inviato il: 6/10/2013,10:48

Ottima soluzione, ma mi è venuto un pensierino... avendo a disposizione un ASC712 da 5A e volendolo utilizzare come ha fatto Elettro, si potrebbe utilizzare uno SHUNT in modo da bypassare la corrente maggiore, leggi quella di Corto Circuito, in modo che la quota parte non ecceda quella supportata dal dispositivo.
Complicazioni varie a parte, sarebbe fattibile?



---------------
"Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza"
http://iv3gfn.altervista.org/
http://pptea.altervista.org/

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 6/10/2013,11:18

CITAZIONE (PinoTux @ 6/10/2013, 11:48)
Ottima soluzione, ma mi è venuto un pensierino... avendo a disposizione un ASC712 da 5A e volendolo utilizzare come ha fatto Elettro, si potrebbe utilizzare uno SHUNT in modo da bypassare la corrente maggiore, leggi quella di Corto Circuito, in modo che la quota parte non ecceda quella supportata dal dispositivo.
Complicazioni varie a parte, sarebbe fattibile?

Sisi ,è fattibilissimo e forse perderesti solo la risoluzione a vantaggio della corrente massima misurabile /sopportabile.

Ricordo di avere qualche documento a riquardo ,proprio della "Allegro" ... se trovo, posto faccine/smile.gif

 

dinoch

Avatar
Watt


Gruppo:Utente
Messaggi:56

Stato:



Inviato il: 8/10/2013,13:21

Sto facendo le varie prove con il sensore non invasivo, ma ho da porti una domanda (ammetto che non sono un programmatore esperto e quindi ho un pò di difficolta). E' normale che quando Arduino lavora ripresenta sempre ciclica la videata che segue?

ERROR
Numero Campionamenti = 1
Tempo conversione = 0 ms
ADCSRA = 148
Tensione RMS = 0 Volt
Valore Sensore Tensione Max = 0
Valore Sensore Tensione Min = 445
Offset Sensore Tensione = 222
Offset Sensore Produzione = 507
Offset Sensore Assorbimento = 507
Potenza Prodotta = 0 Watt
Potenza Prodotta Calcolata= 0 Watt
Potenza Assorbita = 0 Watt
Potenza Assorbita Calcolata = 0 Watt
Corrente Prodotta = 0.00 Amper
Corrente Assorbita = 0.00 Amper

Grazie

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 8/10/2013,14:19

CITAZIONE (dinoch @ 8/10/2013, 14:21)
Sto facendo le varie prove con il sensore non invasivo, ma ho da porti una domanda (ammetto che non sono un programmatore esperto e quindi ho un pò di difficolta). E' normale che quando Arduino lavora ripresenta sempre ciclica la videata che segue?

Nono non è normale !!!
Sono giorni che provo a simulare la tua avaria .... ma niente funziona sempre tutto faccine/sad.gif ...
Quindi ....

Ho paura che sia un problema hardware o un errore ciclico .....

Inizia con questa prova ...

-Carica il codice (senza nessuna modifica)
-Disconnetti il carico
-Premi il pulsante Reset o disconnetti/connetti l'usb
-Vedi cosa ti dice sulla seriale

const int ProdottaPin = A1;
const int AssorbitaPin = A2;
const int TempoCampionatura = 20; //Scegli i ms da Campionare
const float Fattore_Conversione_Corrente = .055;
long start ;
int i ;
float AmperPro;
float AmperAss;
long OffsetPro;
long OffsetAss;
void setup() {

//CALCOLO AUTOMATICO OFFSET SENSORI
for (i = 0 ; i <= 1000 ; i++){
OffsetPro+=analogRead(ProdottaPin);
OffsetAss+=analogRead(AssorbitaPin);
}
OffsetPro/=1000;
OffsetAss/=1000;
//--------------------------------


ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni
Serial.begin(9600) ;

}

void loop() {
AmperPro=0;
AmperAss=0;
int NumCampionamenti=0;
start = millis() ;
do
{
NumCampionamenti++;
AmperPro+= abs(analogRead(ProdottaPin)-OffsetPro);
AmperAss+= abs(analogRead(AssorbitaPin)-OffsetAss);
}while((millis()-start)<TempoCampionatura);
int Tempomisura=millis() - start;

AmperPro=(AmperPro/NumCampionamenti)*Fattore_Conversione_Corrente;
AmperAss=(AmperAss/NumCampionamenti)*Fattore_Conversione_Corrente;

Serial.print ("Numero Campionamenti = ";
Serial.println(NumCampionamenti);
Serial.print ("Tempo conversione = ";
Serial.print(Tempomisura) ;
Serial.println(" ms" ;
Serial.print ("ADCSRA = ";
Serial.println(ADCSRA) ;
Serial.print ("Offset Sensore Produzione = ";
Serial.println(OffsetPro) ;
Serial.print ("Offset Sensore Assorbimento = ";
Serial.println(OffsetAss) ;
Serial.print ("Corrente Prodotta = ";
Serial.print(AmperPro) ;
Serial.println(" Amper" ;
Serial.print ("Corrente Assorbita = ";
Serial.print(AmperAss) ;
Serial.println(" Amper" ;
Serial.println("" ;
Serial.println("" ;
delay(1000);
}


Posta i risultati come hai fatto precedentemente
Ciao

 

dinoch

Avatar
Watt


Gruppo:Utente
Messaggi:56

Stato:



Inviato il: 9/10/2013,08:17

ieri sera mi sono messo a costruire il circuito su un mille fori, non vorrei che la mia Breadboard essendo vecchia ha qualche falso contatto. Appena ho novità ti faccio saxre.

 

5a2v0
Watt


Gruppo:Utente
Messaggi:66

Stato:



Inviato il: 10/10/2013,13:28

posto qui il mio sketch attuale:

CODICE
//Includo la libreria per il corretto funzionamento del display
#include <LiquidCrystal.h>
// Dichiaro i pin del display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Dichiaro il pin a cui sono collegati i bottoni e la variabile in cui viene memorizzato il valore letto dal pin
int buttonPin = A0;
int buttonValue = 0;
//Dichiaro il pin del sensore di corrente e la variabile in cui sarà memorizzato il valore letto dal sensore
int sensorPin = A5;
float sensorValue = 0.00;
//Dichiaro la variabile in cui sarà memorizzato il valore di Ampere totali assorbiti
float ampere = 0.00;
//Variabile per il consumo in watt (ottenuto moltiplicando il valore in Ampere ottenuto dal sensore di corrente per la tensione stabilita di 230v)
float tensione = 230.00;
int consumo = 0;
//Dichiaro i pin del buzzer, dei led e dei relè
int buzzer = 6;
int verde1 = 7;
int verde2 = 8;
int rosso1 = 1;
int rosso2 = 13;
int bagni = 9;
int stanze = 10;
//Dichiaro variabili per memorizzare lo stato (0 o 1) dei relè e dei bottoni
int rele1 = 0;
int rele2 = 0;
int buttonState = 0;
//Variabili per prevenire ritardi ai pulsanti e regolare il refresh del display
#define intervallcd 3000  
long previousMillslcd = 0;
#define interval1 2000  
long previousMills1 = 0;
#define interval2 2000  
long previousMills2 = 0;
//Note di check funzionamento buzzer
int melody[] = {
 4699, 4699};
//Durata delle note: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
 8, 8};


void setup() {
 //Imposto il voltaggio di riferimento per le letture analogiche a 1.10v o lascio 5v se commentato
 //analogReference(INTERNAL);
 //Definisco l'eventuale porta seriale per leggere dati dal monitor seriale N.B. si accenderà fisso il led sul PIN 1 !!!
 //Serial.begin(9600);
 //Inizializzo il display
 lcd.begin(16, 2);
 //Imposto i pin dei led e dei relè come uscite digitali
 pinMode(verde1, OUTPUT);
 pinMode(verde2, OUTPUT);
 pinMode(rosso1, OUTPUT);
 pinMode(rosso2, OUTPUT);
 pinMode(bagni, OUTPUT);
 pinMode(stanze, OUTPUT);
 //Accendo i due led verdi e spengo i due rossi (i relè sono normalmente chiusi e la variabile dei relè è gia impostata a 0 di default all'avvio del programma)
 digitalWrite(verde1, HIGH);
 digitalWrite(verde2, HIGH);
 digitalWrite(rosso1, LOW);
 digitalWrite(rosso2, LOW);
 digitalWrite(bagni, HIGH);
 digitalWrite(stanze, HIGH);
 //Codice di esecuzione delle note di check funzionamento buzzer
 for (int thisNote = 0; thisNote < 2; thisNote++) {
   int noteDuration = 1000/noteDurations[thisNote];
   tone(buzzer, melody[thisNote],noteDuration);
   int pauseBetweenNotes = noteDuration * 1.30;
   delay(pauseBetweenNotes);
   noTone(buzzer);
 }
}


void loop() {
 //Lettura sensore e calcolo Ampere assorbiti e Watt consumati con eventuale distacco automatico in caso di esubero
 sensorValue = analogRead(sensorPin);
 //Il sensore restituisce da 0 a 1v se legge da 0 a 30 Ampere (valore max di lettura) e lo somma al voltaggio reference 5v diviso in 2.
 //Utilizzeremo però 2.49v anzichè 2.50v poichè in lettura senza carico il valore letto oscillava tra 2.48 e 2.50.
 //Per cui abbiamo [ 1.00v : 30 A = (sensorValue - 2.49v) : ampere ] quindi [ ampere = (sensorValue - 2.49) * 30.00 / 1.00 ]
 //Trasformo il valore letto sulla A5 in volt sapendo che 5 è il voltaggio reference e 1024 sono le parti in cui viene suddiviso per la lettura.
 sensorValue = (((5.00 * sensorValue) / 1024.00) - 2.49);
 if (sensorValue < 0) sensorValue = 0;
 ampere = sensorValue * 30.00;
 consumo = ampere * tensione;


 //Lettura pin dei bottoni e azioni di distacco manuale o ripristino della corrente nelle sezioni collegate ai contattori
 buttonValue = analogRead(buttonPin);
 if (millis() -  previousMills1 > interval1 ) {
   previousMills1 = millis();
   if ((buttonValue >= 150) && (buttonValue <= 200)) {
     switch (rele1) {
     case 0:
       if (buttonState == 0) {
         digitalWrite(verde1, LOW);
         digitalWrite(rosso1, HIGH);
         digitalWrite(bagni, LOW);
         rele1 = 1;
         buttonState = 1;
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("Distacco manuale";
         lcd.setCursor(0,1);
         lcd.print("Linea 1 OFF";
       }        
       break;
     case 1:
       if (buttonState == 0) {
         digitalWrite(verde1, HIGH);
         digitalWrite(rosso1, LOW);
         digitalWrite(bagni, HIGH);
         rele1 = 0;
         buttonState = 1;
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("Intervento:";
         lcd.setCursor(0,1);
         lcd.print("Linea 1 ON";
       }
       break;
     }
   }
 }
 if (millis() -  previousMills2 > interval2 ) {
   previousMills2 = millis();
   if ((buttonValue >= 800) && (buttonValue <= 900)) {
     switch (rele2) {
     case 0:
       if (buttonState == 0) {
         digitalWrite(verde2, LOW);
         digitalWrite(rosso2, HIGH);
         digitalWrite(stanze, LOW);
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("Distacco manuale";
         lcd.setCursor(0,1);
         lcd.print("Linea 2 OFF";
         rele2 = 1;
         buttonState = 1;
       }
       break;
     case 1:
       if (buttonState == 0) {
         digitalWrite(verde2, HIGH);
         digitalWrite(rosso2, LOW);
         digitalWrite(stanze, HIGH);
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("Intervento:";
         lcd.setCursor(0,1);
         lcd.print("Linea 2 ON";
         rele2 = 0;
         buttonState = 1;
       }
       break;
     }
   }
 }
 if ((buttonValue >= 0) && (buttonValue <= 100)) {
   if (millis() -  previousMillslcd > intervallcd ) {
     previousMillslcd = millis();
     lcd.clear();
   }
   lcd.setCursor(0,0);
   if ((rele1 == 0) && (rele2 == 0)) {
     lcd.print("Linee ON";
   }
   if ((rele1 == 0)  && (rele2 == 1)) {
     lcd.print("L1 ON   L2 OFF";
   }
   if ((rele1 == 1)  && (rele2 == 0)) {
     lcd.print("L1 OFF  L2 ON";
   }
   if ((rele1 == 1)  && (rele2 == 1)) {
     lcd.print("Linee OFF";
   }
   lcd.setCursor(0,1);
   lcd.print("Watt: ";
   lcd.setCursor(7,1);
   lcd.print(consumo);
   buttonState = 0;
 }
 //riga utilizzata per calibrare il sensore e i bottoni
 //Serial.println(sensorValue);
}


arduino collegato ai led, ai pulsanti, alla scheda relè e al sensore.

Senza carico leggo 0 Watt... in attesa ancora di testare con un carico conosciuto come una lampadina ad incandescenza per verificare l'attendibilità del codice e del sensore.

Poi se il valore è giusto (lo confronterò anche con misurazioni ottenute con qualche altro strumento), rimane di creare un sistema che legga bene i valori e non mi stacchi la corrente già per un picco ma solo per un consumo costante O.o

Intanto testerò se il valore viene letto bene...

P.s. ho provato anche un altra strada, ovvero quella di settare l'analogReference a (INTERNAL) in modo che arduino scomponesse in 1024 parti il voltaggio di 1.10v al posto dei 5v come DEFAULT ed avere una lettura così più precisa del sensore collegandolo DIRETTAMENTE alla porta analogica senza passare per lo schema attuale che è questo:
http://openenergymonitor.org/emon/sites/default/files/current.png

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 10/10/2013,13:55

Il tuo codice è adatto per correnti continue .
Il sensore ti restituirà una tensione variabile nella stessa forma della corrente che misura quindi variabile ed alternata.
È per questo che viene aggiunto l'offset ....

Ciao
ElettroshockNow

Ps: se ti interessa solo la corrente puoi usare le linee di codice postate nel mio ultimo intervento, magari togliento la regolazione dell'offset in quanto già lo hai misurato.

Ulteriori info sulla misurazione di potenze alternate le puoi trovare qui
Nella quale discussione vengono presi in esame (con codici Arduino) due metodi di misurazione.

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 10/10/2013,15:06

Segue il codice per la lettura di correnti alternate

CITAZIONE
ampere=0;
int NumCampionamenti=0;
long start = millis() ;
do
{
NumCampionamenti++;
ampere+= abs(analogRead(sensorPin)-510); //510 è la lettura senza carico quindi l'offset
}while((millis()-start)<20); // 20 sono i millisecondi che verranno campionati
ampere=(ampere/NumCampionamenti)* .55; // .55 è il fattore di conversione
consumo = ampere * tensione;

Per far funzionare bene il codice appena postato bisogna aggiungere nel setup

CITAZIONE
ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni

Ciao
ElettroshockNow

 

mi156
milliWatt


Gruppo:Utente
Messaggi:10

Stato:



Inviato il: 11/10/2013,04:34

CITAZIONE (ElettroshockNow @ 12/9/2013, 19:30)
Allego inoltre la liquidcristal che uso

SALVE IL CODICE MI DA DEI PROBLEMI

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 11/10/2013,05:47

CITAZIONE (mi156 @ 11/10/2013, 05:34)
SALVE IL CODICE MI DA DEI PROBLEMI

Ciao mii157,
volevo informarti che hai il tasto Maiuscolo inserito , sembra quasi che urli faccine/huh.gif ..

Cmq anche se il progetto in questione illude di essere di facile realizzazione ,in realtà non lo è ,almeno che non usi gli stessi identici hardware.
Quindi ti consiglio di iniziare con progetti più semplici e fare esperienza sull'uso dei display LCD ,in quanto credo che sia li' il problema da te riscontrato .

Giusto a titolo informativo nel codice trovi una sezione chiamata "setup" nella quale vengono impostati i parametri hardware ....
Esempio :
Il mio display deve essere settato :LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
invece quello di 5a2v0 :LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


Ciao
ElettroshockNow

PS: il progetto powermeter funziona ininterrottamente da 8 mesi ... tranne quel breve periodo del Boom faccine/sad.gif ( A proposito devo un Grazie ad Elia per la pacca sulla spalla , GRAZIE ELIA )

 

5a2v0
Watt


Gruppo:Utente
Messaggi:66

Stato:



Inviato il: 11/10/2013,07:53

CITAZIONE (ElettroshockNow @ 10/10/2013, 16:06)
Segue il codice per la lettura di correnti alternate
CITAZIONE
ampere=0;
int NumCampionamenti=0;
long start = millis() ;
do
{
NumCampionamenti++;
ampere+= abs(analogRead(sensorPin)-510); //510 è la lettura senza carico quindi l'offset
}while((millis()-start)<20); // 20 sono i millisecondi che verranno campionati
ampere=(ampere/NumCampionamenti)* .55; // .55 è il fattore di conversione
consumo = ampere * tensione;

Per far funzionare bene il codice appena postato bisogna aggiungere nel setup

CITAZIONE
ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni

Ciao
ElettroshockNow

Buondi.. intanto grazie come semprre faccine/smile.gif

stamattina ho provato prima il codice mio collegando una lampadina da 20watt ma arduino sembrava non leggere proprio il valore... poi un PHON e il valore saliva ma ogni tanto il sensore leggeva addirittura un voltaggio INFERIORE all'offset O.o...

dando quindi per scontato che il problema potesse essere come mi avevi detto tu che il mio codice è adatto per le CC e non per le AC, ho seguito il tuo suggerimento e inserito il tuo codice al posto del mio:

CODICE
//Lettura sensore e calcolo Ampere assorbiti e Watt consumati con eventuale distacco automatico in caso di esubero
 sensorValue = analogRead(sensorPin);
 //Il sensore restituisce da 0 a 1v se legge da 0 a 30 Ampere (valore max di lettura) e lo somma al voltaggio reference 5v diviso in 2.
 //Utilizzeremo però 2.49v anzichè 2.50v poichè in lettura senza carico il valore letto oscillava tra 2.48 e 2.50.
 //Per cui abbiamo [ 1.00v : 30 A = (sensorValue - 2.49v) : ampere ] quindi [ ampere = (sensorValue - 2.49) * 30.00 / 1.00 ]
 //Trasformo il valore letto sulla A5 in volt sapendo che 5 è il voltaggio reference e 1024 sono le parti in cui viene suddiviso per la lettura.
 sensorValue = (((5.00 * sensorValue) / 1024.00) - 2.49);
 if (sensorValue < 0) sensorValue = 0;
 ampere = sensorValue * 30.00;
 consumo = ampere * tensione;


ovviamente ho aggiunto anche la riga che mi dicevi di mettere nel void setup () !

Situazione attuale:
Arduino senza carico mi dice che consumo 250watt.
Quando collego e accendo un phon da 1800watt totali messo a metà potenza mi dice 1800(circa eh, l'lcd refresha senza che leggo il valore bene)
Quando alzo la potenza del phon al suo max legge 3500
Quando spengo, ritorna a 250.

Che può essere ?

 
 InizioPagina
 

Pagine: (18)   1   2   3   4   5   [6]   7   8   9   10   11   12   13   14   15   16   17   18    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum