EnergiAlternativa

Page Index Toggle Pages: 1 ... 18 19 [20] 21 22 ... 42 Send TopicPrint
Very Hot Topic (More than 500 Replies) Monitoraggio regolatori Ep Solar tracer dal web (Read 345784 times)
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #285 - 22.11.16 at 17:58:05
Print Post  
Ciao e benvenuto su EA!
Sono contento che sei riuscito a replicare il progetto! Le implementazioni che chiedi sono possibili, per la temperatura basterà controllare che se supera i 30° un pin digitale di arduino andrà a livello logico 1.Per accendere invece un carico consideriamo un livello di tensione oltre la quale accendere i carichi per poi spegnerli sotto un livello minimo?
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #286 - 22.11.16 at 18:10:21
Print Post  
Esatto, proprio così!!

attualmente per accendere i due miseri faretti, dovevano essere 6w l'uno a 12volt, che ho collegato in serie per farli andare a 24, ma che sono si e no 2w  Cheesy, sono comandati dal regolatore mppt, con la funzione dal tramonto all'alba. A regime vorrei utilizzare l'uscita regolatore sempre attiva, (in modo da lasciare al regolatore il controllo tensione minima delle batterie per non danneggiarle) da qui alcuni relè comandati da arduino:
- luci primarie che si attivano quando la tensione dei pannelli arriva a 0v
- ventilazione quando la T arriva ad una certa soglia
- eventuali lampade aggiuntive, quando la produzione è molto maggiore (es estate)
- pompa di irrigazione durante il giorno, quando le batterie sono cariche

insomma ho tanti buoni propositi, ma non ho idea di dove inserire gli "if" senza fare danni, visto che il monitoraggio funziona egregiamente ed è uno spettacolo!!!

  
Back to top
 
IP Logged
 
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #287 - 22.11.16 at 20:28:01
Print Post  
Taglio wrote on 22.11.16 at 18:10:21:
insomma ho tanti buoni propositi, ma non ho idea di dove inserire gli "if" senza fare danni, visto che il monitoraggio funziona egregiamente ed è uno spettacolo!!!

Facile... basta programmare una funzione che monitora i parametri che ci interessano e setta/resetta i pin digitali di arduino.

esempio:
Code (C++)
Select All
void controlloPin()
{
  if(tensione_pannello < 5)
  {
    digitalWrite(pin_luciPrimarie, HIGH);// accende le luci primarie
  }
  else if(tensione_pannello > 10)
  {
    digitalWrite(pin_luciPrimarie, LOW);// spegne le luci primarie
  }
}

void loop() {

  rispostaServer();

  if (millis() - lastTime >= postingInterval)
  {
    if (update() == false)
    {
      stato = 2;
      lastTime = millis();
    }
    else {
      httpRequest();
      controlloPin();
      lastTime = millis();
    }
  }
  else
  {
    ledStato(stato);
  }
}
 



Naturalmente alla variabile "pin_luciPrimarie" va associato un pin libero di arduino che va correttamente inizializzato nel setup.

E' solo uno spunto per iniziare... Roll Eyes
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #288 - 23.11.16 at 07:34:47
Print Post  
grandissimo Danye, sabato provo ad inserire il codice, con arduino non sono molto pratico, vado meglio con stagnatore e cacciaviti..
quindi void controllo_pin lo inserisco prima di void loop
nel void loop esistente integro gli ulteriori comandi.

immagino qualcosa di simile per la ventilazione.

Per le lampade aggiuntive, cosa ne pensi di verificare la produzione di Ah prodotti nel giorno, se maggiore di una certa soglia (assorbimento delle sole luci primarie, che è un dato costante), accenderà anche le luci secondarie. così il bilancio energetico sulle batterie dovrebbe rimanere sempre positivo, giusto?

per la pompa di irrigazione (è una sentina nautica, da 100w) che si accenderà di giorno, non ho idea se sia meglio controllare anche in questo caso Ah_prodotti > (luci primarie + luci secondarie), o direttamente quando il soc è al 100%, se scende al 99-98% la spegne (e secco le piante della moglie  Grin)


  
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #289 - 24.11.16 at 19:14:54
Print Post  
vi chiedo info
ho notato che la casella Amp prodotti giornalmente, decresce degli Amp consumati giornalmente, forse ho impostato male qualcosa.
esempio a fine giornata prodotti 10ah, ne consumo 2, il giorno dopo quando verifico, trovo 8ah prodotti il giorno precedente

ieri invece il contatore si è azzerato, credo si tratti del bug già risolto nei post sopra, sostituendo 5000 allo 0, che però da ignorante non ho capito cosa controlla...

grazie per le indicazioni
  
Back to top
 
IP Logged
 
Gigi600
Full Member
***
Offline


New EALab Member

Posts: 187
Location: Pordenone
Gender: Male
Zodiac sign: Scorpio
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #290 - 24.11.16 at 20:56:02
Print Post  
Non è solo quello bisogna sostituire altro
Prova con questo non lo ho testato su arduino ma solo con esp8266
ho fatto un po di copia e incolla spero di averlo fatto giusto  Wink

Code (C++)
Select All
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

//------------------------- Settaggi
IPAddress ip(192, 168, 178, 40);//indirizzo ip da assegnare ad arduino
char server[] = "tuosito.altervista.org";//indirizzo del server web
int unsigned long  capacita_batteria = 300; //indica la capacità della batteria in carica in Ah
const int psw = 1234; //password per l'aggiornamento dati server web
const int psw2 = 5678; //password per sincronizzazione ah server web
const char* regolatore = "bn"; //bn=regolatori serie BN ---- rn=regolatori serie RN
//solo per la serie BN alla riga 337  ah_prodotti = 5000;  per la serie RN mettere ah_prodotti = 0
//-------------------------- Fine settaggi

EthernetClient client;
String strURL = "";
String strEsito = "";
int tensione_pannello;
int corrente_pannello;
int tensione_batteria;
int corrente_batteria;
int tensione_carico;
int corrente_carico;
int data_long = 0;
int data[50];
int temperatura;
int soc = 100;
unsigned long ah_prodotti;
unsigned long ah_consumati;
unsigned long lettura_ah_prodotti;
unsigned long lettura_ah_consumati;
unsigned long ah_batteria;

//--------------------------- Pin di uscita digitali
const int led_pin = 5; // pin di uscita dedicato al stato di segnalazione di funzionamento

//--------------------------- Variabili di temporizzazione
unsigned long time_Ah_old = 0;
unsigned long lastTime = 0; //variabile di temporizzazione
const int postingInterval = 3500;

//---------------------------
int stato = 1;

void setup()
{
  if (regolatore == "bn")
  {
    Serial.begin(115200);
  }
  else
  {
    Serial.begin(9600);
  }
  pinMode(4, OUTPUT); // disattiva il pin della SD card
  digitalWrite(4, HIGH);
  pinMode(led_pin, OUTPUT);
  Ethernet.begin(mac, ip);
  delay(5000);

  capacita_batteria = capacita_batteria * 1000000;
  ah_batteria = capacita_batteria; // fa partire il soc dal 100%


  if (client.connect(server, 80)) { // Interroga il server per avere gli ultimi Ah salvati
    String strURL = "GET /arduino/arduino.php?psw=";
    strURL += psw2;
    strURL += " HTTP/1.1";
    client.println(strURL);
    client.print("Host: ");
    client.println(server);
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    delay(1000);
    rispostaServer();
  }
  else
  {
    while (true);
  }
}

bool update()
{
  bool updok = false;
  if (regolatore == "bn")
  {
    //tensione batteria
    Serial.write(0x01);
    Serial.write(0x04);
    Serial.write(0x31);
    Serial.write(0x04);
    Serial.write(0x00);
    Serial.write(0x01);
    Serial.write(0x7E);
    Serial.write(0xF7);
    delay(500);
    if (Serial.available())
    {
      data_long = Serial.available();
      for (int n = 0; n < data_long; n++)
      {
        data[n] = Serial.read();
      }
      tensione_batteria = (data[3] << 8) | data[4];

      //tensione pannello
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x00);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x3F);
      Serial.write(0x36);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        tensione_pannello = (data[3] << 8) | data[4];
      }

      //corrente batteria
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x33);
      Serial.write(0x1B);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x4E);
      Serial.write(0x89);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_batteria = (data[3] << 8) | data[4];
      }

      //corrente pannello
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x01);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x6E);
      Serial.write(0xF6);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_pannello = (data[3] << 8) | data[4];
      }

      //corrente carico
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x0D);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0xAE);
      Serial.write(0xF5);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_carico = (data[3] << 8) | data[4];
      }

      //temperatura
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x10);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x3E);
      Serial.write(0xF3);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        temperatura = (data[3] << 8) | data[4];
        temperatura = temperatura / 100;
      }
      updok = true;
    }
  }
  else if (regolatore == "rn")
  {
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0x16);
    Serial.write(0xA0);
    Serial.write(0x00);
    Serial.write(0xB1);
    Serial.write(0xA7);
    Serial.write(0x7F);
    delay(500);
    if (Serial.available())
    {
      data_long = Serial.available();
      for (int n = 0; n < data_long; n++)
      {
        data[n] = Serial.read();
      }
      tensione_pannello = (data[12] << 8) | data[11];
      corrente_pannello = 0;
      tensione_batteria = (data[10] << 8) | data[9];
      corrente_batteria = (data[31] << 8) | data[30];
      tensione_carico = tensione_batteria;
      corrente_carico = (data[16] << 8) | data[15];
      temperatura = data[29] - 30;
      updok = true;
    }
    }
  tensione_carico = tensione_batteria;
  if(updok)
  {
  lettura_ah_consumati = ((float)corrente_carico / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
 
  if(regolatore == "bn")
  {
    int totAmpereProdotti = corrente_batteria + corrente_carico;
    lettura_ah_prodotti = ((float)totAmpereProdotti / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
  }
  else if (regolatore == "rn")
  {
    lettura_ah_prodotti = ((float)corrente_batteria / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
  }
 
  ah_consumati += lettura_ah_consumati;
  ah_prodotti += lettura_ah_prodotti;
    calcolo_soc();
  }
  time_Ah_old = millis();
  return updok;
}

void calcolo_soc() {
  ah_batteria += (lettura_ah_prodotti - lettura_ah_consumati);
  if (ah_batteria > capacita_batteria) {
    ah_batteria = capacita_batteria;
    soc = 100;
  } else {
    soc = map((float)ah_batteria / 1000000, 0, (float)capacita_batteria / 1000000, 0, 100);
  }
}

void httpRequest() {
  client.stop();
  if (client.connect(server, 80)) {
    String strURL = "GET /arduino/arduino.php?psw=";
    strURL += (int)psw;
    strURL += "&tensione_pannello=";
    strURL += (int)tensione_pannello;
    strURL += "&corrente_pannello=";
    strURL += (int)corrente_pannello;
    strURL += "&tensione_batteria=";
    strURL += (int)tensione_batteria;
    strURL += "&corrente_batteria=";
    strURL += (short)corrente_batteria;
    strURL += "&tensione_carico=";
    strURL += (int)tensione_carico;
    strURL += "&corrente_carico=";
    strURL += (int)corrente_carico;
    strURL += "&soc=";
    strURL += (int)soc;
    strURL += "&temperatura=";
    strURL += (short)temperatura;
    strURL += "&ah_consumati=";
    strURL += (unsigned long)ah_consumati;
    strURL += "&ah_prodotti=";
    strURL += (unsigned long)ah_prodotti;
    strURL += " HTTP/1.1";
    client.println(strURL);
    client.print("Host: ");
    client.println(server);
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  }
}

void rispostaServer()
{
  int risp_server = client.available();
  if (risp_server < 300 && risp_server > 10) {
    while (client.available())
    {
      char c = client.read();
      strEsito += (char) c;
    }
    if (strEsito.indexOf("update_ok") > 0)
    {
      stato = 1;
    }
    else
    {
      stato = 3;
    }
    if (strEsito.indexOf("reset_ah") > 0)
    {
      ah_consumati = 0;
     ah_prodotti = 5000; //solo per la serie BN 5000 , per la serie RN mettere 0
    }
    if (strEsito.indexOf("Ah_prodotti=") > 0) // Recupera dal server gli ultimi valori del giorno salvati prima del reset di arduino.
    {
      ah_prodotti = atol(strEsito.substring(strEsito.indexOf("Ah_prodotti=") + 12, strEsito.indexOf(" Ah_consumati=")).c_str());
      ah_consumati = atol(strEsito.substring(strEsito.indexOf("Ah_consumati=") + 13, strEsito.indexOf(" endAh")).c_str());
    }
  }
  strEsito = "";
}

void ledStato(int st)
{

  switch (st)
  {
    case 1: // Nessun errore di funzionamento
      for (int i = 1; i <= 1; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 2: // Impossibile leggere i dati dal regolatore
      for (int i = 1; i <= 2; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 3: // Errore di comunicazone con il server remoto
      for (int i = 1; i <= 3; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 4: // Attesa reset ethernet shield
      for (int i = 1; i <= 4; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;
  }
  delay(1000);
}

void loop() {

  rispostaServer();

  if (millis() - lastTime >= postingInterval)
  {
    if (update() == false)
    {
      stato = 2;
      lastTime = millis();
    }
    else {
      httpRequest();
      lastTime = millis();
    }
  }
  else
  {
    ledStato(stato);
  }
}

 



« Last Edit: 25.11.16 at 20:01:58 by danye »  

Impianto installato a 1460 Mt alimenta una stazione meteo +  2 webcam+ accessori vari.
un panello 230 Watt ,regolatore Tracer 2210RN ,3 Batterie per totale di 215 Ah
http://solaresacile.altervista.org/
Tracer Ep Solar 2215 BN
http://gigi600.altervista.org/index.php
http://sacilemeteo.altervista.org/fv/
Back to top
IP Logged
 
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #291 - 25.11.16 at 20:04:41
Print Post  
Grazie Gigi ho aggiornato il primo post con lo scketch corretto! Wink
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #292 - 28.11.16 at 08:12:56
Print Post  
grazie ragazzi, sabato ho caricato lo sketch aggiornato (arduino + BN), la lettura istantanea è ancora corretta, ma a fine giornata ha resettato nuovamente la produzione e consumi in Ah. Ieri mattina non ha creato il giorno 27/11, e ho ricaricato nuovamente, appena ho resettato la eth ha ricominciato a calcolare gli Ah nella giornata corretta. questa mattina idem.. sicuramente sono brocco io..

per ora ho modificato i valori direttamente sul DB di altervista con i valori delle ultime letture..

ho notato anche una cosa, quando carico lo sketch, non parte immediatamente la lettura, ma dopo un paio d'ore, resettando la eth (sono momenti di delusione, non capendo il 50% del codice non so cosa stia facendo!!), non si vedono blinkare i led tx/rx sul convertitore 485/232. Ho pensato fosse un problema di alimentazione, utilizzando i 5v che escono dal regolatore MPPT per alimentare arduino, ma anche collegando alim esterno ha fatto uguale. forse è colpa di arduino dagli occhi troppo a mandorla.

  
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #293 - 29.11.16 at 18:16:28
Print Post  
anche oggi, il grafico è stato copiato dal giorno precedente ed a fine produzione dei pannelli ed accensione del carico, gli ah prodotti decrementano degli ah consumati.. sto cercando sempre più di capire lo sketch, ma non ci arrivo  Cry
ho notato una differenza tra ESP funzionante di Gigi ed Arduino in queste righe:
Code (C++)
Select All
     if (strEsito.indexOf("Ah_prodotti=") > 0) // Recupera dal server gli ultimi valori del giorno salvati prima del reset di arduino.
    {
      ah_prodotti = atol(strEsito.substring(strEsito.indexOf("Ah_prodotti=") + 12, strEsito.indexOf(" Ah_consumati=")).c_str());
      ah_consumati = atol(strEsito.substring(strEsito.indexOf("Ah_consumati=") + 13, strEsito.indexOf(" endAh")).c_str());
    }
  }
  strEsito = "";
} 



la A maiuscola e minuscola in Ah_consumati e prodotti, potrebbe essere questo?
  
Back to top
 
IP Logged
 
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #294 - 30.11.16 at 12:15:45
Print Post  
@Taglio posta per favore lo scketch che usi su arduino che controlliamo.
Per l'alimentazione di arduino non usare assolutamente i 5V del regolatore, ma usa uno stepdown collegato come dai schemi al primo post! Wink
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #295 - 30.11.16 at 13:52:09
Print Post  
Grazie Daniele, Ti posto lo scketch in test su Arduino. Per l'alimentazione provvedo ad usare il dc-dc.
Code (C++)
Select All
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

//------------------------- Settaggi
IPAddress ip(192, 168, 1, 253);//indirizzo ip da assegnare ad arduino
char server[] = "taglioweb.altervista.org";//indirizzo del server web
int unsigned long  capacita_batteria = 200; //indica la capacità della batteria in carica in Ah
const int psw = xxxx; //password per l'aggiornamento dati server web
const int psw2 = xxxx; //password per sincronizzazione ah server web
const char* regolatore = "bn"; //bn=regolatori serie BN ---- rn=regolatori serie RN
//solo per la serie BN alla riga 337  ah_prodotti = 5000;  per la serie RN mettere ah_prodotti = 0
//-------------------------- Fine settaggi

EthernetClient client;
String strURL = "";
String strEsito = "";
int tensione_pannello;
int corrente_pannello;
int tensione_batteria;
int corrente_batteria;
int tensione_carico;
int corrente_carico;
int data_long = 0;
int data[50];
int temperatura;
int soc = 100;
unsigned long ah_prodotti;
unsigned long ah_consumati;
unsigned long lettura_ah_prodotti;
unsigned long lettura_ah_consumati;
unsigned long ah_batteria;

//--------------------------- Pin di uscita digitali
const int led_pin = 5; // pin di uscita dedicato al stato di segnalazione di funzionamento

//--------------------------- Variabili di temporizzazione
unsigned long time_Ah_old = 0;
unsigned long lastTime = 0; //variabile di temporizzazione
const int postingInterval = 3500;

//---------------------------
int stato = 1;

void setup()
{
  if (regolatore == "bn")
  {
    Serial.begin(115200);
  }
  else
  {
    Serial.begin(9600);
  }
  pinMode(4, OUTPUT); // disattiva il pin della SD card
  digitalWrite(4, HIGH);
  pinMode(led_pin, OUTPUT);
  Ethernet.begin(mac, ip);
  delay(5000);

  capacita_batteria = capacita_batteria * 1000000;
  ah_batteria = capacita_batteria; // fa partire il soc dal 100%


  if (client.connect(server, 80)) { // Interroga il server per avere gli ultimi Ah salvati
    String strURL = "GET /arduino/arduino.php?psw=";
    strURL += psw2;
    strURL += " HTTP/1.1";
    client.println(strURL);
    client.print("Host: ");
    client.println(server);
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    delay(1000);
    rispostaServer();
  }
  else
  {
    while (true);
  }
}

bool update()
{
  bool updok = false;
  if (regolatore == "bn")
  {
    //tensione batteria
    Serial.write(0x01);
    Serial.write(0x04);
    Serial.write(0x31);
    Serial.write(0x04);
    Serial.write(0x00);
    Serial.write(0x01);
    Serial.write(0x7E);
    Serial.write(0xF7);
    delay(500);
    if (Serial.available())
    {
      data_long = Serial.available();
      for (int n = 0; n < data_long; n++)
      {
        data[n] = Serial.read();
      }
      tensione_batteria = (data[3] << 8) | data[4];

      //tensione pannello
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x00);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x3F);
      Serial.write(0x36);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        tensione_pannello = (data[3] << 8) | data[4];
      }

      //corrente batteria
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x33);
      Serial.write(0x1B);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x4E);
      Serial.write(0x89);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_batteria = (data[3] << 8) | data[4];
      }

      //corrente pannello
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x01);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x6E);
      Serial.write(0xF6);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_pannello = (data[3] << 8) | data[4];
      }

      //corrente carico
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x0D);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0xAE);
      Serial.write(0xF5);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        corrente_carico = (data[3] << 8) | data[4];
      }

      //temperatura
      Serial.write(0x01);
      Serial.write(0x04);
      Serial.write(0x31);
      Serial.write(0x10);
      Serial.write(0x00);
      Serial.write(0x01);
      Serial.write(0x3E);
      Serial.write(0xF3);
      delay(500);
      if (Serial.available())
      {
        data_long = Serial.available();
        for (int n = 0; n < data_long; n++)
        {
          data[n] = Serial.read();
        }
        temperatura = (data[3] << 8) | data[4];
        temperatura = temperatura / 100;
      }
      updok = true;
    }
  }
  else if (regolatore = "rn")
  {
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xAA);
    Serial.write(0x55);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0xEB);
    Serial.write(0x90);
    Serial.write(0x16);
    Serial.write(0xA0);
    Serial.write(0x00);
    Serial.write(0xB1);
    Serial.write(0xA7);
    Serial.write(0x7F);
    delay(500);
    if (Serial.available())
    {
      data_long = Serial.available();
      for (int n = 0; n < data_long; n++)
      {
        data[n] = Serial.read();
      }
      tensione_pannello = (data[12] << 8) | data[11];
      corrente_pannello = 0;
      tensione_batteria = (data[10] << 8) | data[9];
      corrente_batteria = (data[31] << 8) | data[30];
      tensione_carico = tensione_batteria;
      corrente_carico = (data[16] << 8) | data[15];
      temperatura = data[29] - 30;
      updok = true;
    }
    }
  tensione_carico = tensione_batteria;
  if(updok)
  {
  lettura_ah_consumati = ((float)corrente_carico / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah

  if(regolatore == "bn")
  {
    int totAmpereProdotti = corrente_batteria + corrente_carico;
    lettura_ah_prodotti = ((float)totAmpereProdotti / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
  }
  else if (regolatore == "rn")
  {
    lettura_ah_prodotti = ((float)corrente_batteria / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
  }

  ah_consumati += lettura_ah_consumati;
  ah_prodotti += lettura_ah_prodotti;
    calcolo_soc();
  }
  time_Ah_old = millis();
  return updok;
}

void calcolo_soc() {
  ah_batteria += (lettura_ah_prodotti - lettura_ah_consumati);
  if (ah_batteria > capacita_batteria) {
    ah_batteria = capacita_batteria;
    soc = 100;
  } else {
    soc = map((float)ah_batteria / 1000000, 0, (float)capacita_batteria / 1000000, 0, 100);
  }
}

void httpRequest() {
  client.stop();
  if (client.connect(server, 80)) {
    String strURL = "GET /arduino/arduino.php?psw=";
    strURL += (int)psw;
    strURL += "&tensione_pannello=";
    strURL += (int)tensione_pannello;
    strURL += "&corrente_pannello=";
    strURL += (int)corrente_pannello;
    strURL += "&tensione_batteria=";
    strURL += (int)tensione_batteria;
    strURL += "&corrente_batteria=";
    strURL += (short)corrente_batteria;
    strURL += "&tensione_carico=";
    strURL += (int)tensione_carico;
    strURL += "&corrente_carico=";
    strURL += (int)corrente_carico;
    strURL += "&soc=";
    strURL += (int)soc;
    strURL += "&temperatura=";
    strURL += (short)temperatura;
    strURL += "&ah_consumati=";
    strURL += (unsigned long)ah_consumati;
    strURL += "&ah_prodotti=";
    strURL += (unsigned long)ah_prodotti;
    strURL += " HTTP/1.1";
    client.println(strURL);
    client.print("Host: ");
    client.println(server);
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  }
}

void rispostaServer()
{
  int risp_server = client.available();
  if (risp_server < 300 && risp_server > 10) {
    while (client.available())
    {
      char c = client.read();
      strEsito += (char) c;
    }
    if (strEsito.indexOf("update_ok") > 0)
    {
      stato = 1;
    }
    else
    {
      stato = 3;
    }
    if (strEsito.indexOf("reset_ah") > 0)
    {
      ah_consumati = 0;
     ah_prodotti = 5000; //solo per la serie BN 5000 , per la serie RN mettere 0
    }
    if (strEsito.indexOf("Ah_prodotti=") > 0) // Recupera dal server gli ultimi valori del giorno salvati prima del reset di arduino.
    {
      ah_prodotti = atol(strEsito.substring(strEsito.indexOf("Ah_prodotti=") + 12, strEsito.indexOf(" Ah_consumati=")).c_str());
      ah_consumati = atol(strEsito.substring(strEsito.indexOf("Ah_consumati=") + 13, strEsito.indexOf(" endAh")).c_str());
    }
  }
  strEsito = "";
}

void ledStato(int st)
{

  switch (st)
  {
    case 1: // Nessun errore di funzionamento
      for (int i = 1; i <= 1; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 2: // Impossibile leggere i dati dal regolatore
      for (int i = 1; i <= 2; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 3: // Errore di comunicazone con il server remoto
      for (int i = 1; i <= 3; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;

    case 4: // Attesa reset ethernet shield
      for (int i = 1; i <= 4; i++)
      {
        digitalWrite(led_pin, HIGH);
        delay(50);
        digitalWrite(led_pin, LOW);
        delay(500);
      }
      break;
  }
  delay(1000);
}

void loop() {

  rispostaServer();

  if (millis() - lastTime >= postingInterval)
  {
    if (update() == false)
    {
      stato = 2;
      lastTime = millis();
    }
    else {
      httpRequest();
      lastTime = millis();
    }
  }
  else
  {
    ledStato(stato);
  }
}

  



è quello della prima pagina del post.
una differenza che ho notato con quello di Gigi per ESP sono le A maiuscole/minuscole, ma il compilatore in entrambi i casi non restituisce errori.

grazie
fabio
  
Back to top
 
IP Logged
 
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #296 - 02.12.16 at 13:56:02
Print Post  
Allora lo scketch sembra giusto a parte la riga 211 che è così:
Code (C++)
Select All
else if (regolatore = "rn")
 



va modificata così

Code (C++)
Select All
else if (regolatore == "rn")
 



in pratica devi aggiungere un altro "="

Fammi sapere.
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Taglio
New Member
*
Offline


New EALab Member

Posts: 23
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #297 - 02.12.16 at 15:34:06
Print Post  
Ottimo, domani provo, quindi le A maiuscole/minuscole non influiscono.
quando il conteggio degli amp prodotti e consumati funziona,  procedo con l'aggiunta del controllo pin aggiuntivi, a tal proposito pensavo di controllare:
1) luci primarie (hanno assorbimento che anche in inverno i pannelli coprono) quindi utilizzo solo la soglia tensione dei pannelli, in stile crepuscolare
2) luci secondarie, funzioneranno sempre con buio, ma solo se i pannelli durante il giorno hanno prodotto oltre una certa soglia
3) carico extra diurno (pompa irrigazione...) solo quando le batterie saranno già cariche

per il punto 1, mi hai già dato la soluzione. Per il punto 2, il dato ah_prodotti rimane disponibile su arduino o alle 00:00 si resetta e quindi spegne il carico secondario? credi sia una buona idea?
Per il punto 3, direi di utilizzare SOC sopra al 98-99% solo con pannelli in produzione.

Vi aggiorno sugli sviluppi

grazie ancora

p.s. domani accendo anche l'albero di natale a basso impatto energetico!


  
Back to top
 
IP Logged
 
sponn
New Member
*
Offline


New EALab Member

Posts: 4
Location: CZ
Gender: Male
Zodiac sign: Aquarius
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #298 - 07.12.16 at 23:18:46
Print Post  
Hello. I would like to thank Danye, the author of this project, for his perfect work. I made use of  that myself and learned a lot. Thank you again. This is the result: http://www.ppasweb.mzf.cz/

  

www.ppasweb.mzf.cz
Ep Solar 2215BN, Solar panel 250W, battery 150Ah.
Back to top
 
IP Logged
 
danye
Global Moderator
*****
Offline


--------

Posts: 360
Location: Roma
Gender: Male
Zodiac sign: Moonchild
Re: Monitoraggio regolatori Ep Solar tracer dal web
Reply #299 - 09.12.16 at 08:40:55
Print Post  
sponn wrote on 07.12.16 at 23:18:46:
Hello. I would like to thank Danye, the author of this project, for his perfect work. I made use of  that myself and learned a lot. Thank you again. This is the result: http://www.ppasweb.mzf.cz/


Wow! Hai usato arduino o esp8266?
Che regolatore hai, BN o RN?
  

1x185Wp  + 1x225Wp in serie poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015RN
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
monitoraggio impianto www.solare.altervista.org
Back to top
 
IP Logged
 
Page Index Toggle Pages: 1 ... 18 19 [20] 21 22 ... 42
Send TopicPrint
 

TOP100-SOLAR Galleria Immagini EnergiAlternativa