Grazie Daniele, Ti posto lo scketch in test su Arduino. Per l'alimentazione provvedo ad usare il dc-dc.
#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