• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
python salvataggio con dati e monitoraggio

Monitoraggio e salvataggio dati con python
#21
Buongiorno a tutti.
Ho un piccolo quesito da porvi.
Attraverso lo strumento Victron BMV702, faccio il monitoraggio delle batterie, collegate al mio impianto fotovoltaico. Rilevo i valore della corrente (positiva e negativa) tramite arduino, che a sua volta è collegato a raspberry. Nello sketch che ho creato, vorrei rilevare le correnti di cui sopra, per poi calcolare potenza ed energia da inserire in metern.
Ho cercato molto in questi giorni di quarantena forzata, sul web, ma non ho trovato niente che mi potesse aiutare a realizzare questa idea.
Secondo le vostre competenze ha senso una cosa del genere?:
poniamo che la corrente delle batterie sia
A = myData[9:lun]
per determinare se la corrente delle batterie è positiva o negativa posso scrivere
cpos = A>0
cneg = A<0
Scusate la mia ignoranza ma le mie conoscenze di python sono molto limitate. Sto cercando di imparare , ma vedo che non è semplice.
Grazie per le vostre eventuali cortesi risposte.
Buona giornata.
Risposta
#22
Se arduino restituisce oltre al valore anche il segno positivo o negativo del verso della corrente circolante, allora quanto da te scritto va bene, inserito in un ciclo di "if".
Esempio:

Codice:
if A > 0
   c = positivo
else
   c = negativo

c è una variabile qualsiasi che potrebbe essere 1 (TRUE) se A > 0 oppure 0 (FALSE) se A < 0
Risposta
#23
Grazie ippogrifo per la risposta.
Mi sono dimenticato di specificare che il valore della corrente, positivo o negativo che sia, lo dovrei moltiplicare per la tensione delle batterie per calcolare la potenza (di ricarica o di scarica). Quindi quei due valori li devo identificare non con vero o falso ma con un numero/lettera es.:
ppos = tensione *cpos
pneg = tensione*cneg
Grazie.
Risposta
#24
La potenza elettrica, uso domestico, si calcola con la formula P = V*I. Perchè uso domestico? A livello industriale, dove vi sono carichi che sfasano tra loro tensione e corrente viene inserito il moltiplicatore "cos fi".
Nel tuo caso, mi sembra di capire, la corrente ha già un segno quindi non vedo alcun problema nel trasformare la funzione precedente in:

Codice:
A = myData[9:lun]
if A > 0
   ppos = tensione *A
else
   pneg = tensione*A

ppos e pneg potranno essere variabili locali alla funzione o generali.

Il problema, a mio avviso, è un altro, cosa ci fai con queste due variabili? Con quali tempistiche effettui le misurazioni? Vi sarà un rapporto con i KW/h?
Risposta
#25
Per la precisione: trattandosi di batterie si parla di corrente continua, quindi tra tensione e corrente non vi è alcuno sfasamento; mentre in corrente alternata la potenza viene calcolata come V*I*cosϕ, dove ϕ, per l'appunto, è l'angolo di sfasamento tra V ed I.
Lo strumento Victron BMV702 restituisce, tramite arduino ogni 6 sec., un valore di corrente positivo (senza segno) o un valore negativo (con segno meno), con cui posso calcolare la potenza in ricarica dai pannelli fotovoltaici, oppure la potenza in scarica, quando i pannelli non producono o quando il sole non è sufficientte per alimentare da solo il carico.
Per calcolare l'energia di ricarica o di scarica, moltiplico la potenza per 6"/3600 (kWh). So bene che non c'è una gran precisione, ma a me va già bene così.
Grazie per la tua risposta, ippogrifo.
A presto.










.
Risposta
#26
(23/03/2020, 14:13)ippogrifo Ha scritto: La potenza elettrica, uso domestico, si calcola con la formula P = V*I. Perchè uso domestico? A livello industriale, dove vi sono carichi che sfasano tra loro tensione e corrente viene inserito il moltiplicatore "cos fi".
Nel tuo caso, mi sembra di capire, la corrente ha già un segno quindi non vedo alcun problema nel trasformare la funzione precedente in:

Codice:
A = myData[9:lun]
if A > 0
  ppos = tensione *A
else
  pneg = tensione*A

ppos e pneg potranno essere variabili locali alla funzione o generali.

Il problema, a mio avviso, è un altro, cosa ci fai con queste due variabili? Con quali tempistiche effettui le misurazioni? Vi  sarà un rapporto con i KW/h?

Dopo vari tentativi, ho, purtroppo, constato che la cosa non funziona. Infatti, i segni > e< non sono operatori e restituiscono solo "true" o "false", percui non si possono usare per fare operazioni. Il prodotto ppos o pneg risultano sempre uguali alla tensione (true=1 e false=0). Huh
Risposta
#27
Il segno maggiore e minore sono operatori logici e restuiscono vero o falso; non eseguono alcuna operazione se non quella logica di confronto. Ad esempio, ipotizziama che A = 15 (ampere):
la prima istruzione "if A > 0" è vera perchè 15 è maggiore di 0, allora per assegnare un valore a ppos moltiplica la tensione per A (quindi 48V (valore casuale) x 15 Ampere = xxxxxx). Se la condizione non è vera, cioè A = -15 (ampere) (A < 0), allora per assegnare un valore a pneg moltiplica la tensione per -A (quindi 48V (valore casuale) x -15 Ampere = -xxxxxx.

P.S.
Verifica che "A = myData[9:lun]" non assegni ad A il valore numerico 1, per cui il prodotto di tensione * A darà sempre come risultato il valore di tensione
Ho omesso i due punti dopo l'istruzione "if A > 0" e "else" pensando alla logica e non alla sintassi.
I due punti in python sono necessari, quindi:
if A > 0:
ppos = tensione * A
else:
pneg = tensione * A
Risposta
#28
Ciao ippogrifo.
Ho riprovato ancora, con gli stessi esiti. Il valore della corrente è giusto, ma il risultato è quello che ti ho detto nel mio post precedente e mi sono accorto della mancanza dei ":" nei comandi. Grazie per l'aiuto.
Risposta
#29
Per verificare se le operazioni sono corrette, assegna ad A un valore intero qualsiasi, sostituendolo momentaneamente ad "A = myData[9:lun]".
L'operazione di slicing (9:lun) è una operazione che si applica alle stringhe o array, la restituzione potrebbe essere non un intero ma dei caratteri/byte che rappresentano un'intero.
Un esempio:
1 come carattere è rappresentato nel codice ascii in esadecimale come 31 e in decimale come 49; in binario: 0011 0001.
1 come "quantità" è un intero e non può essere rappresentato in ascii; in binario: 0000 0001.
La differernza è importante: non è possibile la moltiplicazione di un carattere (stringa) per un intero, e l'interprete dovrebbe segnalare l'errore.
Ipotizzando A = 10, come stringa sarebbe la composizione di due caratter/bytei 1 e 0, cioè 31 (00110001) e 30 (00110000) in esadecimale, 49 e 48 in decimale. Come un intero, in binario sarebbe un solo byte: 0000 1010, in esadecimale: 0A; in decimale non è rappresentabile.
Se così fosse prova a convertire la stringa "myData[9:lun]" in un intero o float:
A=int (o float)myData[9:lun]
Risposta
#30
Ciao ippogrifo.
Oggi ho riprovato ancora, dopo avere apportato alcune modifiche, ma senza successo.
Questo è il file python che sto usando per monitorare le batterie, collegate all'impianto fotovoltaico, su metern:
Codice:
import serial
arduinoSerialData = serial.Serial('/dev/ttyUSB1',19200)
metern8 = 8
metern9 = 9
metern10 = 10
metern11 = 11
metern12 = 12
file1 = '/dev/shm/metern8.txt'
file2 = '/dev/shm/metern9.txt'
file3 = '/dev/shm/metern10.txt'
file4 = '/dev/shm/metern11.txt'
file5 = '/dev/shm/metern12.txt'
counterpos = 0
counterneg = 0
foldpos = open('/dev/shm/consumi11.txt','r')
foldneg = open('/dev/shm/consumi12.txt','r')
datopos = foldpos.read()
c1 = datopos.find('(') + 1
c2 = datopos.find('*')
counterpos = int(datopos[c1:c2])
datoneg = foldneg.read()
d1 = datoneg.find('(') + 1
d2 = datoneg.find('*')
counterneg = int(datoneg[d1:d2])
while True:
   myData = arduinoSerialData.readline()
   counterpos += 1
   counterneg += 1
   lun = len(myData)
   v = float(myData[0:5])
   c = float(myData[5:9])
   i = float(myData[9:lun])
   k = 0.001
   j = 0.1
   V = (float(v)*k)
   soc = (float(c)*j)
   I = (float(i)*k)
if I>0:
   Ppos = V*I
else:
   Pneg = V*I
   bmv702v = str(metern8) + '(' + str(V) + '*V)'
   bmv702s = str(metern9) + '(' + str(soc) + '*soc)'
   bmv702i = str(metern10) + '(' + str(I) + '*A)'
   energypos = str(metern11) + '(' + str(counterpos) + '*Wh)\n'
   powerpos = str(metern11) + '(' + str(Ppos) +'*W)\n'
   energyneg = str(metern12) + '(' + str(counterneg) + '*Wh)\n
   powerneg = str(metern12) + '(' + str(Pneg) +'*W)\n'
   fp = open(file1,'w')
   fp.write(bmv702v)
   fp = open(file2,'w')
   fp.write(bmv702s)
   fp = open(file3,'w')
   fp.write(bmv702i)
   fp = open(file4,'w')
   fp.write(energypos)
   fp.write(powerpos)
   fp = open(file5,'w')
   fp.write(energyneg)
   fp.write(powerneg)
   fp.close()
Grazie.
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect