UN CONTATORE (ECONOMICO) CON USCITE SO+ E SO- PER LA CENTRALINA CONTAWATT

redazione in corso … articolo n. 285

Aggiornato il 25 aprile 2023.

La diffusione dei microimpianti fotovoltaici sono una testimonianza di sensibilità civica apprezzabile, ma vale sempre la pena di verificare il rendimento, partendo dai dati di produzione.

La centralina “CONTAWATT“, presentata nell’articolo scorso, è un’ottima soluzione, perchè semplissima, ma richiede l’utilizzo di un contatore digitale con uscita SO+ e SO- per poter “catturare” gli impulsi.

I contatori digitali monofase Din Rail da 3200 impulsi (i più veloci, marca ANDELI ADM25SC) sono diventati introvabili e ho dovuto fare una ricerca su internet per altri modelli: quelli da 2000 impulsi per kwh sono relativamente comuni.

Poi a me interessano quelli di piccole dimensioni, da soli due “moduli”.

Ho trovato il modello DDS5188 e il XTM18S, entrambi di costo inferiore a 20 euro.

Il secondo è reperibile su Amazon e ha un visorino analogico, cioè meccanico. Vedi foto.

Ma il visorino, quantunque utile, relativo all’energia cumulato nel tempo, a noi interessa relativamente, perchè siamo più interessati ai dati istantanei.

Pertanto per gli utilizzi previsti con la centralina “ARCHIMEDE CONTAWATT” vanno bene entrambi.

Fare attenzione, naturalmente, al numero di impulsi: per i 2000 impulsi, che ci interessa, vale l’indicazione Ra = 0,5 Wh/Impulso.

Solitamente l’uscita SO+ corrisponde all’uscita n. 20 e la SO- alla n. 21.

Queste uscite vanno collegate, rispettando la polarità, con gli ingressi della centralina “CONTAWATT” che segnala, sul display, l’energia prodotta, di momento in momento, e quella prodotta nell’ultima ora, nelle 24 ore e negli ultimi 30 giorni.

In realtà il software cumula i consumi ogni 5 minuti, ogni ora, nelle 24 ore e negli ultimi 30 giorni.

Ildato di produzione istantanea viene ricalcolato ogni volta che viene “catturato” un impulso.

La velocità degli impulsi deriva, appunto, dal numero di impulsi per kwh.

Con un contatore da 2000 impulsi – e energia di 100 watt – servono circa 18 secondi per avere un impulso.

La formula è

  potenza_watt_consumi = 1000000 / tempo_trascorso_consumi * 36 / 20;
   

Con un contatore da 3200 impulsi sarebbero occorsi solo 11 secondi, circa.

In questa formula il “tempo_trascorso” è espresso in millesimi di secondo.

Il codice è valido per conteggiare la produzione come i consumi; cambia solo la visualizzazione dati a video.

Naturalmente il software della centralina “CONTAWATT” va impostato su 2.000 impulsi per chilowattora.

Fare attenzione, nello sketch, proposto nell’articolo precedente, anche all’ingresso analogico di arduino impostato (solitamente ad A1 o A2).

Stessa attenzione va posta, sempre nello sketch, circa la configurazione del display seriale in relazione agli integrati utilizzati, che hanno codifiche diverse.

A volte sono queste piccole differenze hardware che mettono in crisi l’hobbista e fanno perdere tantissimo tempo.

Accade anche con un hardware semplicissimo come quello della centralina “CONTAWATT“.

Giusto il tempo di assemblare su un contenitore da 10 moduli la centralina più il contatore e un sezionatore e sono pronto per le verifiche.

Intendo utilizzare questa “CONTAWATT” con i 4 pannelli a terra, da 175 watt cadauno e un inverter Y&H da 700 watt.

Impianto a terra con pannelli 4 x 175 watt da 72 celle, in parallelo

Mi interessa avere misure di produzione “fiscali” e, con contatori digitali non si sbaglia, perchè hanno tolleranze inferiori a 1%

Verrà pubblicata anche una versione software, cioè uno sketch, aggiornato con una modifica interessante.

25/04/2023: Ecco la nuova versione, denominata “CONTAWATT PLUS“: l’aggiornamento consiste nella indicazione, a video, delle ore cumulate e dei giorni cumulati.

Questi, dipendono da quando la centralina è stata attivata perchè si va a regime solo dopo 24 ore e 30 giorni.

Dopo 3 ore avremo l’indicazione di 3 ore circa l’energia maturata nelle 24 ore e analogo meccanismo circa l’indicazione dell’energia maturata nei 30 giorni.

Pertanto la modifica riguarda la visualizzazione delle informazioni, nella prima riga del display, della seconda videata.

Soprattutto il dato relativo all’energia maturata negli ultimi 30 giorni è interessante per monitorare periodi parziali, dopo l’accensione della centralina.

Sono state aggiunte due nuove variabili di tipo “int”: conta_ore e conta_giorni.

Se l’aggiornamento delle ore supera le 24 viene stabilizzato a 24, perchè sappiamo che avviene la sostituzione dell’ora 24 e precedenti.

Altrtettanto accade con i giorni, massimo 30.

Alla prossima. PASSA PAROLA !!!

/* PROGRAMMA ARCHIMEDE 1 CONTAWATT PLUS per contatore digitale. 
 Versione per display 2x16 SERIALE (A4 e A5)
 Allaccio contatori a A1 (Produzione Penelope)
 autore SoftPlus Consumo Zero - email: [email protected]  
 Versione software aggiornata il 25 aprile 2023:
 //
 IMPORTANTE: il contatore digitale va collocato sulla linea della produzione.
 //
 IMPORTANTE: i sensori digitali producono degli impulsi la cui distanza, l'uno dall'altro, è inversamente proporzionale alla potenza:
 ciò comporta una certa lentezza nella valutazione dei piccoli carichi,la contropartita è una misurazione "fiscale" della massima
 precisione, come i contatori Enel; i sensori utilizzati (reperibili presso PARSIC ITALIA - Cervia) richiedono 3200 impulsi ora per un KWora.
 //
 Basetta di interfaccia, tra contatori e Arduino: 1 resistenze da 39 Kohm lato massa e 1 da 100 ohm lato 5 volt.
 Relativamente al numero di impulsi, va utilizzato il software relativo, oppure modificare le istruzioni che fanno riferimento 
 agli impulsi. 
 //
 */
#include <Arduino.h> //inclusione della libreria base:
// includere altre librerie:
#include <Wire.h> 
#include <LiquidCrystal_I2C_Parsic_V40.h>
// #include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);    // LCM1602 IIC A0 A1 A2:
 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);    //POSITIVE=accensione retroilluminazione:
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);    // indirizzo LCD Philips PCF8574AT: 
// LiquidCrystal_I2C lcd(0x27,16,2); 
//
int pin_consumi = A1;       // pin dove arrivano gli impulsi della produzione:
int conta1 = 0;
int conta2 = 0;
unsigned long val_cons = 0;
unsigned long potenza_watt_consumi = 0;      // non modificare unsigned long:
double vecchio_millis_consumi = 0;
double corrente_millis_consumi = 0;
double tempo_adesso_consumi = 0;
double vecchio_millis_minuti = 0;
double corrente_millis_minuti = 0;
double vecchio_millis_ore = 0;
double corrente_millis_ore = 0;
double vecchio_millis_giorni = 0;
double corrente_millis_giorni = 0;
unsigned long tempo_trascorso_consumi = 0;         // non modificare unsigned long anzichè int:
unsigned long contawattora = 0;
int volt_partitore_consumi = 0;
unsigned long impulsi_consumi = 0;
unsigned long impulsi_consumi_nuovo = 0;
unsigned long impulsi_consumi_vecchio = 0;
unsigned long impulsi_1h = 0;
unsigned long contawatt_1h = 0;
unsigned long impulsi_24h = 0;
unsigned long contawatt_24h = 0;
unsigned long impulsi_30g = 0;
unsigned long contawatt_30g = 0;
unsigned long m1 = 0;
unsigned long m2 = 0;
unsigned long m3 = 0;
unsigned long m4 = 0;
unsigned long m5 = 0;
unsigned long m6 = 0;
unsigned long m7 = 0;
unsigned long m8 = 0;
unsigned long m9 = 0;
unsigned long m10 = 0;
unsigned long m11 = 0;
unsigned long m12 = 0;
unsigned long h1 = 0;
unsigned long h2 = 0;
unsigned long h3 = 0;
unsigned long h4 = 0;
unsigned long h5 = 0;
unsigned long h6 = 0;
unsigned long h7 = 0;
unsigned long h8 = 0;
unsigned long h9 = 0;
unsigned long h10 = 0;
unsigned long h11 = 0;
unsigned long h12 = 0;
unsigned long h13 = 0;
unsigned long h14 = 0;
unsigned long h15 = 0;
unsigned long h16 = 0;
unsigned long h17 = 0;
unsigned long h18 = 0;
unsigned long h19 = 0;
unsigned long h20 = 0;
unsigned long h21 = 0;
unsigned long h22 = 0;
unsigned long h23 = 0;
unsigned long h24 = 0;
unsigned long g1 = 0;
unsigned long g2 = 0;
unsigned long g3 = 0;
unsigned long g4 = 0;
unsigned long g5 = 0;
unsigned long g6 = 0;
unsigned long g7 = 0;
unsigned long g8 = 0;
unsigned long g9 = 0;
unsigned long g10 = 0;
unsigned long g11 = 0;
unsigned long g12 = 0;
unsigned long g13 = 0;
unsigned long g14 = 0;
unsigned long g15 = 0;
unsigned long g16 = 0;
unsigned long g17 = 0;
unsigned long g18 = 0;
unsigned long g19 = 0;
unsigned long g20 = 0;
unsigned long g21 = 0;
unsigned long g22 = 0;
unsigned long g23 = 0;
unsigned long g24 = 0;
unsigned long g25 = 0;
unsigned long g26 = 0;
unsigned long g27 = 0;
unsigned long g28 = 0;
unsigned long g29 = 0;
unsigned long g30 = 0;
int conta_ore = 0;
int conta_giorni = 0;
//
// **********************************************************************************************************
// int impulsi_kwh = 3200;                          // dato da modificare in base agli impulsi del contatore:
int impulsi_kwh = 2000;           // ATTENZIONE va modificata anche la riga 167:
// **********************************************************************************************************

// altre definizioni:
void setup()
{
  pinMode(A2, INPUT);             //pin sensore digitale consumi:
  //
  lcd.begin(16,2);  // Inizializzo LCD 16 caratteri per 2 linee, SERIALE:
  lcd.print("    SoftPlus    ");       
  lcd.setCursor(0, 1);
  lcd.print(" CONTAWATT PLUS ");
  delay(3000);
  lcd.setCursor(0, 1); 
  lcd.print("                "); 
  lcd.setCursor(0, 1);  
  lcd.print("Impulsi:  ");
  lcd.print(impulsi_kwh);
  delay(3000);  
  //  
  //  lcd.begin(16,2); 
  //
}
//
// Inizia ciclo
void loop() {
  //
  // step 1 lettura dei dati digitali:
  //
  tempo_adesso_consumi = millis();
  if (tempo_adesso_consumi > vecchio_millis_consumi + 200)   // bisogna che siano passati almeno 100 millisecondi dall'ultima lettura:
    // (mettere 100 per misure fino a 6 Kw e 200 per misure fino a 3 kw). 
  {
    // legge lo stato e percepisce l'impulso sul pin deputato a rilevare i consumi:
    volt_partitore_consumi = analogRead(A1);
    // ************* MODIFICA IMPORTANTE ANTIDISTURBI ***************************:
    // if (volt_partitore_consumi > 200)       // la tensione deve essere maggiore di 1 volt:
    if (volt_partitore_consumi > 600)       // la tensione deve essere maggiore di 3 volt:  
    // ********************* FINE MODIFICA X DISTURBI ***************************:  
    {
      corrente_millis_consumi = millis();
      tempo_trascorso_consumi = corrente_millis_consumi - vecchio_millis_consumi;
      vecchio_millis_consumi = corrente_millis_consumi;
   //   potenza_watt_consumi = 1000000 / tempo_trascorso_consumi * 36 / 32;        //valido per contatore da 3200 impulsi   
       potenza_watt_consumi = 1000000 / tempo_trascorso_consumi * 36 / 20;        //valido per contatore da 2000 impulsi  
      // potenza_watt_consumi = 1000000 / tempo_trascorso_consumi * 36 / 10;        //valido per contatore da 1000 impulsi       
      val_cons = potenza_watt_consumi;
      impulsi_consumi = impulsi_consumi + 1;
    }
    //
    // step 2 aggiornamento dati:
    //  
    corrente_millis_minuti = millis();
    if (corrente_millis_minuti > vecchio_millis_minuti + 300000)   // significa che sono passati 5 minuti (60.000 x 5 = 300000):
    {
      vecchio_millis_minuti = corrente_millis_minuti;   
      m12 = m11;     // indicazione delle tranche di 5 minuti (ce sono 12 in un'ora):
      m11 = m10;
      m10 = m9;      
      m9 = m8;
      m8 = m7;
      m7 = m6;
      m6 = m5;
      m5 = m4;      
      m4 = m3;
      m3 = m2;
      m2 = m1;
      impulsi_consumi_nuovo = impulsi_consumi;     
      m1 = impulsi_consumi_nuovo - impulsi_consumi_vecchio;
      impulsi_consumi_vecchio = impulsi_consumi_nuovo; 
      impulsi_1h = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10 + m11 + m12; 
      //
      corrente_millis_ore = millis();
      if (corrente_millis_ore > vecchio_millis_ore + 3600000)   // 3,6 milioni, cioè un'ora (60.000 x 60 = 3600000):
      { 
        vecchio_millis_ore = corrente_millis_ore;
        conta_ore = conta_ore + 1;    
        h24 = h23;
        h23 = h22;
        h22 = h21;      
        h21 = h20;
        h20 = h19;
        h19 = h18;
        h18 = h17;
        h17 = h16;      
        h16 = h15;
        h15 = h14;
        h14 = h13; 
        h13 = h12;       
        h12 = h11;
        h11 = h10;
        h10 = h9;      
        h9 = h8;
        h8 = h7;
        h7 = h6;
        h6 = h5;
        h5 = h4;      
        h4 = h3;
        h3 = h2;
        h2 = h1;
        h1 = impulsi_1h;  
        impulsi_24h = h1 + h2 + h3 + h4 + h5 + h6 + h7 + h8 + h9 + h10 + h11 + h12 + h13;
        impulsi_24h = impulsi_24h + h14 + h15 + h16 + h17 + h18 + h19 + h20 + h21 + h22 + h23 + h24; 
        //
        corrente_millis_giorni = millis();
        if (corrente_millis_giorni > vecchio_millis_giorni + 86400000)   // 24 ore (3,6 milioni x 24 = 86400000):         
        {
          vecchio_millis_giorni = corrente_millis_giorni;  
          conta_giorni = conta_giorni + 1;          
          g30 = g29;
          g29 = g28;
          g28 = g27;      
          g27 = g26;
          g26 = g25;
          g25 = g24;      
          g24 = g23;
          g23 = g22;
          g22 = g21;      
          g21 = g20;
          g20 = g19;
          g19 = g18;
          g18 = g17;
          g17 = g16;      
          g16 = g15;
          g15 = g14;
          g14 = g13; 
          g13 = g12;       
          g12 = g11;
          g11 = g10;
          g10 = g9;      
          g9 = g8;
          g8 = g7;
          g7 = g6;
          g6 = g5;
          g5 = g4;      
          g4 = g3;
          g3 = g2;
          g2 = g1;
          g1 = impulsi_24h; 
          impulsi_30g = g1+g2+g3+g4+g5+g6+g7+g8+g9+g10+g11+g12+g13+g14+g15+g16+g17;
          impulsi_30g = impulsi_30g+g18+g19+g20+g21+g22+g23+g24+g25+g26+g27+g28+g29+g30;       
        }
        // 
      }
      //
    }
    //    
  }
  //
  // step 3 visualizzazione dati: 
  if (conta1 == 15000)
  {
    //    contawatt = impulsi_consumi/3200;   // perchè abbiamo 3200 impulsi per Kwh:  
    contawattora = impulsi_consumi/ (impulsi_kwh / 100);   // abbiamo i Kwh con 2 decimali:
    //
    lcd.setCursor(0, 0);
    lcd.print("W_FV Kwh_Produzi");  
    lcd.setCursor(0, 1);
    lcd.print("                "); 
    lcd.setCursor(1, 1);  
    lcd.print(val_cons); 
    lcd.setCursor(11, 1);     // 
    lcd.print("0,00"); 
    if (contawattora < 10)
    {
      lcd.setCursor(14, 1);
      lcd.print(contawattora); 
    }   
    if (contawattora > 9 && contawattora < 100) 
    {
      lcd.setCursor(13, 1); 
      lcd.print(contawattora);
    }
    if (contawattora > 99 && contawattora < 999)  
    {
      lcd.setCursor(12, 1);   
      lcd.print(contawattora); 
      lcd.setCursor(12, 1); 
      lcd.print(","); 
      lcd.setCursor(11, 1); 
      lcd.print(contawattora / 100); 
    }
    if (contawattora > 999 && contawattora < 9999)  
    {
      lcd.setCursor(11, 1);   
      lcd.print(contawattora); 
      lcd.setCursor(12, 1); 
      lcd.print(","); 
      lcd.setCursor(10, 1); 
      lcd.print(contawattora / 100); 
    }
    if (contawattora > 9999 && contawattora < 99999)  
    {
      lcd.setCursor(10, 1);   
      lcd.print(contawattora); 
      lcd.setCursor(12, 1); 
      lcd.print(","); 
      lcd.setCursor(9, 1); 
      lcd.print(contawattora / 100); 
    }    
    //
  } 
  if (conta1 == 25000)
  {
    contawatt_1h = impulsi_1h*1000/impulsi_kwh;   // perchè abbiamo 3200 impulsi per Kwh:  
    contawatt_24h = impulsi_24h*1000/impulsi_kwh; 
    contawatt_30g = impulsi_30g/impulsi_kwh;        // è espresso in Kwh;
    //
    lcd.setCursor(0, 0);
    lcd.print("Wh_1h 24h 30ggKw"); 
    lcd.setCursor(6, 0); 
    lcd.print("  ");
    if (conta_ore > 24) conta_ore = 24;
    if (conta_ore < 10) lcd.setCursor(7, 0);
    else lcd.setCursor(6, 0);
    lcd.print(conta_ore);     
    lcd.setCursor(10, 0); 
    lcd.print("  "); 
    if (conta_giorni > 30) conta_giorni = 30;    
    if (conta_giorni < 10) lcd.setCursor(11, 0);
    else lcd.setCursor(10, 0); 
    lcd.print(conta_giorni);     
    lcd.setCursor(0, 1);
    lcd.print("                "); 
    lcd.setCursor(0, 1); 
    lcd.print(contawatt_1h); 
    lcd.setCursor(5, 1); 
    lcd.print(contawatt_24h); 
    lcd.setCursor(12, 1); 
    lcd.print(contawatt_30g);    
    conta2 = 0; 
    conta1 = 0;    
  }    
  //
  conta1 = conta1 + 1;  
  //
}
// FINE listato by SoftPlus Consumo Zero - Faenza.  



continua