Код для циклического загрузчика, похоже, завис

Я пытаюсь создать циклер зарядки аккумулятора, который будет заряжать и разряжать аккумулятор многократно в течение определенного количества циклов. Вот мой код:

bool in_charge_mode;
int cycles = 0;
float cutoffvoltage = 2.0f;

float get_batt_voltage() {
    return analogRead(A1) * 5.0f / 1023.0f;
}

void set_charge_mode() {
    in_charge_mode = true; // запомнить состояние
    digitalWrite(13, HIGH); //начать зарядку
    digitalWrite(12, LOW); //прекращаем разрядку для загрузки
}

void set_discharge_mode() {
    in_charge_mode = false;
    digitalWrite(13, LOW); //остановить зарядку
    digitalWrite(12, HIGH); //разряд для загрузки
}

void setup() {
    Serial.begin(9600);
    pinMode(12, OUTPUT); //Подключено к реле 1, которое является реле нагрузки
    pinMode(13, OUTPUT); //Подключено к реле 2, которое является реле для зарядного устройства
    // Проверить начальное напряжение
    float vbat = get_batt_voltage();
    if (vbat < cutoffvoltage) {
        // напряжение батареи ниже порогового, нужно начать зарядку
        set_charge_mode();
    } else {
        // мы можем разрядить, если напряжение выше порогового
        set_discharge_mode();
    }
}

void loop() {
    if (cycles >= 500) {
        Serial.println("Refusing to do anything, number of cycles too high");
        set_charge_mode(); // для отключения от нагрузки или чего-то еще
        return;
    }

    float vbat = get_batt_voltage();
    Serial.println("Battery voltage: " + String(vbat) + " is charging: " + String(in_charge_mode));
    if (in_charge_mode) {
        if (vbat > 4.2f) {
            // мы закончили зарядку! увеличиваем счетчик циклов
            cycles++; // технически это количество «завершенных зарядок»
            Serial.println("BATTERY CHARGED SUFFICIENTLY. Discharging again.");
            set_discharge_mode();
        } else {
            Serial.println("Still charging up the battery, waiting..");
        }
    } else {
        // в режиме разряда
        if (vbat < cutoffvoltage) {
            // напряжение батареи упало ниже порогового значения, нам нужно снова зарядить ее
            Serial.println("BATTERY DISCHARGED. Charging up again.");
            set_charge_mode();
        } else {
            Serial.println("Still dicharging the battery, waiting..");
        }
    }
    delay(1000); // проверка снова через секунду
}

Однако последовательный монитор продолжает повторять это:

Battery voltage: 4.18 is charging: 0
Still dicharging the battery, waiting..
Battery voltage: 4.18 is charging: 0
Still dicharging the battery, waiting..
Battery voltage: 4.18 is charging: 0

Похоже, он пытается разрядить аккумулятор, но продолжает заряжаться? Я ждал около часа, и напряжение остаётся на уровне 4,18 В, иногда показывает 4,17 В, но потом снова падает до 4,18 В.

Что может быть не так? Спасибо.

РЕДАКТИРОВАНИЕ: вот фотография моей схемы

, 👍2

Обсуждение

Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/154272/discussion-between-risa-and-jsotola)., @risa

Привет, jsotola, я прикрепил обновлённую схему в чате. Не мог бы ты взглянуть на неё? Спасибо., @risa

Я отформатировал ваш исходный текст, он стал трудночитаемым. Пожалуйста, придерживайтесь определённого стиля кодирования., @the busybee

Привет, я думаю, ты случайно удалил пустой цикл из кода., @risa

Нет, не видел. Используйте полосу прокрутки, чтобы просмотреть остальные части. Исходный текст ограничен по высоте., @the busybee

Вероятно, дело не в коде, а в характеристиках аккумулятора. Какой аккумулятор вы используете? Есть ли в вашем аккумуляторе встроенная схема защиты от перезаряда и пониженного напряжения? Какой тип заряда вы используете (есть ли у него защита от перезаряда?). Аккумулятор может отключаться при *примерно* 4,2 В, но не совсем при 4,2 В, исходя из порога защиты от перезаряда. А для аккумулятора с защитой от пониженного напряжения, в зависимости от микросхемы, отключится он при 2,3 В, а не при 2,0 В, как вы пытаетесь сделать..., @hcheung

Я не думаю, что это связано с характеристиками аккумулятора, как вы говорите, потому что я проверил это с помощью коммерческого зарядного устройства, которое заряжает и разряжает аккумулятор до одинаковых значений напряжения, и оно с этим справлялось., @risa

Судя по вашему описанию, это ещё раз доказывает, что ваш код работает так, как задумано. Не так ли? Значит, вы используете в этом тесте «некоммерческое» зарядное устройство. Возможно, вам стоит обратить внимание на это зарядное устройство., @hcheung

Привет, я не могу использовать коммерческое зарядное устройство, потому что оно рассчитано только на определённое количество циклов. Мне нужно, чтобы оно прошло 30 циклов, поэтому я и собираю это устройство., @risa


1 ответ


0

Некоторые предложения:

  1. Разделить Serial.println("Напряжение батареи: " + String(vbat) + " заряжается: " + String(in_charge_mode)); на две части,

    • сохраняя Serial.println("Напряжение батареи: " + String(vbat) там, где он есть, и
    • переместить то, что следует, внутрь настоящего условия if (in_charge_mode).

    Вы хотите, чтобы напряжение аккумулятора отображалось каждый раз, когда отображаются другие сообщения о выполнении условий зарядки/разрядки.

  2. Затем завершите условие: if (in_charge_mode = TRUE)

,