StrathbogieBrewing / VEDirect

Arduino interface for VE.Direct Hex protocol
MIT License
15 stars 7 forks source link

How can I use a variable of type sn16, un8, un16 sns32? #10

Open IG-Jack opened 5 months ago

IG-Jack commented 5 months ago

How can I use a variable of type sn16, un8, un16 sns32? I need it to obtain temperature or current data but I don't get any data. I need help as soon as possible.

include "VEDirect.h"

include

const char ssid = "jack"; // Nombre de tu red WiFi const char password = "j.120387"; // Contraseña de tu red WiFi

unsigned long lastConnectionTime = 0; const unsigned long connectionInterval = 10000;
// Constantes para los pines del VE Direct Plug //const int VE_DIRECT_RX = 2; // Conecta al pin TX1 del Arduino //const int VE_DIRECT_TX = 3; // Conecta al pin RX1 del Arduino

// Declaración de la instancia de VEDirect y las variables globales void mpptCallback(uint16_t id, int32_t value); VEDirect mppt(Serial1, mpptCallback); uint16_t batteryVoltage = 0; sns32 batteryCurrent = 0; int32_t batteryPower = 0; sns32 batteryTemperature = 0; int32_t panelPower = 0; uint16_t panelCurrent = 0; uint16_t panelMaximumVoltage = 0; uint16_t panelVoltage = 0; sns16 chargerTemperature = 0;

void setup() { Serial.begin(115200); mppt.begin(); connectToWiFi(); }

void loop() { // Temporizador para enviar ping cada segundo static unsigned long secondsTimer = 0; mppt.update(); unsigned long currentMillis = millis(); if (currentMillis - secondsTimer > 1000L) { secondsTimer = currentMillis; mppt.ping(); // Envía ping cada segundo }

// Verificar si la conexión WiFi está activa if (WiFi.status() != WL_CONNECTED) { Serial.println("Conexión WiFi perdida. Intentando reconectar..."); connectToWiFi(); } }

// Función de retorno de llamada para procesar los datos recibidos void mpptCallback(uint16_t id, int32_t value) { // Actualiza las variables globales según el ID recibido switch (id) { case VEDirect_kBatteryVoltage: // un16 batteryVoltage = value 0.01; Serial.print(F("Voltaje Batería: ")); Serial.println(batteryVoltage); break; case VEDirect_kBatteryCurrent: // sns32 batteryCurrent = value 0.001; Serial.print(F("Corriente Batería: ")); Serial.println(batteryCurrent); break; case VEDirect_kBatteryPower: // un32 batteryPower = value 0.01; Serial.print(F("Potencia Batería: ")); Serial.println(batteryPower); break; case VEDirect_kBatteryTemperature: // sns32 batteryTemperature = value 0.01; Serial.print(F("Temperatura Batería: ")); Serial.println(batteryTemperature); break; case VEDirect_kPanelCurrent: // un16 panelCurrent = value 0.1; Serial.print(F("Corriente Panel: ")); Serial.println(panelCurrent); break; case VEDirect_kPanelPower: // un32 panelPower = value 0.01; Serial.print(F("Potencia Panel: ")); Serial.println(panelPower); break; case VEDirect_kPanelVoltage: // un16 panelVoltage = value 0.01; Serial.print(F("Voltaje Panel: ")); Serial.println(panelVoltage); break; case VEDirect_kPanelMaximumVoltage: // un16 panelMaximumVoltage = value 0.01; Serial.print(F("Voltaje Máximo Panel: ")); Serial.println(panelMaximumVoltage); break; case VEDirect_kChargerTemperature: // sns16 chargerTemperature = value * 0.01; Serial.print(F("Temperatura Cargador: ")); Serial.println(chargerTemperature); break; // Agregar otros casos según sea necesario default: // Manejar otros IDs si es necesario break; } }

void connectToWiFi() { Serial.println(); Serial.print("Conectando a la red WiFi "); Serial.println(ssid);

WiFi.begin(ssid, password);

unsigned long startTime = millis(); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (millis() - startTime > 10000) { Serial.println("Fallo al conectar. Reintentando..."); return; } }

Serial.println(""); Serial.println("Conexión WiFi establecida"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); }

ifndef VEDIRECTH

define VEDIRECTH

include "Arduino.h"

include "ved.h"

define VEDirect_kBatteryVoltage (0x2002)

define VEDirect_kBatteryCurrent (0x200A)

define VEDirect_kBatteryPower (0x2027)

define VEDirect_kBatteryTemperature (0x2003)

define VEDirect_kPanelPower (0xEDBC)

define VEDirect_kPanelVoltage (0xEDBB)

define VEDirect_kPanelCurrent (0xEDBD)

define VEDirect_kPanelMaximumVoltage (0xEDB8)

define VEDirect_kChargerTemperature (0xEDDB)

typedef int16_t sns16; typedef int32_t sns32;

typedef void (*receiveCallback)(uint16_t id, int32_t value);

class VEDirect { public: VEDirect(HardwareSerial &serial, receiveCallback receive); void begin(); void update(); size_t set(uint16_t id, int32_t value); size_t get(uint16_t id); size_t ping(); size_t restart(); private: HardwareSerial &serialPort; receiveCallback rxCallback; ved_t rxBuffer; };

endif // VEDIRECTH

StrathbogieBrewing commented 5 months ago

Not all VEDirect functions/registers are implemented (only the ones I required at the time of writing) It is for the reader to add any that they require. Changes need to be made in both VEDirect.h and VEDirect.cpp to handle additional registers.