Код для циклического загрузчика, похоже, завис
Я пытаюсь создать циклер зарядки аккумулятора, который будет заряжать и разряжать аккумулятор многократно в течение определенного количества циклов. Вот мой код:
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 В.
Что может быть не так? Спасибо.
РЕДАКТИРОВАНИЕ: вот фотография моей схемы

@risa, 👍2
Обсуждение1 ответ
Некоторые предложения:
Разделить Serial.println("Напряжение батареи: " + String(vbat) + " заряжается: " + String(in_charge_mode)); на две части,
- сохраняя Serial.println("Напряжение батареи: " + String(vbat) там, где он есть, и
- переместить то, что следует, внутрь настоящего условия if (in_charge_mode).
Вы хотите, чтобы напряжение аккумулятора отображалось каждый раз, когда отображаются другие сообщения о выполнении условий зарядки/разрядки.
Затем завершите условие: if (in_charge_mode = TRUE)
- Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno
- Как я могу прервать задержку() при нажатии кнопки?
- Объявление переменной внутри основного цикла
- hx711 и датчик нагрузки показывают 0 для калибровки
- Светодиод мигает с помощью кнопки
- в то время как (1) внутри, если условно
- HTML-страница переменной ESP8266 Webserver ESP8266WebServer (не как один постоянный символ)
- ESP8266 Webserver ESP8266WebS сервер перемещает функцию обработчика в отдельный файл .h .c
Давайте [продолжим это обсуждение в чате](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