Misura produzione/consumo di un impianto fotovoltaico

SOMMARIO

Questo progetto rappresenta il secondo di tre sottoprogetti a complessità crescente; occorre aver realizzato precedentemente il progetto: Power Controller: controllo consumi elettrici di un'utenza domestica.
Si propone di realizzare un dispositivo elettronico che misura ogni secondo contemporaneamente le due potenze istantanee, quella prodotta da un impianto fotovoltaico e quella consumata dalla collegata utenza domestica (max 6kW). Il dispositivo accende una spia rossa se la potenza consumata supera quella prodotta o una spia verde in caso contrario. Sono utilizzati componenti a basso costo, facilmente reperibili da distributori di componentistica elettronica online.

PRINCIPALI MATERIALI UTILIZZATI

2 sensori di corrente alternata AC 30A 1V SCT-013-030 non invasivi per monitoraggi
Arduino Nano V3.0 Scheda di Microcontrollore CH340 ATmega328P
OLED Display 128 x 64 Pixel 0,96 pollici I2C schermo video retroilluminato

DISCUSSIONE

Il circuito di misura è rappresentato in Fig.8.

Fig.8

Il circuito di connessione al microcontrollore si modifica come in Fig.9.

Fig.9

Per la procedura di taratura della tensione si rimanda alla pagina: Taratura tensione del Power Controller.
Per la procedura di taratura delle due correnti si rimanda alla pagina: Taratura corrente del Power Controller.
Di seguito viene proposto il codice di gestione del dispositivo di Fig.9.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
constexpr uint8_t Sync = 2;
constexpr uint8_t Led_Rosso = 8;
constexpr uint8_t Led_Verde = 9;
int sensorValue;
int cyccnt = 0;
byte stcur = 1;
int Volt_pin = A0;
int MaxVolt = 0;
long MedVolt = 0;
int DeVolt;
double Volt;
int Amp1_pin = A1; // potenza prodotta
int MinAmp1 = 1023;
int MaxAmp1 = 0;
int DeAmp1;
long MedAmp1 = 0;
double Amp1 = 0;
unsigned int WattSec1;
byte MaxVerso1;
byte AMax1 = 0;
int Amp2_pin=A2; // potenza consumata
int MinAmp2 = 1023;
int MaxAmp2 = 0;
int DeAmp2;
long MedAmp2 = 0;
double Amp2 = 0;
unsigned int WattSec2;
long WattMin2 = 0;
byte MaxVerso2;
byte AMax2 = 0;
void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  pinMode(Sync, INPUT);
  pinMode(Led_Rosso, OUTPUT);
  pinMode(Led_Verde, OUTPUT);
  digitalWrite(Led_Rosso, HIGH);
  digitalWrite(Led_Verde, HIGH);
  while(digitalRead(Sync) == LOW){
  }
}
void loop()
{
  if(stcur == 0){
    if (digitalRead(Sync) == HIGH){
      stcur = 1;
      cyccnt = cyccnt  + 1;
      DeVolt = MaxVolt;
      DeAmp1 = MaxAmp1 - MinAmp1;
      DeAmp2 = MaxAmp2 - MinAmp2;
      MedVolt = MedVolt + DeVolt;
      MedAmp1 = MedAmp1 + DeAmp1;
      MedAmp2 = MedAmp2 + DeAmp2;
      AMax1 = AMax1 + MaxVerso1;
      AMax2 = AMax2 + MaxVerso2;                  
      MaxVolt = 0; 
      MinAmp1 = 1023;
      MaxAmp1 = 0;
      MinAmp2 = 1023;
      MaxAmp2 = 0;
      if(cyccnt == 48){    
        MedVolt = MedVolt + 2*DeVolt;
        MedAmp1 = MedAmp1 + 2*DeAmp1;
        MedAmp2 = MedAmp2 + 2*DeAmp2; 
        Volt = 0.004711*double(MedVolt) + 35;
        Amp1 = 0.001025*double(MedAmp1) - 0.045;
        Amp2 = 0.001025*double(MedAmp2) - 0.045;
        WattSec1 = int((Volt*Amp1) + 0.5);
        WattSec2 = int((Volt*Amp2) + 0.5);        
        display.clearDisplay();   
        display.setCursor(0,0);              
        display.print("V");
        display.print(int(Volt + 0.5));      
        if(AMax1 < 24) {
          display.println (" No P");          
        }
        else{        
          display.print(" P");   
          display.println(WattSec1);        
        }             
        if(AMax2 < 24) display.print(" -");
        else display.print(" +");        
        display.print("C");      
        display.println(WattSec2);    
        MedVolt = 0;
        MedAmp1 = 0;
        MedAmp2 = 0;
        if(WattSec1>WattSec2){ // Produzione > Consumo
          digitalWrite(Led_Rosso, HIGH);
          digitalWrite(Led_Verde, LOW);              
        }
        else { // Produzione <= Consumo
          digitalWrite(Led_Rosso, LOW);
          digitalWrite(Led_Verde, HIGH);          
        }            
        AMax1 = 0;
        AMax2 = 0;          
        cyccnt = 0;               
        while(digitalRead(Sync) == LOW){
        } 
        stcur = 1;
      }
    }
  }    
  else {
    if (digitalRead(Sync) == 0){
      stcur = 0;
    }
  } 
  sensorValue = analogRead(Volt_pin);
  if(sensorValue>MaxVolt) {
    MaxVolt=sensorValue;
  } 
  sensorValue = analogRead(Amp1_pin);
  if(sensorValue
    MinAmp1=sensorValue; 
  }
  if(sensorValue>MaxAmp1){
    MaxAmp1=sensorValue;
    MaxVerso1 = stcur;
  } 
  sensorValue = analogRead(Amp2_pin);
  if(sensorValue
    MinAmp2=sensorValue;  
  }
  if(sensorValue>MaxAmp2){
    MaxAmp2=sensorValue;
    MaxVerso2 = stcur;
  }
}                                                                                                                                                      

Progetto connesso: Portale di visualizzazione prestazioni di impianto fotovoltaico.