slave a tutti, sto cercando di leggere 2 contatori di energia con uscita S0 con arduino nano per poi inviarli a emoncms su raspberry per controllo consumi e produzione.
sto usando questo sketch ma ho molte false letture. qualcuno puo aiutarmi a risolvere?
avendo delle false letture credevo che l'utilizzo di low fosse migliore di di falling. lo cambio
come faccio a ridurre le operazioni nelle isr? se voglio la potenza istantanea quello è l'unico punto in cui posso calcolarla...
se c'è un'altro modo si accettano suggerimenti...
A me onestamente non pare che nell'ISR accada questo granchè da sprecare tempo, considerando che il debounce dovrebbe anche essere inutile ed eliminabile.
Poi ci sono tutta una serie di cose strane, dalle inutili String usate nel print, all'uso di Software Serial per comunicare con Raspberry. Passa sicuramente piĂą tempo a scrivere i dati su seriale che non ad eseguire l'ISR.
Non c’e’ nessun problema a fare quello che fai nelle isr.
Metti gli interrupt su FALLING come ti hanno detto e aumenta il tempo di antirimbalzo in modo da coprire tutta la durata dell’impulso se no rischi che il fronte di salita svaccato generi delle conte spurie. Presumo che tu stia usando una configurazione open collector. Confermi?
Aldilà del codice, migliorabile, ma se funziona può andare bene anche così, le false letture possono semplicemente provenire da un hardware mal cablato, io ad esempio non ho ancora capito cosa pilota i pin degli interrupt : un relè? Un'uscita open collector? Altro?
A seconda dei casi ad esempio potresti avere miglioramenti usando un pullup esterno, tipo 4.7 o 3.3 Kohm, che ti aumenta senz'altro l'immunitĂ dai disturbi. Ma bisognerebbe prima sapere cosa ci sta collegato...
i cavi da aurduino ai contatori sono lunghi circa 20cm.
la tensione che uso è 5v.
prima avevo provato a leggerli con raspberry con cavi lunghi circa 10mt ed avevo questo problema, cosi ho provato a mettere un arduino vicino ai contatori ma vedo che il problema continua.
Ho modificato lo sketch cambiando low con falling ed allungando il tempo di debounce a 100ms ma poco fa ho avuto una lettura da 32000watt...
A mio parere pv_watt, rete_watt e debounce devono essere unsigned long.
Inoltre, prima di mandare i dati su seriale, bisogna disabilitare gli interrupt, copiare i valori da stampare in delle variabili di appoggio e riabilitare gli interrupt.
I flags di interrupt rimangono memorizzati e gli interrupt eventualmente avvenuti quando erano disabilitati vengono serviti quando si riabilitano.
Velocizzare riduce solo la probabilita’ che ci siano degli errori dovuti all’incongruenza di variabili composte da piu’ bytes, ma non l’annulla.