Allego lo scketch da caricare sull'esp8266 e lo schema di collegamento per collegarlo al regolatore ep solar serie RN.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
//------------------------- Parametri wi-fi Esp8266
IPAddress ip(192, 168, 1, 20);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
char server[] = "www.solare.altervista.org";
WiFiClient client;
//-------------------------- Setta le varibili
const char* ssid = "SSID";
const char* password = "password";
String strURL = "";
String strEsito = "";
int tensione_pannello;
int corrente_pannello;
int tensione_batteria;
int corrente_batteria;
int tensione_carico;
int corrente_carico;
unsigned long ah_prodotti;
unsigned long ah_consumati;
unsigned long lettura_ah_prodotti;
unsigned long lettura_ah_consumati;
int data_long = 0;
int data[50];
int temperatura;
int soc = 100;
unsigned long ah_batteria;
const unsigned long capacita_batteria = 300000000; //indica la capacità della batteria in carica in micro Ah
//--------------------------- Pin di uscita digitali
const int led_pin = 2; // pin di uscita dedicato al led di stato funzionamento
//--------------------------- Variabili di temporizzazione
unsigned long time_Ah_old = 0;
unsigned long lastTime = 0; //variabile di temporizzazione
const int postingInterval = 3500;
//---------------------------
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);
}
}
bool update()
{
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;
lettura_ah_consumati = ((float)corrente_carico / 3600) * (millis() - time_Ah_old) * 10; //restituisce la lettura in micro Ah
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;
time_Ah_old = millis();
calcolo_soc();
return true;
}
else
{
return false;
}
}
void httpRequest() {
client.stop();
if (client.connect(server, 80)) {
String strURL = "GET /arduino/arduino.php?psw=5678&tensione_pannello=";
strURL += (int)tensione_pannello;
strURL += "&corrente_pannello=";
strURL += (int)corrente_pannello;
strURL += "&tensione_batteria=";
strURL += (int)tensione_batteria;
strURL += "&corrente_batteria=";
strURL += (int)corrente_batteria;
strURL += "&tensione_carico=";
strURL += (int)tensione_carico;
strURL += "&corrente_carico=";
strURL += (int)corrente_carico;
strURL += "&soc=";
strURL += (int)soc;
strURL += "&temperatura=";
strURL += (int)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.println("Host: solare.altervista.org");
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("reset_ah") > 0)
{
ah_consumati = 0;
ah_prodotti = 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 setup()
{
Serial.begin(9600);
pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, HIGH);
pinMode(0, OUTPUT);
digitalWrite(0, LOW);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
delay(5000);
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=1234 HTTP/1.1";
client.println(strURL);
client.println("Host: solare.altervista.org");
client.println("User-Agent: arduino-ethernet");
client.println("Connection: close");
client.println();
delay(1000);
rispostaServer();
}
else
{
while(true);
}
ArduinoOTA.begin();
}
void loop() {
rispostaServer();
if (millis() - lastTime >= postingInterval)
{
if (update() == false)
{
lastTime = millis();
}
else {
httpRequest();
lastTime = millis();
}
}
ArduinoOTA.handle();
}
Non sono riuscito a testarlo per il problema che ho avuto con il regolatore, appena posso farò un test ma dovrebbe funzionare. Mi sono accertato che la comunicazione seriale è a 3.3V. credevo fosse a 5V, forse questa cosa ha contribuito a danneggiare il mio regolatore. Con l'esp8266 non dovrebbero esserci problemi in quanto la comunicazione seriale va a 3.3V.
riporto il pin out del connettore:
Pins Role
1 +12v
2 GND
3 +12V
4 GND
5 TXD(3.3V)
6 RXD(3.3V)
7 GND
8 GND