Add INA226 for solar and generator
This commit is contained in:
parent
612a68c74c
commit
c43797fef2
|
@ -41,7 +41,7 @@
|
||||||
#define FONT3 "Ubuntu_Bold32pt7b"
|
#define FONT3 "Ubuntu_Bold32pt7b"
|
||||||
#define FONT4 "DSEG7Classic_BoldItalic80pt7b"
|
#define FONT4 "DSEG7Classic_BoldItalic80pt7b"
|
||||||
|
|
||||||
// GPS (NEO-6M)
|
// GPS (NEO-6M, NEO-M8N)
|
||||||
#define OBP_GPS_TX 35 // Read only GPS data
|
#define OBP_GPS_TX 35 // Read only GPS data
|
||||||
// TTP229 Touch Pad Controller (!!No I2C!!)
|
// TTP229 Touch Pad Controller (!!No I2C!!)
|
||||||
#define TTP_SDO 25
|
#define TTP_SDO 25
|
||||||
|
|
|
@ -69,7 +69,9 @@ void sensorTask(void *param){
|
||||||
Adafruit_BMP085 bmp085; // Evironment sensor BMP085 and BMP180
|
Adafruit_BMP085 bmp085; // Evironment sensor BMP085 and BMP180
|
||||||
HTU21D sht21(HTU21D_RES_RH12_TEMP14); // Environment sensor SHT21 and HTU21
|
HTU21D sht21(HTU21D_RES_RH12_TEMP14); // Environment sensor SHT21 and HTU21
|
||||||
AMS_5600 as5600; // Rotation sensor AS5600
|
AMS_5600 as5600; // Rotation sensor AS5600
|
||||||
INA226 ina226_1(INA226_I2C_ADDR1);// Power management sensor INA226
|
INA226 ina226_1(INA226_I2C_ADDR1);// Power management sensor INA226 Battery
|
||||||
|
INA226 ina226_2(INA226_I2C_ADDR2);// Power management sensor INA226 Solar
|
||||||
|
INA226 ina226_3(INA226_I2C_ADDR3);// Power management sensor INA226 Generator
|
||||||
|
|
||||||
// Init sensor stuff
|
// Init sensor stuff
|
||||||
bool gps_ready = false; // GPS initialized and ready to use
|
bool gps_ready = false; // GPS initialized and ready to use
|
||||||
|
@ -79,6 +81,8 @@ void sensorTask(void *param){
|
||||||
bool SHT21_ready = false; // SHT21 initialized and ready to use
|
bool SHT21_ready = false; // SHT21 initialized and ready to use
|
||||||
bool AS5600_ready = false; // AS5600 initialized and ready to use
|
bool AS5600_ready = false; // AS5600 initialized and ready to use
|
||||||
bool INA226_1_ready = false; // INA226_1 initialized and ready to use
|
bool INA226_1_ready = false; // INA226_1 initialized and ready to use
|
||||||
|
bool INA226_2_ready = false; // INA226_2 initialized and ready to use
|
||||||
|
bool INA226_3_ready = false; // INA226_3 initialized and ready to use
|
||||||
|
|
||||||
// Create integer arrays for average building
|
// Create integer arrays for average building
|
||||||
const int avgsize = 300;
|
const int avgsize = 300;
|
||||||
|
@ -215,14 +219,21 @@ void sensorTask(void *param){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Settings for power amangement sensors INA226 #1 on I2C bus
|
// Settings for power amangement sensors INA226 #1 for Battery on I2C bus
|
||||||
String powsensor1 = api->getConfig()->getConfigItem(api->getConfig()->usePowSensor1, true)->asString();
|
String powsensor1 = api->getConfig()->getConfigItem(api->getConfig()->usePowSensor1, true)->asString();
|
||||||
String shunt1 = api->getConfig()->getConfigItem(api->getConfig()->shunt1, true)->asString();
|
String shunt1 = api->getConfig()->getConfigItem(api->getConfig()->shunt1, true)->asString();
|
||||||
|
// Settings for power amangement sensors INA226 #1 for Solar on I2C bus
|
||||||
|
String powsensor2 = api->getConfig()->getConfigItem(api->getConfig()->usePowSensor2, true)->asString();
|
||||||
|
String shunt2 = api->getConfig()->getConfigItem(api->getConfig()->shunt2, true)->asString();
|
||||||
|
// Settings for power amangement sensors INA226 #1 for Generator on I2C bus
|
||||||
|
String powsensor3 = api->getConfig()->getConfigItem(api->getConfig()->usePowSensor3, true)->asString();
|
||||||
|
String shunt3 = api->getConfig()->getConfigItem(api->getConfig()->shunt3, true)->asString();
|
||||||
|
|
||||||
float shuntResistor = 1.0; // Default value for shunt resistor
|
float shuntResistor = 1.0; // Default value for shunt resistor
|
||||||
float maxCurrent = 10.0; // Default value for max. current
|
float maxCurrent = 10.0; // Default value for max. current
|
||||||
float corrFactor = 1; // Correction factor for fix calibration
|
float corrFactor = 1; // Correction factor for fix calibration
|
||||||
|
|
||||||
|
// Battery sensor initialisation
|
||||||
if(String(powsensor1) == "INA226"){
|
if(String(powsensor1) == "INA226"){
|
||||||
if (!ina226_1.begin()){
|
if (!ina226_1.begin()){
|
||||||
api->getLogger()->logDebug(GwLog::ERROR,"Modul 1 INA226 not found, check wiring");
|
api->getLogger()->logDebug(GwLog::ERROR,"Modul 1 INA226 not found, check wiring");
|
||||||
|
@ -231,7 +242,7 @@ void sensorTask(void *param){
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Modul 1 INA226 found");
|
api->getLogger()->logDebug(GwLog::LOG,"Modul 1 INA226 found");
|
||||||
shuntResistor = SHUNT_VOLTAGE / float(shunt1.toInt()); // Calculate shunt resisitor for max. shunt voltage 75mV
|
shuntResistor = SHUNT_VOLTAGE / float(shunt1.toInt()); // Calculate shunt resisitor for max. shunt voltage 75mV
|
||||||
maxCurrent = shunt1.toFloat();
|
maxCurrent = shunt1.toFloat();
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Calibation INA226, Imax:%3.0fA Rs:%7.5fOhm Us:%5.3f", maxCurrent, shuntResistor, SHUNT_VOLTAGE);
|
api->getLogger()->logDebug(GwLog::LOG,"Calibation Modul 2 INA226, Imax:%3.0fA Rs:%7.5fOhm Us:%5.3f", maxCurrent, shuntResistor, SHUNT_VOLTAGE);
|
||||||
// ina226_1.setMaxCurrentShunt(maxCurrent, shuntResistor);
|
// ina226_1.setMaxCurrentShunt(maxCurrent, shuntResistor);
|
||||||
ina226_1.setMaxCurrentShunt(10, 0.01); // Calibration with fix values (because the original values outer range)
|
ina226_1.setMaxCurrentShunt(10, 0.01); // Calibration with fix values (because the original values outer range)
|
||||||
corrFactor = (maxCurrent / 10) * (0.001 / shuntResistor) / (maxCurrent / 100); // Correction factor for fix calibration
|
corrFactor = (maxCurrent / 10) * (0.001 / shuntResistor) / (maxCurrent / 100); // Correction factor for fix calibration
|
||||||
|
@ -247,6 +258,48 @@ void sensorTask(void *param){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Solar sensor initialisation
|
||||||
|
if(String(powsensor2) == "INA226"){
|
||||||
|
if (!ina226_2.begin()){
|
||||||
|
api->getLogger()->logDebug(GwLog::ERROR,"Modul 2 INA226 not found, check wiring");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Modul 2 INA226 found");
|
||||||
|
shuntResistor = SHUNT_VOLTAGE / float(shunt2.toInt()); // Calculate shunt resisitor for max. shunt voltage 75mV
|
||||||
|
maxCurrent = shunt2.toFloat();
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Calibation Modul 2 INA226, Imax:%3.0fA Rs:%7.5fOhm Us:%5.3f", maxCurrent, shuntResistor, SHUNT_VOLTAGE);
|
||||||
|
// ina226_1.setMaxCurrentShunt(maxCurrent, shuntResistor);
|
||||||
|
ina226_2.setMaxCurrentShunt(10, 0.01); // Calibration with fix values (because the original values outer range)
|
||||||
|
corrFactor = (maxCurrent / 10) * (0.001 / shuntResistor) / (maxCurrent / 100); // Correction factor for fix calibration
|
||||||
|
sensors.solarVoltage = ina226_2.getBusVoltage();
|
||||||
|
sensors.solarCurrent = ina226_2.getCurrent() * corrFactor;
|
||||||
|
sensors.solarPower = ina226_2.getPower() * corrFactor;
|
||||||
|
// Fill average arrays with start values
|
||||||
|
INA226_2_ready = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generator sensor initialisation
|
||||||
|
if(String(powsensor3) == "INA226"){
|
||||||
|
if (!ina226_3.begin()){
|
||||||
|
api->getLogger()->logDebug(GwLog::ERROR,"Modul 3 INA226 not found, check wiring");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Modul 3 INA226 found");
|
||||||
|
shuntResistor = SHUNT_VOLTAGE / float(shunt3.toInt()); // Calculate shunt resisitor for max. shunt voltage 75mV
|
||||||
|
maxCurrent = shunt3.toFloat();
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Calibation Modul 3 INA226, Imax:%3.0fA Rs:%7.5fOhm Us:%5.3f", maxCurrent, shuntResistor, SHUNT_VOLTAGE);
|
||||||
|
// ina226_1.setMaxCurrentShunt(maxCurrent, shuntResistor);
|
||||||
|
ina226_3.setMaxCurrentShunt(10, 0.01); // Calibration with fix values (because the original values outer range)
|
||||||
|
corrFactor = (maxCurrent / 10) * (0.001 / shuntResistor) / (maxCurrent / 100); // Correction factor for fix calibration
|
||||||
|
sensors.generatorVoltage = ina226_3.getBusVoltage();
|
||||||
|
sensors.generatorCurrent = ina226_3.getCurrent() * corrFactor;
|
||||||
|
sensors.generatorPower = ina226_3.getPower() * corrFactor;
|
||||||
|
// Fill average arrays with start values
|
||||||
|
INA226_3_ready = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int rotoffset = api->getConfig()->getConfigItem(api->getConfig()->rotOffset,true)->asInt();
|
int rotoffset = api->getConfig()->getConfigItem(api->getConfig()->rotOffset,true)->asInt();
|
||||||
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
double voffset = (api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asString()).toFloat();
|
||||||
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
double vslope = (api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asString()).toFloat();
|
||||||
|
@ -255,7 +308,10 @@ void sensorTask(void *param){
|
||||||
long starttime5 = millis(); // Voltage update all 1s
|
long starttime5 = millis(); // Voltage update all 1s
|
||||||
long starttime6 = millis(); // Environment sensor update all 1s
|
long starttime6 = millis(); // Environment sensor update all 1s
|
||||||
long starttime7 = millis(); // Rotation sensor update all 500ms
|
long starttime7 = millis(); // Rotation sensor update all 500ms
|
||||||
long starttime8 = millis(); // Power management sensor update all 1s
|
long starttime8 = millis(); // Battery power sensor update all 1s
|
||||||
|
long starttime9 = millis(); // Solar power sensor update all 1s
|
||||||
|
long starttime10 = millis(); // Generator power sensor update all 1s
|
||||||
|
|
||||||
|
|
||||||
tN2kMsg N2kMsg;
|
tN2kMsg N2kMsg;
|
||||||
shared->setSensorData(sensors); //set initially read values
|
shared->setSensorData(sensors); //set initially read values
|
||||||
|
@ -413,7 +469,7 @@ void sensorTask(void *param){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send power management value all 1s
|
// Send battery power value all 1s
|
||||||
if(millis() > starttime8 + 1000 && (String(powsensor1) == "INA219" || String(powsensor1) == "INA226")){
|
if(millis() > starttime8 + 1000 && (String(powsensor1) == "INA219" || String(powsensor1) == "INA226")){
|
||||||
starttime8 = millis();
|
starttime8 = millis();
|
||||||
if(String(powsensor1) == "INA226" && INA226_1_ready == true){
|
if(String(powsensor1) == "INA226" && INA226_1_ready == true){
|
||||||
|
@ -455,6 +511,66 @@ void sensorTask(void *param){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send solar power value all 1s
|
||||||
|
if(millis() > starttime9 + 1000 && (String(powsensor2) == "INA219" || String(powsensor2) == "INA226")){
|
||||||
|
starttime9 = millis();
|
||||||
|
if(String(powsensor2) == "INA226" && INA226_2_ready == true){
|
||||||
|
double voltage = ina226_2.getBusVoltage();
|
||||||
|
// Limiter for voltage average building
|
||||||
|
if(voltage < 0){
|
||||||
|
voltage = 0;
|
||||||
|
}
|
||||||
|
if(voltage > 30){
|
||||||
|
voltage = 30;
|
||||||
|
}
|
||||||
|
sensors.solarVoltage = voltage;
|
||||||
|
sensors.solarCurrent = ina226_2.getCurrent() * corrFactor;
|
||||||
|
// Eliminates bit jitter by zero current values
|
||||||
|
float factor = maxCurrent / 100;
|
||||||
|
if(sensors.solarCurrent >= (-0.015 * factor) && sensors.solarCurrent <= (0.015 * factor)){
|
||||||
|
sensors.solarCurrent = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate power value
|
||||||
|
sensors.solarPower = sensors.solarVoltage * sensors.solarCurrent; // more stable
|
||||||
|
}
|
||||||
|
// Send solar live data to NMEA200 bus
|
||||||
|
if(!isnan(sensors.solarVoltage) && !isnan(sensors.solarCurrent)){
|
||||||
|
SetN2kDCBatStatus(N2kMsg, 1, sensors.solarVoltage, sensors.solarCurrent, N2kDoubleNA, 1);
|
||||||
|
api->sendN2kMessage(N2kMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send generator power value all 1s
|
||||||
|
if(millis() > starttime10 + 1000 && (String(powsensor3) == "INA219" || String(powsensor3) == "INA226")){
|
||||||
|
starttime10 = millis();
|
||||||
|
if(String(powsensor3) == "INA226" && INA226_3_ready == true){
|
||||||
|
double voltage = ina226_3.getBusVoltage();
|
||||||
|
// Limiter for voltage average building
|
||||||
|
if(voltage < 0){
|
||||||
|
voltage = 0;
|
||||||
|
}
|
||||||
|
if(voltage > 30){
|
||||||
|
voltage = 30;
|
||||||
|
}
|
||||||
|
sensors.generatorVoltage = voltage;
|
||||||
|
sensors.generatorCurrent = ina226_3.getCurrent() * corrFactor;
|
||||||
|
// Eliminates bit jitter by zero current values
|
||||||
|
float factor = maxCurrent / 100;
|
||||||
|
if(sensors.generatorCurrent >= (-0.015 * factor) && sensors.generatorCurrent <= (0.015 * factor)){
|
||||||
|
sensors.generatorCurrent = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate power value
|
||||||
|
sensors.generatorPower = sensors.generatorVoltage * sensors.generatorCurrent; // more stable
|
||||||
|
}
|
||||||
|
// Send solar live data to NMEA200 bus
|
||||||
|
if(!isnan(sensors.generatorVoltage) && !isnan(sensors.generatorCurrent)){
|
||||||
|
SetN2kDCBatStatus(N2kMsg, 2, sensors.generatorVoltage, sensors.generatorCurrent, N2kDoubleNA, 1);
|
||||||
|
api->sendN2kMessage(N2kMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
shared->setSensorData(sensors);
|
shared->setSensorData(sensors);
|
||||||
}
|
}
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
|
|
Loading…
Reference in New Issue