| 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 12/10/2013,09:41
|
nono, completamente chiuso. Devo provare con una lampadina da 100watt se la trovo cosi da vedere se legge bene il valore anche di quella con lo stesso fattore di conversione.
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 12/10/2013,15:13
|
CITAZIONE (ElettroshockNow @ 12/10/2013, 10:02) Così differente !!!! Pensavo che al massimo avevamo un 10% di differrenza .. È inutile che ti dica di controllare che il sensore sia ben chiuso ..... a me inizialmente mi era sfuggito aperto . Ciao mmmm... nono non va comunque il tutto.. collegando una lampada a incandescenza da 60 watt mi segnala 90 watt poi !!! ci deve essere qualcosa che non va... tu hai trovato qualche soluzione ?
| | | | ElettroshockNow
| Inviato il: 12/10/2013,15:44
|
CITAZIONE (5a2v0 @ 12/10/2013, 16:13) ci deve essere qualcosa che non va... tu hai trovato qualche soluzione ? No ...... Per ora ho aumentato il tempo campionato da 20mS a 200mS e non ho ridotto il prescaler, lasciandolo al valore originale ed ho tarato il tutto con un assorbimento di 3Kw. Cosi' ho parzialmente tamponato ,ma bisogna trovare una soluzione per l'uso di questi sensori.
Stavo leggendo il codice segnalato da Elia ,forse li' c'è la soluzione definitiva .
Ciao
Ps: vorrei dire W gli ACS ...... ma ho paura .....
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 12/10/2013,20:24
|
allora... solo ora grazie all'accortezza di un amico sono riuscito a risolvere in parte il problema...
io ho il sensore sct-013-030 (30 ampere) e non il sct-013-000 (100 ampere) !!!
Cosa cambia ? guardando il datasheet, il sensore da 100 (che usano su openenergy) NON HA nessuna resistenza interna quindi io avevo usato le formule di openenergy e mi ero calcolato una resistenza da 105ohm da mettere tra il sensore e la porta analogica !!!
Il sensore da 30ampere mio invece ha già all'interno una res. da 62ohm !!!
Per cui avendo già la resistenza ed essendo quindi (si suppone) tarato per dare a 0 a 1v per la lettura da 0 a 30 ampere, io sfalsavo i parametri avendo un altra resistenza sul circuito !!!
Scollegata quella e impostato 0.166 come fattore di conversione (non poi così lontano dal tuo 0.108) riesco a leggere: - 24watt per la lampada da 25; - 57watt per la lampada da 60; - 84 se entrambe sono accese !!!
Che sia un punto di svolta ?
| | | | ElettroshockNow
| Inviato il: 12/10/2013,21:24
|
CITAZIONE (5a2v0 @ 12/10/2013, 21:24) Che sia un punto di svolta ? Lo spero ... cmq i risultati sono molto incoraggianti . Quindi la resistenza di shunt è già integrata nel sensore ? ..... io ci son cascato con tutte le scarpe aggiungendone un'altra da 100ohm ..... Grazie Ps: appena posso metto tutto sotto torchio ..... analizzo tutto sull'oscilloscopio e poi voglio vedere l'onda che vede Arduino ...... Molti test li ho eseguiti con un Mega (quindi un Atmega2560) e senza troppe preoccupazioni li ho trasferiti sull'uno ..... Forse i due convertitori A/D si comportano diversamente quando si modifica la velocità di conversione ..... Bisogna testare
Ciao e nuovamente grazie ElettroshockNow
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 13/10/2013,12:30
|
datasheeets: - modello 30 A - modello 100 A
Io i valori che ho letto ieri li ho ottenuti lasciando sempre 20ms e con la stringa che aumenta la velocità...dovrei provare a mettere 200ms e commentare la riga e appena provo ti faccio sapere le letture...
bye
P.s. giusto per non fare copia incolla di un valore, per cercare di capire... il tuo valore 0.055 che usavi con ACS e 0.108 usato con il tuo SCT, lo hai in qualche modo calcolato o lo hai ottenuto leggendo un carico noto e ricavandoti quindi il fattore di conversione ?
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 13/10/2013,19:20
|
se imposto come te 200ms di tempo e levo l'impostazione del prescaler, senza carico mi segna 36 anzichè 0 però la lampada da 25 appena accesa poi mi dice 30 e quella da 60 mi dice qualcosa piu'.... insieme accese mi danno 87 !!!!
Ma xkè 36 senza carico O.o
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 14/10/2013,16:27
|
mi rispondo da solo in quanto mi è capitato di leggere questo valore anche con il prescaler impostato a 16mhz.
In pratica, ogni tanto in base a cosa non so, anzichè leggere 508 senza carichi, l'arduino mi legge 509 !!! In questo caso quell' 1 in più moltiplicato 0.166 (fattore di conversione) e poi per 230 (tensione) mi restituisce quel consumo.
La cosa positiva è che se in quel momento accendo la lampada da 25 o da 60 o entrambe, non mi sballa la lettura sommando le lampade al valore letto già senza carico ma mi riporta solo il valore delle lampade !!!
Quindi a questo punto in realtà nel mio caso forse cambia poco tra lasciare il prescaler a default o portarlo a 16mhz !!!
Farò un po di prove e vi faccio sapere...
| | | | 5a2v0
Watt Gruppo:Utente Messaggi:66
Stato:
| Inviato il: 14/10/2013,20:24
|
Allego attuale sketch:
CITAZIONE //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, la variabile in cui sarà memorizzato il valore letto dal sensore e una variabile per il test del sensore int sensorPin = A5; float sensorValue = 0.00; int sensorTest = 0; //Dichiaro il valore dell'offset, ovvero il valore letto da arduino sulla porta del sensore in assenza di carico #define sensorOffset 510 //Dichiaro le variabili in cui sarà memorizzato il valore di ampere totali assorbiti ed il numero di letture effettuate float ampere = 0.00; int numeroCampionamenti = 0; long inizioCampionamenti = 0; //Dichiaro la variabile della tensione stabilita a 230V float tensione = 230.00; //Dichiaro la variabile per il calcolo del consumo in watt 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 unsigned long previousMillslcd = 0; #define interval1 2000 unsigned long previousMills1 = 0; #define interval2 2000 unsigned long previousMills2 = 0;
void setup() { //Setta ADC prescaler a 16 Mhz cambiando quindi la velocita delle letture analogiche ADCSRA&=0X90+ 0b100; //Definisco la porta seriale per leggere dati dal monitor seriale. NB: causa l'accensione del led sul PIN 1 //Serial.begin(9600); //Inizializzo il display lcd.begin(16, 2); //Imposto i pin dei led, del buzzer e dei relè come uscite digitali pinMode(verde1, OUTPUT); pinMode(verde2, OUTPUT); pinMode(rosso1, OUTPUT); pinMode(rosso2, OUTPUT); pinMode(bagni, OUTPUT); pinMode(stanze, OUTPUT); pinMode(buzzer, OUTPUT); //Accendo i due led verdi e tengo spenti i due rossi digitalWrite(verde1, HIGH); digitalWrite(verde2, HIGH); digitalWrite(rosso1, LOW); digitalWrite(rosso2, LOW); //I relè sono normalmente chiusi e con HIGH la bobina non viene eccitata digitalWrite(bagni, HIGH); digitalWrite(stanze, HIGH); }
void loop() { //Eseguo solo una volta all'accensione delle letture a vuoto per l'assestamento dei valori ottenuti dal sensore di corrente if (sensorTest == 0) { do { sensorValue = analogRead(sensorPin); lcd.setCursor(0,0); lcd.print("Check in corso..."); lcd.setCursor(0,1); //Calcolo e scrivo una percentuale sul display in relazione alla seguente equazione //sensorOffset : 100% = sensorValue : x % sensorTest = (sensorValue / sensorOffset) * 100; lcd.print(sensorTest); lcd.print("% "); //Riga utilizzata per leggere il valore senza carico in fase di programmazione //lcd.print(sensorValue); //Se il sensore legge prima dei 10 secondi il giusto valore di offset, accorcia l'attesa e parte con il vero loop if (sensorValue == sensorOffset) { lcd.clear(); break; } } //Sono necessari circa 10 secondi affinchè l'alimentazione e i condensatori forniscano un valore stabile alla linea 5v usata dal sensore while(millis() < 10000); sensorTest = 1; //Note di fine check e test funzionamento buzzer tone(buzzer, 4699, 125); delay(160); noTone(buzzer); tone(buzzer, 4699, 125); delay(160); noTone(buzzer); }
//Lettura dati del sensore e calcolo della corrente assorbita e del consumo in watt ampere = 0.00; numeroCampionamenti = 0; inizioCampionamenti = millis() ; do { numeroCampionamenti++; //sensorOffset è la lettura senza carico quindi l'offset e lo sottraiamo alle letture sensorValue = (analogRead(sensorPin) - sensorOffset); //Alcune letture potrebbero avere valore negativo per cui noi consideriamo il valore assoluto ampere+= abs(sensorValue); } //20 sono i millisecondi che verranno campionati while((millis() - inizioCampionamenti) < 20); //Per ottenere gli ampere reali moltiplichiamo la media di ampere letti nei 20ms per 0.166 che è il fattore di conversione ampere=(ampere / numeroCampionamenti) * 0.166; //Infine moltiplichiamo gli ampere per la tensione stabilita per ottenere il consumo in Watt consumo = ampere * tensione; //Per evitare letture negative in assenza di carico if (consumo < 0) consumo = 0;
//Lettura pin dei bottoni e azioni di distacco manuale o ripristino della corrente tramite i relè buttonValue = analogRead(buttonPin); if (millis() - previousMills1 > interval1 ) { previousMills1 = millis(); //Codice che viene eseguito per il bottone relativo alla linea "bagni" if ((buttonValue >= 150) && (buttonValue <= 200)) { switch (rele1) { //Se rele1 == 0 e viene premuto il bottone, bisogna accendere il relativo led rosso, spegnere il verde ed eccitare la bobina del relè case 0: //Il codice viene eseguito solo se il bottone nel precedente loop non era già premuto così da doverlo lasciare e ripremere per eseguire un'altra azione if (buttonState == 0) { digitalWrite(verde1, LOW); digitalWrite(rosso1, HIGH); digitalWrite(bagni, LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print("Distacco manuale"); lcd.setCursor(0,1); lcd.print("Linea 1 OFF"); analogWrite(buzzer, 20); delay(1000); analogWrite(buzzer, 0); //Cambio lo stato del relè e specifico che il bottone è attualmente premuto rele1 = 1; buttonState = 1; } break; //Se rele1 == 1 e viene premuto il bottone, bisogna accendere il relativo led verde, spegnere il rosso e diseccitare la bobina del relè case 1: //Il codice viene eseguito solo se il bottone nel precedente loop non era già premuto così da doverlo lasciare e ripremere per eseguire un'altra azione if (buttonState == 0) { digitalWrite(verde1, HIGH); digitalWrite(rosso1, LOW); digitalWrite(bagni, HIGH); lcd.clear(); lcd.setCursor(0,0); lcd.print("Intervento:"); lcd.setCursor(0,1); lcd.print("Linea 1 ON"); tone(buzzer, 4699, 125); delay(160); noTone(buzzer); tone(buzzer, 4699, 125); delay(160); noTone(buzzer); //Resetto lo stato del relè e specifico che il bottone è attualmente premuto rele1 = 0; buttonState = 1; } break; } } } if (millis() - previousMills2 > interval2 ) { previousMills2 = millis(); if ((buttonValue >= 800) && (buttonValue <= 900)) { switch (rele2) { //Se rele2 == 0 e viene premuto il bottone, bisogna accendere il relativo led rosso, spegnere il verde ed eccitare la bobina del relè case 0: //Il codice viene eseguito solo se il bottone nel precedente loop non era già premuto così da doverlo lasciare e ripremere per eseguire un'altra azione 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"); analogWrite(buzzer, 20); delay(1000); analogWrite(buzzer, 0); //Cambio lo stato del relè e specifico che il bottone è attualmente premuto rele2 = 1; buttonState = 1; } break; //Se rele2 == 1 e viene premuto il bottone, bisogna accendere il relativo led verde, spegnere il rosso e diseccitare la bobina del relè case 1: //Il codice viene eseguito solo se il bottone nel precedente loop non era già premuto così da doverlo lasciare e ripremere per eseguire un'altra azione 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"); tone(buzzer, 4699, 125); delay(160); noTone(buzzer); tone(buzzer, 4699, 125); delay(160); noTone(buzzer); //Resetto lo stato del relè e specifico che il bottone è attualmente premuto rele2 = 0; buttonState = 1; } break; } } } //Codice da eseguire ad ogni loop mentre nessun bottone è premuto per aggiornare lo stato delle linee ed il consumo in watt if ((buttonValue >= 0) && (buttonValue <= 100)) { if (millis() - previousMillslcd > intervallcd ) { previousMillslcd = millis(); lcd.clear(); lcd.setCursor(0,1); lcd.print("Watt: "); lcd.setCursor(7,1); lcd.print(consumo); } //In base allo stato delle variabili rele1 e rele2, scrivo sul display l'attuale stato delle linee 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"); } //Specifico che nessun bottone è premuto così da rendere possibili gli interventi sulle linee buttonState = 0; } }
| | | | | | | ElettroshockNow
| Inviato il: 24/10/2013,18:34
|
CITAZIONE (5a2v0 @ 23/10/2013, 16:51) ElettroshockNow hai fatto altri boom ? non ti si legge + !!! Ho perso il sincronismo con il tempo .
Devo chiudere delle cose in sospeso e torno per miglirare la lettura dell'SCT ...... per ora il mio powermeter lavora ,anche se non soddisfa minimamente i miei requisiti ....
Ciao ElettroshockNow
PS:Ti consiglio di aprire una discussione per il tuo progetto,in quanto merita un suo palco .
| | | | prius2008
| Inviato il: 9/11/2013,12:13
|
Ciao ragazzi.......una domanda forse stupida.....dovrei misurare i watt prodotti dai pannelli fotovoltaici e anche i watt che consuma l'inverter. è possibile con un bel display? O con due. Il mio, è un impianto a 24v e ho a disposizione due shunt da 150A/ 75mv. Grazie in anticipo!
--------------- 8 kwp di pannelli disposti a sud con inclinazione di 41 gradi. 3kw di pannelli a sud inclinazione 25 gradi. n°4 regolatori da 60A mppt collegati in parallelo. Inverter ibrido 48v 5KW Mppt per casa. 4 pacchi Lifepo4 da 105ah con relativo bms ed equalizzatore in parallelo. Inverter ibrido Pwm 48v 5Kw per ricarica auto elettrica.
| | | | Daniele Idrogeno
milliWatt Gruppo:Utente Messaggi:2
Stato:
| Inviato il: 16/11/2013,18:01
|
B.sera a tutti. Mi chiamo Daniele è sono appassionato dall' elettronica. seguo molto le vostre discussioni che trovo interessanti. Ora sto trovando interessante arduino e in particolar modo il progetto di Elettroshock e a cui vorrei fargli una domanda. Io sto facendo un circuito fatto dal signor Marco Plessi. La mia domanda è posso interfacciare entrambi i progetti? Se si come potrei fare? Grazie a tutti voi anticipante
http://www.tecnovolt.altervista.org/index....tro-con-arduino A scusate ho dimanticato il disegno del progetto che vorrei interfacciare.
Modificato da ElettroshockNow - 16/11/2013, 20:37
| | | | ElettroshockNow
| Inviato il: 16/11/2013,20:44
|
Ciao Daniele, interessante progetto ,ma aimè per fonderlo con il mio ben più semplice realizzazione, bisognerebbe stravolgere il codice . Il motivo è perchè vengono usati interrupt nella libreria FreqPeriod che contrasterebbero con il flusso del mio programma .
Ciao ElettroshockNow
| | | |
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|