Ви не увійшли.
Сторінки 1
Доброго времени суток!
Решил собрать Ваш блок автоматики к зарядному устройству - понравилась простота и возможность изменять логику работы.
Появилась идея: добавить индикаторы выбранного режима и окончания цикла, а также выбор режима одной кнопкой - по кольцу "режим1, режим2, режим3, остановить работу". Также у меня в наличии есть двухцветные двухвыводные светодиоды (красный/зеленый), цвет меняется сменой полярности, их можно использовать таким образом - "выбор режима - красным свечением нужного светодиода, окончание цикла - сменой цвета на зеленый".
Так как я мягко говоря, не силен в программировании , прошу Вас помочь в реализации идеи.
Пока нашел как реализовать выбор по кольцу, но не могу сообразить, как ввести задержку на выбор другого режима, кроме первого, а также остановить цикл той же кнопкой.
Вот Ваш скетч, с моими попытками.:
#define ModePin 7 //Пин выбора режима зарядки
#define LedaPin 5 //Пин a led 1 режима зарядки
#define LedbPin 6 //Пин b led 1 режима зарядки
#define LedcPin 8 //Пин c led 2 режима зарядки
#define LeddPin 9 //Пин d led 2 режима зарядки
#define LedePin 10 //Пин e led 3 режима зарядки
#define LedfPin 11 //Пин f led 3 режима зарядки
#define LoadPin 12 //Пин включения нагрузки
#define ChargePin 13 //Пин включения зарядки
#define VoltagePin A0 //Пин замера напряжения аккумулятора
#define MaxVoltage 794 //Напряжение в конце зарядки, делитель 1/4, 20В = 1023, 15.5В = 794
//#define NormVoltage 736 //Напряжение поддержки, делитель 1/4, 20В = 1023, 14.4В = 736 это для убитых аккумов
#define NormVoltage 696 //Напряжение поддержки, делитель 1/4, 20В = 1023, 13.6В = 696 это для нормальных аккумов
#define MinVoltage 538 //Напряжение в конце разрядки делитель 1/4, 20В = 1023, 10.5В = 538
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int Voltage; //Переменная для текущего измерения напряжения
uint32_t StartTime; //Переменная для хранения вермени начала цикла
uint32_t Time_P = 1500; //Переменная для хранения длительности цикла
uint8_t Loops = 3; //Переменная для хранения кол-ва циклов разряд/заряд
void setup() {
pinMode(ModePin, INPUT_PULLUP);
pinMode(LedaPin, OUTPUT);
pinMode(LedbPin, OUTPUT);
pinMode(LedcPin, OUTPUT);
pinMode(LeddPin, OUTPUT);
pinMode(LedePin, OUTPUT);
pinMode(LedfPin, OUTPUT);
digitalWrite(LedaPin, 0);
digitalWrite(LedbPin, 0);
digitalWrite(LedcPin, 0);
digitalWrite(LeddPin, 0);
digitalWrite(LedePin, 0);
digitalWrite(LedfPin, 0);
Serial.begin(9600);// initialize serial communication:
pinMode(LoadPin, OUTPUT);
pinMode(ChargePin, OUTPUT);
digitalWrite(ChargePin, 0); //Отключаем зарядку
digitalWrite(LoadPin, 0); //Отключаем разрядку
}
void loop() {
// программа - счетчик нажатий кнопки
buttonState = digitalRead(ModePin);
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == LOW) {
// if the current state is HIGH then the button went from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else {
// if the current state is LOW then the button went from on to off:
Serial.println("off");
}
// Delay a little bit to avoid bouncing
delay(50);
}
// save the current state as the last state, for next time through the loop
lastButtonState = buttonState;
// button push counter. the modulo function gives you the remainder of the
// division of two numbers:
if (buttonPushCounter == 1) {
digitalWrite(LedaPin, HIGH);
} else {
digitalWrite(LedaPin, LOW);//состояние выходов на led когда счетчик в любом другом состоянии
}
if (buttonPushCounter == 2) {
digitalWrite(LedcPin, HIGH);
} else {
digitalWrite(LedcPin, LOW);//состояние выходов на лед когда счетчик в любом другом состоянии
}
if (buttonPushCounter == 3) {
digitalWrite(LedePin, HIGH);
} else {
digitalWrite(LedePin, LOW);//состояние выходов на лед когда счетчик в любом другом состоянии
}
if (buttonPushCounter == 4) {
buttonPushCounter = 0;
}
if (buttonPushCounter == 1) Mode1(); //Десульфатация
if (buttonPushCounter == 2) Mode2(); //3 цикла разряд-заряд
if (buttonPushCounter == 3) Mode3(); //Зарядка с защитой от перезаряда
}
void Mode1() {
Loop:
//--- Заряд акуммулятора ---
digitalWrite(ChargePin, 1); //Включаем зарядку
StartTime = millis(); //Запоминаем время начала зарядки
do {
delay(100); //Ждем 0.1 сек
Voltage = analogRead(VoltagePin); //Измеряем напряжение
} while ((Voltage < MaxVoltage) && (StartTime + Time_P > millis()) );
digitalWrite(ChargePin, 0); //Выключаем зарядку
delay(100); //Ждем 0.1 сек
//--- Разряд акуммулятора ---
digitalWrite(LoadPin, 1); //Включаем нагрузку
StartTime = millis(); //Запоминаем время начала разрядки
do {
delay(100); //Ждем 0.1 сек
Voltage = analogRead(VoltagePin); //Измеряем напряжение
} while ((Voltage > MinVoltage) && (StartTime + Time_P > millis()) );
digitalWrite(LoadPin, 0); //Выключаем зарядку
delay(100); //Ждем 0.1 сек
goto Loop;
}
void Mode2() {
do {
//--- Разряд акуммулятора ---
digitalWrite(LoadPin, 1); //Включаем нагрузку
do {
delay(100); //Ждем 0.1 сек
Voltage = analogRead(VoltagePin); //Измеряем напряжение
} while (Voltage > MinVoltage);
digitalWrite(LoadPin, 0); //Выключаем зарядку
delay(100); //Ждем 0.1 сек
//--- Заряд акуммулятора ---
digitalWrite(ChargePin, 1); //Включаем зарядку
do {
delay(100); //Ждем 0.1 сек
Voltage = analogRead(VoltagePin); //Измеряем напряжение
} while (Voltage < MaxVoltage);
digitalWrite(ChargePin, 0); //Выключаем зарядку
delay(100); //Ждем 0.1 сек
} while (--Loops);
Loop:
goto Loop;
}
void Mode3() {
//--- Заряд акуммулятора ---
digitalWrite(ChargePin, 1); //Включаем зарядку
do {
delay(100); //Ждем 0.1 сек
Voltage = analogRead(VoltagePin); //Измеряем напряжение
} while (Voltage < MaxVoltage);
digitalWrite(ChargePin, 0); //Выключаем зарядку
delay(1000); //Ждем 1 сек
Loop:
//--- Поддержка заряда ---
Voltage = analogRead(VoltagePin); //Измеряем напряжение
if (Voltage < NormVoltage)
digitalWrite(ChargePin, 1); //Включаем зарядку
else {
digitalWrite(ChargePin, 0); //Выключаем зарядку
delay(10000); //Ждем 10 сек
}
delay(100); //Ждем 0.1 сек
goto Loop;
}
Сторінки 1