//#include #include "BatteryMonitor.h" #include "BoardCfg.h" #include "timer.h" #include "ina219.h" #include "WiFiCtrl.h" #include "I2C.h" float mBatteryVoltage; int mBatteryCurrent; int mBatterySOC; float mVoltageMeanSum; int mVoltageMeanCount; unsigned int mCurrentMeanSum; int mCurrentMeanCount; bool mCurrentModuleOK; void InitBatteryMonitor() { mBatteryVoltage = 0; mBatteryCurrent = 0; mBatterySOC = 0; mVoltageMeanCount = 0; mCurrentMeanCount = 0; mCurrentModuleOK = true; TimerStart(BATTERY_MONITOR_TIMER,100); //experimental stuff! mVoltageMeanSum = 0.0; mVoltageMeanCount = 0; // if(ina219Init() == RET_ERROR) // { // mCurrentModuleOK = false; // } //ina219SetCalibration_16V_500mA(); // ina219SetCalibration_16V_200mA(); } void BatteryMonitorTick() { static int NetworkSendCounter; //Every second (10 counts) we want to send the battery data. if(IsTimerExpired(BATTERY_MONITOR_TIMER)) { unsigned int adc; double conv, raw; AD1CHSbits.CH0SA = 1; //AN1 AD1CON1bits.SAMP = 0; while(AD1CON1bits.DONE == 0); adc = ADC1BUF0; AD1CON1bits.SAMP = 1; // adc &= 0xFFFE; conv = (float)adc / 1023; conv *= 3.36; raw = conv; conv *= 11; //avoid rollovers in case the LORA network gets disconnected. //This could go for a long time but 5000 samples is too much anyways. if(mVoltageMeanCount >= 5000) { mVoltageMeanCount = 0; mVoltageMeanSum = conv; } else { mVoltageMeanCount++; mVoltageMeanSum += conv; } mBatteryVoltage = conv; TimerStart(BATTERY_MONITOR_TIMER,100); if(mCurrentModuleOK == true) { // mBatteryCurrent = ina219GetCurrent_mA(); // if(I2CWasLastTransactionOK() == 0 ) // { // mCurrentModuleOK = false; // } } else { unsigned int Ref = 0; AD1CHSbits.CH0SA = 0; //AN0 AD1CON1bits.SAMP = 0; while(AD1CON1bits.DONE == 0); Ref = ADC1BUF0; AD1CON1bits.SAMP = 1; AD1CHSbits.CH0SA = 2; //AN2 AD1CON1bits.SAMP = 0; while(AD1CON1bits.DONE == 0); adc = ADC1BUF0; AD1CON1bits.SAMP = 1; // adc &= 0xFFFE; adc -= Ref; conv = (double)adc * 1.0; conv /= 1023; conv *= 3.3; //Volts conv /= 0.05; //Amps (50mV/A) raw = conv; //avoid rollovers in case the LORA network gets disconnected. //This could go for a long time but 5000 samples is too much anyways. if(mCurrentMeanCount >= 500) { mCurrentMeanCount = 1; mCurrentMeanSum = adc; } else { mCurrentMeanCount++; mCurrentMeanSum += adc; } mBatteryCurrent = adc; //mBatteryCurrent = mCurrentMeanSum / mCurrentMeanCount; } } } float GetBatteryVoltage(int Reset) { if(Reset == 1) { mBatteryVoltage = (mVoltageMeanSum/mVoltageMeanCount); mVoltageMeanSum = 0.0; mVoltageMeanCount = 0; } return mBatteryVoltage; } int GetSolarPanelCurrent() { //mBatteryCurrent = (mCurrentMeanSum/mCurrentMeanCount); //mVoltageMeanCount = 0; mCurrentMeanSum = 0.0; return mBatteryCurrent; } float GetConvertedSolarPanelCurrent() { float Cur = (mBatteryCurrent - 2) * (3.3/1023); return Cur; } int GetBatterySOC() { return mBatterySOC; } int SendNetworkBatteryData() { // int VoltageMilliVolts = (int)(mBatteryVoltage * 1000); // int BattCurrent = mBatteryCurrent; // // char BatData[10]; // BatData[0] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 1 // VoltageMilliVolts >>= 8; // BatData[1] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 2 // BatData[2] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 1 // BattCurrent >>= 8; // BatData[3] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 2 // // SendNetworkData(BatData,4); printf("Battery voltage: %f\n",mBatteryVoltage); } bool GetCurrentModuleOK() { return mCurrentModuleOK; }