Vai al contenuto
PLC Forum


centralina autoconsumo con ARDUINO


Luigi Marchi

Messaggi consigliati

Il software Arduino è facile. Basta poco per capire come funziona e bastano poche istruzioni e poche funzioni per sollevare il mondo. Quello che penso scoraggi chi ci si avvicina la prima volta sono le giravolte degli esibizionisti del software che usano variabili criptiche e riassumono più istruzioni in una sola e per capirla viene il mal di testa. I talebani (esibizionisti) sono loro.

Link al commento
Condividi su altri siti


  • Risposte 142
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Luigi Marchi

    89

  • Livio Orsini

    31

  • walterword

    8

  • dott.cicala

    8

Luigi, se hai novità tecniche in ordine all'argomento della discussione scrivi, altrimenti astieniti.

Ripetere sempre le solite cose serve solo ad irritare chi deve leggere per dovere di ufficio.

Link al commento
Condividi su altri siti

Sì, voglio chiarire meglio un piccolo/grande problema che riguarda l'hardware, con il rischio di essere noioso, ma non tutti sono esperti. E mi spiace se qualcuno si scoraggia per colpa di una resistenza sbagliata che non fa funzionare nulla. Le uscite SO+ e SO- di un contatore digitale altro non sono che i terminali di una fotoresistenza o di un fototransistor, che cambia valore (crolla di valore) quando scatta l'impulso.

Il problema è il quanto, perchè l'ingresso digitale di Arduino deve "vedere" più di 2,5 volt positivi.

Infatti la fotoresistenza del contatore va collegata da un lato (SO+) ai 5 volt positivi di Arduino (io metto in serie una resistenza da 100 ohm di protezione) e l'altro lato va a massa con un altra resistenza, per creare un ponte in cui il punto centrale (che va collegato a SO- e al pin digitale di Arduino) varia di tensione in rapporto alla variazione di una delle resistenze (la fotoresistenza, appunto).

Quale deve essere il valore della resistenza fissa del "ponte" che va a massa ? In una centralina da 3200 impulsi ho trovato ottimale il valore di 15k, nell'altra da 2000 impulsi, di altro produttore, va bene 100k. Una bella differenza !!!!!

Consiglio di provare con la centralina in funzione, con tanto di carico sul contatore e display (che fa vedere 0 watt fintantochè non si riesce a catturare l'impulso) e un potenziometro, diciamo da 200k, al posto della resistenza fissa.

Si deve andare per tentativi perchè l'impulso dura meno di un decimo di secondo ed è impossibile leggere il valore della tensione con il voltmetro.

Quando si è trovato il valore giusto, all'interno di un certo range di funzionamento, si misura il valore mediano e si mette una resistenza del valore trovato in via sperimentale. Sconsiglio assolutamente di mettere nella centralina un potenziometro, valido per tutte le tipologie di contatori, perchè con il tempo può creare problemi. Con i microprocessori le regolazioni vanno fatte solo con il software, senza trimmer di sorta.

 

 

Link al commento
Condividi su altri siti

Sto aggiornando il software. Quello postato funziona, ma è molto vecchio. Ho tolto il delay(100) quando cattura un impulso in un contatore, che, in certe condizioni, può interdire la cattura di un impulso nell'altro, sostituito con altra verifica, abbastanza semplice, senza stoppare il ciclo. Inoltre lo aggiorno per i display seriali, che sono molto comodi e reperibili ora a basso costo.Ovviamente conto di proporlo dopo un opportuno collaudo.

Link al commento
Condividi su altri siti

Trimmer di regolazione ? Non serve, ci pensa il software. Il problema delle resistenze da modificare in relazione alle caratteristiche del contatore digitale utilizzato si può superare agendo sul software, perchè Arduino offre tante opzioni. L'impulso del contatore si può "catturare" come è stato indicato:

................

    buttonState = digitalRead(pin_consumi);
    if (buttonState == 1)

.................

ma si può "catturare" anche in altro modo, cioè da un ingresso analogico, anzichè digitale, senza modificare l'hardware. Nel progetto ULISSE ho utilizzato gli ingressi analogici per misurare le tensioni e "catturare" un impulso è compito analogo: bisogna pur sempre misurare la tensione positiva prodotta dall'impulso. Il vantaggio della misura analogica è che la funzione "analogRead()" restituisce un numero compreso tra 0 e 1024, corrispondente a tensione 0 e tensione 5 volt:

Se l'impulso, sulla base del partitore resistivo, non arriva ai 2,5 volt, che servono con la funzione "digitalRead", si può utilizzare la funzione analogRead() come segue :

.....................

  volt_partitore = analogRead(A2);

  If (volt_partitore > 200)  

    ..........

Il numero 200 indica grosso modo una tensione di 1 volt soltanto (1024/5=205).

Il trimmer hardware l'ho sconsigliato perchè è una parte meccanica che si può ossidare e cambiare valore con le vibrazioni, i numeri che mettiamo nel codice software non cambiano mai (da soli). L'affidabilità ne guadagna. E molto.

Link al commento
Condividi su altri siti

Dopo le varie modifiche apportate, l'acchiappaimpulso (analogico, senza delay) è il seguente:

...........

  tempo_adesso_consumi = millis();
  if (tempo_adesso_consumi > vecchio_millis_consumi + 100)   // bisogna che siano passati almeno 100 millisecondi dall'ultima lettura:
  {
    volt_partitore = analogRead(A2);
    if (volt_partitore > 200)       // la tensione deve essere maggiore di 1 volt:
    {
      corrente_millis_consumi = millis();
      tempo_trascorso_consumi = corrente_millis_consumi - vecchio_millis_consumi;
      potenza_watt_consumi = 1000000 / tempo_trascorso_consumi * 36 / 32;        //valido per contatore da 3200 impulsi: 

      vecchio_millis_consumi = corrente_millis_consumi;
    }
  }

...........................

Link al commento
Condividi su altri siti

Ho collaudato le modifiche di cui sopra. Con il crepuscolare di ULISSE, che ci somiglia molto, problemi zero.

Hardware: ho messo una resistenza da 39k (intermedia tra 15k e 100k) sul ramo del divisore che va a massa.

Software: ho usato 200 come valore dei segmenti di valutazione della tensione (che corrisponde a poco meno di 1 volt).

Con queste variazioni il software PENELOPE riesce a catturare gli impulsi sia dei contatori con impulsi "forti" (quello da 3200 impulsi) che quello dei contatori con impulsi "deboli" (quello da 2000 impulsi), senza alcuna modifica di hardware e di software.

La verifica è stata positiva, cioè la lettura dei watt è esatta. Evidentemente la tensione sui pin A1 e A2 deputati a fare le catture (rispettivamente produzione FV e consumi domestici) scatta sopra 1 volt quando arriva l'impulso e rimane sempre sotto quando è assente.

Il codice di PENELOPE, con tutte le modifiche apportate, lo pubblico a breve. Come promesso. Nella sezione UP/Download. Versione 2.0

Link al commento
Condividi su altri siti

Ancora un pò di tempo per il software PENELOPE 2.0  Funziona bene nella parte di cattura impulsi, ma occorre ridefinire i tempi di visualizzazione, delle 2 schermate a rotazione, perchè la velocità del ciclo è diventata meno stupefacente di prima. E debbo rivedere anche la velocità della gestione PWM, cioè dell'aggiornamento del duty cycle per il RSS.

Sin da ora è bene procurarsi un display 16x2 munito di seriale e anche della libreria <LiquidCrystal_I2C.h>. Ho utilizzato la "NewliquidCrystal_1.3.4" reperibile gratuitamente, con ricerca su Internet. Va caricata dal menu dell'IDE di Arduino nel menu sketch->Importa libreria.

In PENELOPE viene caricata con:

  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);   

E viene inizializzata nel setup con "lcd.begin(16,2);" Perchè concerne LCD di16 caratteri per 2 linee.

La seriale richiede il collegamento ad Arduino con V5volt, GND, A4 e A5. Ha un trimmer per la regolazione che va modificato con un cacciavite, quella di default mette in allarme: non mostra nulla a video e fa pensare di aver commesso errori irreparabili. 

Fare tutto con calma, per non sbagliare e/o dimenticare qualcosa, senza scoraggiarsi pensando siano cose per extraterrestri. Il software ha il vantaggio della massima precisione, a regime, ma se sbagli una virgola non va.

Link al commento
Condividi su altri siti

Sono sempre riluttante a rilasciare una versione del software, perchè desidero sempre fare ulteriori verifiche e migliorie, ma sono abbastanza soddisfatto e il lavoro potrà proseguire sulla base dei difetti che saranno riscontrati da chi si cimenterà nella realizzazione. Ripeto: OPEN SOURCE. Preciso di aver utilizzato un Arduino UNO e l'IDE 1.0.6

Questa versione 2.0 è stata caricata e il download è disponibile come segue:

 

Link al commento
Condividi su altri siti

Ho fatto troppe modifiche e troppo in fretta, senza un collaudo adeguato. La parte relativa alla cattura degli impulsi funziona bene e anche la visualizzazione sul display. Quello che non va è la gestione PWM che è diventata molto reattiva circa le variazioni di produzione FV e carichi - che è positivo - ma che va in confusione e innesca una specie di effetto Larsen relativamente al duty cycle. Cosa che non si verificava nella vecchia versione. Penso sia dipeso dai tempi, di verifica dati e reazione, che sono cambiati, senza il freno del delay(). La debbo assolutamente correggere. Chiedo scusa. La versione postata è quindi da ritenersi una versionè ZERO, non una 2.0.

Link al commento
Condividi su altri siti

Quando qualcosa non va nel software bisogna riordinare le idee. Cosa vogliamo ottenere e come si può ottenere circa la gestione del PWM per un carico ? Vogliamo che tutto il surplus della produzione fotovoltaica, poca o molta che sia, venga dirottata su un utilizzo utile. Occorre rilevare la quantità (in watt) del surplus e questo lo abbiamo, poi occorre aumentare il duty cycle PWM quando il surplus aumenta e diminuirlo quando diminuisce il surplus disponibile, per far collimare, in modo dinamico, i consumi in rapporto alla produzione..

Facile ? Mica tanto. Perchè:

1) non sappiamo che carico è allacciato (può essere uno scaldabagno con una resistenza da 400 watt, oppure una stufetta da 800 watt, oppure, ancora, un boiler da 2 Kw) e l'effetto di una modifica di qualche punto del PWM ha effetti molto diversi.

2) altro limite è rappresentato dalle rilevazioni di produzione e consumi che avvengono a "scatti". 

Ogni volta che avviene una nuova rilevazione, sia essa quella della produzione o quella dei consumi, dobbiamo riequilibrare i consumi modificando il PWM, ma il risultato della modifica la possiamo riscontrare solo con la misura successiva dei consumi. Serve una correzione molto veloce, ma se esageriamo rischiamo di andare oltre e il riequilibrio diventa un lavoro che fa perdere la testa al microcomputer. Come sta accadendo al software proposto, nella sezione che ci interessa.

Allora dobbiamo puntare ad un riequilibrio graduale, in più fasi, cioè in un certo numero di ricalcoli successivi dell'equilibrio, che potrebbe richiedere quindi qualche secondo. Lo possiamo fare in via teorica o in via sperimentale.

Con la vecchia versione di Penelope era stato ottenuto un buon equilibrio e solitamente lo sbilancio, cioè i watt immessi o quelli prelevati, dopo qualche assestamento, erano di pochi watt. Quindi ci si può riuscire.

Link al commento
Condividi su altri siti

Voglio provare a fare una sola modifica ogniqualvolta avviene la rilevazione dei consumi, posto che il PWM agisce proprio sui consumi. Siccome i consumi dei carichi allacciati al RSS sono consumi importanti, posso prevedere che la rilevazione dei consumi abbia una frequenza veloce, diciamo ogni 2 secondi circa con consumi di 500 watt.

Se l'assestamento avviene in 2 o 3 passaggi, cioè in meno di 10 secondi, mi sembra una soluzione accettabile.

Più l'assestamento è lento e maggiore è la possibilità di avere una correzione anche sui piccoli numeri.

La lentezza ovviamente penalizza i "transitori" cioè i passaggi dei consumi da poche decine di watt a molte centinaia. Accade quando si accende un elettrodomestico energivoro, che va a "rubare" tutto il surplus e quindi occorre ridurre velocemente il PWM.

Per far questo occorre utilizzare un algoritmo di correzione molto progressivo. Quello studiato a suo tempo potrebbe andare bene: "aumento = (val_prod - val_cons) * 254 / 10000;". Questo algoritro modifica il PWM di poche unità quando il surplus è piccolo e di alcune decine quando il surplus è rilevante.

Il codice l'ho già modificato, con questa logica, e necessariamente rimando a domani, con la produzione del fotovoltaico, le verifiche e le correzioni.

Adesso che è notte Penelope mi misura i consumi domestici (357 watt in questo momento) e non fa null'altro.

 

 

Link al commento
Condividi su altri siti

Oggi mattinata grigia, anzi plumbea, impossibile fare prove con il fotovoltaico che mi produce appena 364 watt. Allora parliamo di PWM, cioè di onda quadra modulata, che è una grande risorsa di Arduino. Con qualche utilizzo originale.

Mettiamo che abbiamo una villa con vasca dei pesciolini rossi e una bella fontana al centro che zampilla bello in alto con una pompa da 230 volt che rinfresca dal caldo infernale. Bello no ? Ovviamente la villa ha un bell'impianto fotovoltaico ed è una bella giornata di sole. Con la centralina Penelope che mi misura la produzione e i consumi (voluttuari e non) che ci facciamo ?

Mettiamo quattro righe di codice aggiuntivo per pilotare la pompa, solo quando c'è esubero di energia, diciamo 500 watt, tutto in automatico. Come segue:

..........

if (W_produzione > W_consumi + 500)

    {

    analogWrite(pin_relè, 254);
    }
    else
    {
     analogWrite( pin_relè, 0);  
    }

.........................
Queste 4 righe di codice consentono di gestire un Relè a Stato Solido, come fosse un normale relè tutto chiuso o tutto aperto. Con tanti vantaggi, tipo quello di poter utilizzare un piccolo relè per AC come il FOTEK da 25 Amper che costa pochi Euro, che non ha bisogno di alcuna alimentazione, nè BC337, perchè viene pilotato direttamente dal pin di Arduino, tramite un cavettino bifilare.

P.S.: siccome la pompa ha uno spunto di consumi iniziali importante, come il frigo, per evitare un accendi e spegni continuo, è benè stoppare il tempo per qualche secondo con l'istruzione: "delay (5000);" dopo il primo analogWrite.

Il PWM cosa c'entra ? C'entra perchè ci consente una flessibilità di impiego inimmaginabile. Non è il caso di una pompa AC, ma ci sono tante situazioni in cui si può modulare la corrente AC o DC con un RSS.

Basta cambiare opportunamente quei numerini magici, da zero a 254 che consentono di parzializzare l'energia. 

Nelle nuove abitazioni è bene mettere una scatola aggiuntiva per centraline che gestiscono la domotica: gli usi sono inimmaginabili e il fai da te è una grande risorsa.

 

 

 

 

Link al commento
Condividi su altri siti

IL CREPUSCOLARE ? Non serve, se abbiamo un impianto fotovoltaico con la centralina Penelope che misura produzione e consumi. Non c'è miglior crepuscolare dell'impianto fotovoltaico. E basta un'istruzione per attivare in automatico le luci esterne e spegnerle all'alba:

.........

  if (W_produzione < 10)

.........

Il resto delle istruzioni come sopra. E purè l'allaccio del RSS. Eventualmente si può prevedere qualche istruzione per ritardare l'accensione (vedi software ULISSE). Tenere presente che gli inverter di notte consumano qualche watt che il contatore digitale "vede" come produzione. 

Link al commento
Condividi su altri siti

Il mio contatore digitale mi misura tutta la notte la produzione del fotovoltaico e rimane stabile sui 2 watt, che poi è il consumo notturno del mio Solaredge. Solo un paio di volte ho notato qualcosa di strano: c'era una bellissima luna piena, in una notte luminosissima, proprio sopra il mio tetto. Non ricordo però cosa evidenziava il contatore dedicato, in termini di watt prodotti (in questo caso non era consumo).

Link al commento
Condividi su altri siti

Walterword. Spiega come. Non so cosa intendi.

Volevi dire che è bene fare una verifica, di tanto in tanto, anche se non arriva nessun impulso ? Ma come faccio se l'impulso non arriva ? Cosa misuro ?

Posso mettere a zero se dopo un tot tempo non arriva nessun impulso, questo sì.

Link al commento
Condividi su altri siti

E' sufficiente un'unica istruzione condizionale, cioè il solito if :

 

if (tempo_trascorso > 3600000)      // che sta per 1 ora, il conteggio di millis() è in millesimi di secondo:

 

seguito da una istruzione che mette a 0 il conteggio dei watt prodotti e/o consumati. Tempo trascorso si misura con l'istruzione:

 

tempo_trascorso = millis() - tempo_trascorso_vecchio;

 

Link al commento
Condividi su altri siti

Walter ti ha consigliato di fare un filtro Sw.

Per esempio puoi fare una finestra scorrevole che ti da la media sulle letture nell'arco di 15'

 

tanto per fare un esempio.

se misuri ogni 30" prepari un  array (vettore) con 60 elementi. ad ogni lettura metti il valore nell'array e sommi il nuovo valore alla somma pregerssa, sino a quando l'array è pieno.

A questo punto fai la media dei 60 valori dividendo la somma per 60.

Alla lettura successiva sostituisci il valore più vecchio del vettore con l'ultimo. Sottrai il valore scartato, sommi il nuovo valore ed effettui la divisione.

 

Eventuali letture anomale, disturbi ed oscillazioni vengono attenuate di molto.

 

Questo algoritmo detto "finestra scorrevole sliding window" è ampiamente usato in automazione industriale proprio per eliminare gli effetti di transitori e/o spot.

Se invece vuoi essere sofisticato implementa un bel filtro di Kalman però è un poco più complicato, soprattutto devi usare temporizzatori precisi.

Anche questo è molto usato nei regolatori industriali, anzi è quasi un must

Link al commento
Condividi su altri siti

Facile da fare, più che da capire, anche se hai cercato di spiegarlo bene. Nel mio caso i consumi hanno degli svarioni enormi e non sono turbative; lo stesso accade con il fotovoltaico in pieno sole, quando arriva la nuvoletta. Non saprei come definire la "turbativa" da scartare.

Il "fuori range", cioè un'anomalia vera la posso considerare quando si superano i limiti di produzione e/o consumi come previsti dal magnetotermico che stacca l'impianto. Potrebbe servire per fissare in memoria l'evento.

La possibilità, con Arduno di cumulare e fissare dati in memoria e ottenere un grafico è facilmente praticabile, ma non ci ho mai lavorato. Interessante. Il software SIBILLA fa delle somme e ha anche l'orologio.

Link al commento
Condividi su altri siti

Quote

Nel mio caso i consumi hanno degli svarioni enormi e non sono turbative .....

 

Chiamali come vuoi, ma sono comunque picchi, positivi o negativi.

Il filtro non li scarta ma ne addolcisce l'influenza.

 

poi visto che sai sempre tutto, fai un po' come credi.

Link al commento
Condividi su altri siti

Adesso mi sto concentrando sulla gestione del PWM di Penelope. La modifica che ho apportato ieri sera funziona benone, ma è molto lenta. L'impianto ora mi produce 425 watt e i consumi (inferiori) sono pareggiati con il consumo della stufetta da 1,25 KW che va al 25% - Interessante che il PWM viene aggiornato continuamente ma il differenziale (W_GSE o W_Enel) rimane sotto i 10 Watt.

Mi dà proprio gusto vedere W_Enel 1 watt, o W_GSE 5 watt.

Con la stufetta che sbalena in modo molto regolare, come un diesel di nuova generazione.

Link al commento
Condividi su altri siti

Molti mi hanno chiesto se è possibile utilizzare questa tecnologia per un impianto fotovoltaico, in Italia, senza collegamento ad ENEL e quindi senza contatore bidirezionale. NON SI PUO'  quello che sto proponendo è per impianti fotovoltaici che hanno la convenzione di scambio sul posto. Tempo fa era consentito allacciare un impianto fotovoltaico da meno di 1 Kw nominale, senza convenzione Enel, ora non più.

Link al commento
Condividi su altri siti

Il fai da te negli impianti fotovoltaici non è consentito, semplicemente per problemi di sicurezza: gli inverter debbono essere a norma e debbono "staccare" quando viene meno la corrente elettrica per consentire la manutenzione da parte dei tecnici Enel. Altro è un "impianto a isola" per batterie o altro.

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.

×
×
  • Crea nuovo/a...