This code controls a battery balancer for a two-battery system. It runs well but none of the functions are called automatically if variables like the one below are changed:
CloudElectricPotential battery01Voltage;
CloudElectricPotential totalBatteryVoltage;
CloudElectricPotential voltageDifference;
It only works because I call all necessary functions under certain conditions, from within loop().
// Wenn fünf Messungen durchgeführt wurden
if (measurementCount == numMeasurements) {
// Berechne den Mittelwert
float avgBattery01Voltage = 0;
float avgTotalBatteryVoltage = 0;
for (int i = 0; i < numMeasurements; i++) {
avgBattery01Voltage += (measurementsBattery01[i] / 1023.0) * 5.0 * ((10.0 + 3.3) / 3.3);
avgTotalBatteryVoltage += (measurementsTotalBattery[i] / 1023.0) * 5.0 * ((10.0 + 1.3) / 1.3);
}
avgBattery01Voltage /= numMeasurements;
avgTotalBatteryVoltage /= numMeasurements;
// Setze den Zähler und die Zwischenspeicher zurück
measurementCount = 0;
// Setzen nur neue Werte solange der Balancer nicht aktiv ist
if (balancer_Active == false) {
// Speichere die Mittelwerte in den Cloud-Variablen
battery01Voltage = avgBattery01Voltage;
totalBatteryVoltage = avgTotalBatteryVoltage;
// Berechnung von battery02Voltage
battery02Voltage = totalBatteryVoltage - battery01Voltage;
//Berechne die absolute Differenz der beiden Batteriespannungen
voltageDifference = fabs(battery01Voltage - battery02Voltage);
}
// Arbeite alle Funktionen ab
onVoltageDifferenceChange();
onIsBattery01VoltageHighChange();
onIsBattery01VoltageLowChange();
onIsBattery02VoltageHighChange();
onIsBattery02VoltageLowChange();
// Falls wir in der Beruhigungsphase sind, verlasse wir loop sofort
if (equalizationStartTime != 0) {
if (millis() - equalizationStartTime < 20000) { // 20 seconds pause
// Deaktiviere die Mosfet Status damit wir in onBalancerActiveChange() den Status von bool Balancer_Active neu bewerten können
mosfetBattery01 = false;
mosfetBattery02 = false;
// Status von bool balancer_Active updaten
onBalancerActiveChange();