2025-03-21 09:59:09 +01:00

261 lines
12 KiB
C++

/**
*
* @license MIT License
*
* Copyright (c) 2025 lewis he
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @file BQ27220_GaugeExample.ino
* @author Lewis He (lewishe@outlook.com)
* @date 2025-02-13
*
*/
#include <Wire.h>
#include <SPI.h>
#include <Arduino.h>
#include <GaugeBQ27220.hpp>
#ifndef SENSOR_SDA
#define SENSOR_SDA 2
#endif
#ifndef SENSOR_SCL
#define SENSOR_SCL 3
#endif
GaugeBQ27220 gauge;
void setup()
{
Serial.begin(115200);
while (!Serial);
if (!gauge.begin(Wire, SENSOR_SDA, SENSOR_SCL)) {
Serial.println("Failed to BQ27220 - check your wiring!");
while (1) {
delay(1000);
}
}
Serial.println("Init BQ27220 Sensor success!");
/**
* @brief Set the new design capacity and full charge capacity of the battery.
*
* This function is responsible for updating the design capacity and full charge capacity of the battery.
* It first checks the device's access settings, enters the configuration update mode, writes the new capacity values
* and checksums, and finally exits the configuration update mode. If the device was previously in a sealed state,
* it will be restored to the sealed mode after the operation is completed.
* For new devices, use the default key for access. If it is an encrypted device, use setAccessKey(uint32_t key) to set the key.
* @param newDesignCapacity The new design capacity to be set, of type uint16_t.
* @param newFullChargeCapacity The new full charge capacity to be set, of type uint16_t.
* @return bool Returns true if the setting is successful, false otherwise.
*/
// uint32_t key = 0x12345678;
// gauge.setAccessKey(key)
uint16_t newDesignCapacity = 3500;
uint16_t newFullChargeCapacity = 3500;
gauge.setNewCapacity(newDesignCapacity, newFullChargeCapacity);
OperationConfig config = gauge.getOperationConfig();
//* OperationConfig A *//
Serial.print("OperationConfigA Values:0x");
Serial.println(config.getConfigA(), HEX);
Serial.print("External Thermistor Selected: ");
Serial.println(config.isTempsSet() ? "YES" : "NO");
Serial.print("BATT_GD Pin Polarity High: ");
Serial.println(config.isBatgPolHigh() ? "YES" : "NO");
Serial.print("BATT_GD Function Enabled: ");
Serial.println(config.isBatgEnEnabled() ? "YES" : "NO");
Serial.print("Can Enter SLEEP State: ");
Serial.println(config.canEnterSleep() ? "YES" : "NO");
Serial.print("slpwakechg Function Enabled: ");
Serial.println(config.isSlpwakechgEnabled() ? "YES" : "NO");
Serial.print("Write Temperature Function Enabled: ");
Serial.println(config.isWrtempEnabled() ? "YES" : "NO");
Serial.print("Battery Insertion Detection Enabled: ");
Serial.println(config.isBienableEnabled() ? "YES" : "NO");
Serial.print("Battery Insertion Pin Pull - Up Enabled: ");
Serial.println(config.isBlPupEnEnabled() ? "YES" : "NO");
Serial.print("Pin Function Code (PFC) Mode: ");
Serial.println(config.getPfcCfg());
Serial.print("Wake - Up Function Enabled: ");
Serial.println(config.isWakeEnEnabled() ? "YES" : "NO");
Serial.print("Wake - Up Threshold 1: ");
Serial.println(config.getWkTh1());
Serial.print("Wake - Up Threshold 0: ");
Serial.println(config.getWkTh0());
//* OperationConfig B *//
Serial.print("\nOperationConfigB Values:0x");
Serial.println(config.getConfigB(), HEX);
Serial.print("Default Seal Option Enabled: ");
Serial.println(config.isDefaultSealEnabled() ? "YES" : "NO");
Serial.print("Non - Removable Option Set: ");
Serial.println(config.isNonRemovableSet() ? "YES" : "NO");
Serial.print("INT_BREM Function Enabled: ");
Serial.println(config.isIntBremEnabled() ? "YES" : "NO");
Serial.print("INT_BATL Function Enabled: ");
Serial.println(config.isIntBatLEnabled() ? "YES" : "NO");
Serial.print("INT_STATE Function Enabled: ");
Serial.println(config.isIntStateEnabled() ? "YES" : "NO");
Serial.print("INT_OCV Function Enabled: ");
Serial.println(config.isIntOcvEnabled() ? "YES" : "NO");
Serial.print("INT_OT Function Enabled: ");
Serial.println(config.isIntOtEnabled() ? "YES" : "NO");
Serial.print("INT_POL Function Enabled (High - Level Polarity): ");
Serial.println(config.isIntPolHigh() ? "YES" : "NO");
Serial.print("INT_FOCV Function Enabled: ");
Serial.println(config.isIntFocvEnabled() ? "YES" : "NO");
delay(10000);
}
void loop()
{
uint32_t startMeasTime = millis();
if (gauge.refresh()) {
uint32_t endMesTime = millis();
Serial.print("Polling time: "); Serial.print(endMesTime - startMeasTime); Serial.println(" ms");
Serial.println("\nStandard query:");
Serial.print("\t- AtRate:"); Serial.print(gauge.getAtRate()); Serial.println(" mA");
Serial.print("\t- AtRateTimeToEmpty:"); Serial.print(gauge.getAtRateTimeToEmpty()); Serial.println(" minutes");
Serial.print("\t- Temperature:"); Serial.print(gauge.getTemperature() ); Serial.println("");
Serial.print("\t- BatteryVoltage:"); Serial.print(gauge.getVoltage()); Serial.println(" mV");
Serial.print("\t- InstantaneousCurrent:"); Serial.print(gauge.getCurrent()); Serial.println(" mAh");
Serial.print("\t- RemainingCapacity:"); Serial.print(gauge.getRemainingCapacity()); Serial.println(" mAh");
Serial.print("\t- FullChargeCapacity:"); Serial.print(gauge.getFullChargeCapacity()); Serial.println(" mAh");
Serial.print("\t- DesignCapacity:"); Serial.print(gauge.getDesignCapacity()); Serial.println(" mAh");
Serial.print("\t- TimeToEmpty:"); Serial.print(gauge.getTimeToEmpty()); Serial.println(" minutes");
Serial.print("\t- TimeToFull:"); Serial.print(gauge.getTimeToFull()); Serial.println(" minutes");
Serial.print("\t- StandbyCurrent:"); Serial.print(gauge.getStandbyCurrent()); Serial.println(" mA");
Serial.print("\t- StandbyTimeToEmpty:"); Serial.print(gauge.getStandbyTimeToEmpty()); Serial.println(" minutes");
Serial.print("\t- MaxLoadCurrent:"); Serial.print(gauge.getMaxLoadCurrent()); Serial.println(" mA");
Serial.print("\t- MaxLoadTimeToEmpty:"); Serial.print(gauge.getMaxLoadTimeToEmpty()); Serial.println(" minute");
Serial.print("\t- RawCoulombCount:"); Serial.print(gauge.getRawCoulombCount()); Serial.println(" mAh");
Serial.print("\t- AveragePower:"); Serial.print(gauge.getAveragePower()); Serial.println(" mW");
Serial.print("\t- InternalTemperature:"); Serial.print(gauge.getInternalTemperature()); Serial.println("");
Serial.print("\t- CycleCount:"); Serial.println(gauge.getCycleCount());
Serial.print("\t- StateOfCharge:"); Serial.print(gauge.getStateOfCharge()); Serial.println(" %");
Serial.print("\t- StateOfHealth:"); Serial.print(gauge.getStateOfHealth()); Serial.println(" %");
Serial.print("\t- RequestChargingVoltage:"); Serial.print(gauge.getRequestChargingVoltage()); Serial.println(" mV");
Serial.print("\t- RequestChargingCurrent:"); Serial.print(gauge.getRequestChargingCurrent()); Serial.println(" mA");
Serial.print("\t- BTPDischargeSet:"); Serial.print(gauge.getBTPDischargeSet()); Serial.println(" mAh");
Serial.print("\t- BTPChargeSet:"); Serial.print(gauge.getBTPChargeSet()); Serial.println(" mAh");
FuelGaugeOperationStatus status = gauge.getOperationStatus();
BatteryStatus batteryStatus = gauge.getBatteryStatus();
Serial.println("\nOperation Status:");
Serial.print("\t- getIsConfigUpdateMode:"); Serial.println(status.getIsConfigUpdateMode() ? "YES" : "NO");
Serial.print("\t- getIsBtpThresholdExceeded:"); Serial.println(status.getIsBtpThresholdExceeded() ? "YES" : "NO");
Serial.print("\t- getIsCapacityAccumulationThrottled:"); Serial.println(status.getIsCapacityAccumulationThrottled() ? "YES" : "NO");
Serial.print("\t- getIsInitializationComplete:"); Serial.println(status.getIsInitializationComplete() ? "YES" : "NO");
Serial.print("\t- getIsDischargeCycleCompliant:"); Serial.println(status.getIsDischargeCycleCompliant() ? "YES" : "NO");
Serial.print("\t- getIsBatteryVoltageBelowEdv2:"); Serial.println(status.getIsBatteryVoltageBelowEdv2() ? "YES" : "NO");
Serial.print("\t- getSecurityAccessLevel:"); Serial.println(status.getSecurityAccessLevel());
Serial.print("\t- getIsCalibrationModeEnabled:"); Serial.println(status.getIsCalibrationModeEnabled() ? "YES" : "NO");
Serial.println("\nBattery Status:");
if (batteryStatus.isFullDischargeDetected()) {
Serial.println("\t- Full discharge detected.");
}
if (batteryStatus.isOcvMeasurementUpdateComplete()) {
Serial.println("\t- OCV measurement update is complete.");
}
if (batteryStatus.isOcvReadFailedDueToCurrent()) {
Serial.println("\t- Status bit indicating that an OCV read failed due to current.");
Serial.println("\tThis bit can only be set if a battery is present after receiving an OCV_CMD().");
}
if (batteryStatus.isInSleepMode()) {
Serial.println("\t- The device operates in SLEEP mode");
}
if (batteryStatus.isOverTemperatureDuringCharging()) {
Serial.println("\t- Over-temperature is detected during charging.");
}
if (batteryStatus.isOverTemperatureDuringDischarge()) {
Serial.println("\t- Over-temperature detected during discharge condition.");
}
if (batteryStatus.isFullChargeDetected()) {
Serial.println("\t- Full charge detected.");
}
if (batteryStatus.isChargeInhibited()) {
Serial.println("\t- Charge Inhibit: If set, indicates that charging should not begin because the Temperature() is outside the range");
Serial.println("\t[Charge Inhibit Temp Low, Charge Inhibit Temp High]. ");
}
if (batteryStatus.isChargingTerminationAlarm()) {
Serial.println("\t- Termination of charging alarm. This flag is set and cleared based on the selected SOC Flag Config A option.");
}
if (batteryStatus.isGoodOcvMeasurement()) {
Serial.println("\t- A good OCV measurement was made.");
}
if (batteryStatus.isBatteryInserted()) {
Serial.println("\t- Detects inserted battery.");
}
if (batteryStatus.isBatteryPresent()) {
Serial.println("\t- Battery presence detected.");
}
if (batteryStatus.isDischargeTerminationAlarm()) {
Serial.println("\t- Termination discharge alarm. This flag is set and cleared according to the selected SOC Flag Config A option.");
}
if (batteryStatus.isSystemShutdownRequired()) {
Serial.println("\t- System shutdown bit indicating that the system should be shut down. True when set. If set, the SOC_INT pin toggles once.");
}
if (batteryStatus.isInDischargeMode()) {
Serial.println("\t- When set, the device is in DISCHARGE mode; when cleared, the device is in CHARGING or RELAXATION mode.");
}
Serial.println("===============================================");
}
delay(3000);
}