El problema que tengo es que no consigo mostrar la información que recibo por el puerto serie en una pantalla, para tener un monitor de estados del sistema foto-voltaico.
El dispositivo encargado de darme la información es Victron MPPT 75|15.
Dispone de un puerto de comunicación serie establecido 19200,8,1,n con cuatro pin de salida 5v/tx/rx/Gnd donde entrega cada segundo las medidas/estados.
PID 0xA042<CR><LF>
FW 123<CR><LF>
SER# HQ16429Q39Z<CR><LF>
V 13640<CR><LF>
I 1290<CR><LF>
VPV 37350<CR><LF>
PPV 18<CR><LF>
CS 5<CR><LF>
ERR 0<CR><LF>
LOAD ON<CR><LF>
IL 0<CR><LF>
H19 10<CR><LF>
H20 1<CR><LF>
H21 39<CR><LF>
H22 0<CR><LF>
H23 46<CR><LF>
HSDS 11<CR><LF>
Checksum ƒ<CR><LF>
Con la librería SoftwareSerial consigo reconocer toda la información y pasarla al puerto serie, mostrando la información por Monitor Serie de arduino, bien todo perfecto…
El problema es cuando intento mostrar esta información por el KS0108, solo consigo las primeras tres etiquetas.
PID, SER, FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;
Pensando que podría ser por la carga de las librerías gráficas, y la necesidad de leer bit a bit la trama que entrega Victron MPPT 75|15 procesada por otra librería SoftwareSerial decidí que la solución seria cambiar de dispositivo gráfico.
Si utilizo el LCD5110 consigo una linea mas, es decir mostrar cuatro etiquetas, fracaso no es la solución, retomamos el KS0108.
Retiramos del código la librería SoftwareSerial para descargar de procesos, conectamos directamente al puerto tx/rx arduino, y el resultado es la misma que en el caso del LCD5110 consigo una linea mas, es decir mostrar cuatro etiquetas.
Conclusión solicitar ayuda, ¿donde esta fallando mi código?.
/*
* Kacitran >-< Recolector de datos Victron MPPT 75|15.
* v0.15
*
CONCEPTOS BASICOS SERIE -> http://forum.arduino.cc/index.php?topic=396450.0
TIPOS DE DATOS -> http://arduino.cl/introduccion-a-los-tipos-de-dato-con-arduino/
string.h -> http://www.cplusplus.com/reference/cstring/
MPPT 75|15
_____________
| _ 20 _ |
|_____________|
________________________
| 4 3 2 1 |
| . . . . |
| VCC TX RX GND |
| (RED) (YEL)(WHI)(BLK) |
| _______ |
|_______| |________|
*/
#include "U8glib.h"
#include <SoftwareSerial.h>
U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
//SoftwareSerial PuertoUno (2, 3);// software serial: RX = digital pin 2, TX = digital pin 3
int FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;
//int PID, SER, FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;
const byte NumeroCaracter = 250;//30
char LeerCaracter[NumeroCaracter]; // matriz para almacenar los datos recibidos
boolean NuevosDatos = false;
const char * VictronDatos[] = {"FW", "V", "I", "VPV", "PPV", "CS", "ERR", "LOAD", "IL", "H19", "H20", "H21", "H22", "H23", "HSDS"};
//const char * VictronDatos[] = {"PID", "SER", "FW", "V", "I", "VPV", "PPV", "CS", "ERR", "LOAD", "IL", "H19", "H20", "H21", "H22", "H23", "HSDS"};
const unsigned int TodosVictronDatos = sizeof(VictronDatos) / sizeof(*VictronDatos);
void setup() {
Serial.begin(19200);
// PuertoUno.begin(19200);
u8g.setFont(u8g_font_5x7); //u8g.setFont(u8g_font_unifont);
u8g.setRot180(); // Rotacion de pantalla 180º
u8g.setColorIndex(1); // Panel monocromo
}
void draw() // informacion display
{
u8g.firstPage();
do {
u8g.drawStr( 0, 6," V ->");
u8g.setPrintPos(25,6);
u8g.print(String(V));
u8g.print("mV");
u8g.setPrintPos(65,6);
u8g.print(String(FW));
u8g.drawStr( 85, 6,"Version");
u8g.drawStr( 0, 13," I ->");
u8g.setPrintPos(25,13);
u8g.print(String(I));
u8g.drawStr( 0, 20,"VPV->");
u8g.setPrintPos(25,20);
u8g.print(String(VPV));
u8g.print("mV");
u8g.drawStr( 0, 27,"PPV->");
u8g.setPrintPos(25,27);
u8g.print(String(PPV));
u8g.drawStr( 0, 34,"CS ->");
u8g.setPrintPos(25,34);
u8g.print(String(CS));
u8g.drawStr( 0, 41,"Err->");
u8g.setPrintPos(25,41);
u8g.print(String(ERR));
u8g.drawStr( 0, 48,"LOAD>");
u8g.setPrintPos(25,48);
u8g.print(String(LOAD));
u8g.drawStr( 0, 55,"IL ->");
u8g.setPrintPos(25,55);
u8g.print(String(IL));
u8g.drawStr( 0, 62,"H19->");
u8g.setPrintPos(25,62);
u8g.print(String(H19));
} while( u8g.nextPage() );
delay(1);
}
void loop()
{
RecolectorDatos();
if (NuevosDatos) // línea completa, tratar
{
AnalizarNuevosDatos();
NuevosDatos = false;
}
}
void RecolectorDatos()
{
static byte ndx = 0;
char IndicadorFinal = '\n';
char caracter;
while (Serial.available() > 0 && NuevosDatos == false)
{
caracter = Serial.read();
if (caracter != '\r')
{ // Ignoramos este caracter
if (caracter != IndicadorFinal)
{
if (caracter == '\t') caracter = ' '; // CAmbiamos las pestañas en un solo espacio
LeerCaracter[ndx] = caracter;
ndx++; // Vamos al siguiente espacio en nuestro buffer
if (ndx >= NumeroCaracter)
{ // Y comprobar los límites.
ndx = NumeroCaracter - 1; // that means we will loose the end of long strings
}
}
else
{
LeerCaracter[ndx] = '\0'; // Terminar la cadena
ndx = 0; // ndx Es estático, así que nos preparamos para el siguiente turno
NuevosDatos = true;
}
}
}
}
void AnalizarNuevosDatos()
{
const char *delim = " ";
char * item;
boolean EtiquetaEncontrada;
long int DatoEtiqueta;
int IndiceEtiqueta;
item = strtok (LeerCaracter, delim);
EtiquetaEncontrada = false;
for (int i = 0; i < TodosVictronDatos; ++i)
{
if (!strcmp(VictronDatos[i], item))
{
item = strtok(NULL, delim);
if (item != NULL)
{
EtiquetaEncontrada = true;
IndiceEtiqueta = i;
DatoEtiqueta = atol(item);
break; // Termina el bucle for cuando encontramos una etiqueta
} // Final si teníamos un valor para la etiqueta
} // Cadena final comparar
} // fin del for
if (EtiquetaEncontrada) {
switch (IndiceEtiqueta) {
/*
case 0:
PID = DatoEtiqueta;
break;
*/
case 0:
FW = DatoEtiqueta;
break;
case 1:
V = DatoEtiqueta;
//Serial.print("v Voltage Bateria ");
//Serial.print(F("02 V -> "));
//Serial.println(V);
//Serial.println(F("mV"));
break;
case 2:
I = DatoEtiqueta;
break;
case 3:
VPV = DatoEtiqueta;
break;
case 4:
PPV = DatoEtiqueta;
break;
case 5:
CS = DatoEtiqueta;
break;
case 6:
ERR = DatoEtiqueta;
break;
case 7:
LOAD = DatoEtiqueta;
break;
case 8:
IL = DatoEtiqueta;
break;
case 9:
H19 = DatoEtiqueta;
break;
case 10:
H20 = DatoEtiqueta;
break;
case 11:
H21 = DatoEtiqueta;
break;
case 12:
H22 = DatoEtiqueta;
break;
case 13:
H23 = DatoEtiqueta;
break;
case 14:
HSDS = DatoEtiqueta;
break;
}
}
else {
}
draw();
}
Gracias de antemano por dedicarme vuestro tiempo.