Go Down

Topic: Problema sketch monitoraggio contatore Enel e fotovoltaico (Read 10 times) previous topic - next topic

PaoloP

Tempo di risposta elevato vuol dire 100/200ms come il tempo la lettura dell'analogRead. Se salti conteggi alla frequenza di 50 impulsi al minuto il problema è forse da un'altra parte.
Verifica la durata del ciclo loop e che non ci siano blocchi nelle funzioni della SD o della Ethernet.

ankamacha

qual'è il cavo migliore per collegare una fotoresistenza in un progetto di questo tipo?  che sezione dovrebbe avere?
forse il cavo che utilizzo ha una sezione troppo grande, potrebbe essere questo la causa della perdita del 5% di impulsi?

lesto


Tempo di risposta elevato vuol dire 100/200ms come il tempo la lettura dell'analogRead. Se salti conteggi alla frequenza di 50 impulsi al minuto il problema è forse da un'altra parte.
Verifica la durata del ciclo loop e che non ci siano blocchi nelle funzioni della SD o della Ethernet.


l'analog read dura circa 100 MICROsec(us), non MILLIsec(ms), quindi 0.1ms o 0.0001secondi
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

flz47655

Quote
Ho notato un discostamento tra il rilevato da Arduino e il contatore Enel non trascurabile (circa il 5 %) . Come potrei fare per ridurre questo errore? Si parlava di usare al posto di una fotoresistenza un fototransistor. Con un fotodiodo potrei fare lo stesso? Se si, mi date qualche dritta per modificare lo sketch?


Ciao, come hai fatto a notare lo scostamento? Il contatore se non sbaglio segna solamente i KWh nelle varie fasce (F1,F2,F3) troncando i decimali, esempio se hai consumato 5.9kWh mostra a display ancora 5 kWh, sarà dura fare un confronto più preciso a meno che non azzecchi il momento preciso in cui parte il nuovo kWh.

I fototransistor sono principalmente per lo spettro IR (infra rosso) quindi non vanno bene a meno che non ne usi di speciali, i fotodiodi sono in genere per applicazioni dove veramente serve la velocità (fibra ottica, lettori CD, etc..), se hai 2-3 lampeggi al secondo non c'è bisogno di qualcosa di più veloce di una fotoresistenza con una soglia corretta. Più lampeggi non credo a meno che non hai un contratto particolare da più di 12 kWh  ]:D

Ciao

ankamacha

Si hai ragione, le 3 fasce del contatore Enel non permettono di visualizzare la cifra dopo la virgola, però analizzando i dati su un arco di tempo di più giorni è possibile rendersi conto dello scostamento facendo un totale.  Ho fatto 2 test sulla soglia: un giorno con theresold a 450, il giorno successivo con theresold 800 quindi meno sensibilità della fotoresistenza alla luce.. i discostamenti sembravano gli stessi anche confrontandoli con la lettura più precisa dell' inverter

flz47655

Supponiamo che quando inizi la misura ti segni i numeri del contatore:
A1=A2=A3=999 kWH
Ma che in realtà sono tutti a 999.9 kWH, appena consumi 100W in tutte le tre fasce hai un errore di quasi 3kWH
Considerando che quando finisci la misura puoi avere una situazione analoga dove te hai segnato ad esempio 1200kWH mentre il contatore mostra 1199 (o 1201) su tutte e tre le fasce, hai un altro errore di 3kWH.
Sono situazioni limite ma puoi avere al massimo una misura precisa +-6kWH, valore che in % diminuisce all'aumentare dei consumi

La soglia non rende meno sensibile la fotoresistenza che continua a restituire i soliti valori, semplicemente consideri un lampeggio quando raggiunge certi limiti. Se hai una buona escursione tra led acceso o spento in tutte le condizioni esterne (es. di 500 valori su 1024, ma in realtà anche meno danno una buona certezza) allora puoi stare abbastanza tranquillo.

Dalla prova che hai fatto non hai avuto cambiamenti quindi la soglia direi che va bene e l'errore è da cercarsi nell'approssimazione del contatore.

Ciao

ankamacha

Se volessi utilizzare al posto della fotoresistenza un fototransistor e l'interrupt per il conteggio degli impulsi questo potrebbe andare bene?
http://www.robot-italy.com/it/phototransistor-fairchild-qrd1114.html
Sensore Fototransistor Fairchild QRD1114 

Grazie
Ciao



flz47655

No, come già detto il led del contatore non è infrarosso e non ci vuole un fototransistor per infrarossi

ankamacha

Ho risolto il problema dell'errore di monitoraggio rispetto al misurato Inverter e contatore GSE (5-8% di impulsi in meno). Nelle ore di maggiore produzione vale a dire a circa 40-50 impulsi al minuto, nel momento dell' invio del dato da Arduino al database (ogni minuto) perdevo qualche impulso. Questo errore moltiplicato per n minuti in una giornata mi dava il 5-8% di inpulsi in meno. Disabilitando la SD e inviando i dati solo al database la lettura è precisa. Probabilmente devo verificare la libreria della SD.
Adesso vorrei provare a sfruttare 2 fotoresistenze quindi 2 ingressi analogici per leggere in contemporanea 2 contatori:
quello Enel GSE bidirezionale
e quello Enel classico.
Lesto mi dicevi di modificare il codice di loop come nell'esempio BlinkWithoutDelay ma non ci capisco molto. Mi puoi dare qualche dritta?
Grazie mille

lesto

#39
Mar 19, 2013, 01:41 pm Last Edit: Mar 19, 2013, 01:45 pm by lesto Reason: 1
cosa succede:

nel momento in cui scrivi su SD e/o fai la richiesta GET, NON controlli i lampeggi, che vengono persi. In oltre anche quel delay(10) è molto grande, tempo che si somma al resto.

ciò è risolvibile usando un interrupt per leggere i lampeggi, che incrementa una variabile; poi dove ora fai la lettura del led, invece copierai il valore della variabile e la azzererai.

Quindi in pratica nel loop dove ora leggi il led invece leggerai il numero di volte che il led ha lampeggiato dall'ultima volta che l'hai letto; se ha lampeggiato almeno una volta fai il salvataggio su SD e su server.

edit: anche la scrittura via seriale è molto lenta. A 9600baud, impiegi un secondo per inviare al PC 960 lettere.
Può sembrare che non ti rallenti per via del buffer e del fatto che lavora con gli interrupt e quindi finchè il buffer non è pieno non rallenta più del solito. Ma se riempi il buffer più in fretta di quanto si svuota (ricordo 960 caratteri al secondo), allora quando il buffer è pieno vieni BLOCCATO in attesa di risposta.

Anche quando attendi la risposta dal server hai messo un while che ti blocca per un tempo indefinito. Per ora ti va di fortuna che il server risponde subito, ma quando il DB sarà un pò pieno o il pc impegnato a fare altro, e quindi la risposta impiegherà 10/15ms ad arrivare, saranno altri lampeggi persi (salvo sistema dell'interrupt eh)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ankamacha

grazie lesto,  l' interrupt viene gestito solo sui pin 2-3 digitali?

la fotoresistenza dovrei collegarla su uno di questi 2?

vado ad usare poi CHANGE ? l'interrupt viene eseguito quando avviene un cambiamento di stato sul pin

sto cercando di documentarmi per provare a mettere giù il codice nel modo migliore possibile

grazie per la disponibilità

lesto

l'interrupt change, modificando i registri a basso livello o con librerie esterne, lo puoi usare su qualsiasi pin.

Io ti consiglio di usare però la funzione attachInterrupt() che come hai visto ti obbliga all'uso dei pin 2 e/o 3, però la userei sul RAISNG o sul FALLING  per il motivo che se la usi sul CHANGE, rilevi sia accensione che spegnimeto, cosa inutile.
con il RISING, conteresti le accensioni del led (ok), però è probabile che ti ritrovi l'effetto "rimbalzo"; nel loop() lo hai aggirato con il delay, ma con gli interrupt non puoi. Però puoi usare la millis(), che però è "congelata", overo all'interno dell'interrupt NON cambia valore.

Quindi all'interrupt prendi il valore di una variabile ad esempio old_millis, e la confronti con il valore della millis(); se la differenza è > 10, allora incrementi una variabile (di tipo "volatile byte", il volatile è perchè è usata sia dal loop che dall'interrupt) di uno, e alla fine assegni ad old_millis il valore di millis attuale, in modo da avere un "antirimbalzo" di 10 ms

nel loop leggi il valore della variabile volatile e la assegni ad una variabile temporanea, e azzeri la volatile.
Ora nella temporanea hai il numero di lampeggi (da 0 a 255), e salvi il valore su SD e/o su database come hai sempre fatto.

kiss
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie


lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

pablos

Ahhahah non lo conoscevo questo acronimo usato nell'informatica che sta per Keep It Simple, Stupid, ossia "rimani sul semplice, stupido"
allora kiss kiss a tutti :)
no comment

Go Up