#1 Re: Проекти » Автоматическое зарядное устройство, десульфатация + восстановление » 2018-05-21 18:23:25

Доброго времени суток!
Решил собрать Ваш блок автоматики к зарядному устройству - понравилась простота и возможность изменять логику работы.
Появилась идея: добавить индикаторы выбранного режима и окончания цикла, а также выбор режима одной кнопкой - по кольцу "режим1, режим2, режим3, остановить работу". Также у меня в наличии есть двухцветные двухвыводные светодиоды  (красный/зеленый), цвет меняется сменой полярности, их можно использовать таким образом - "выбор режима - красным свечением нужного светодиода, окончание цикла - сменой цвета на зеленый".
Так как я мягко говоря, не силен в программировании roll , прошу Вас помочь в реализации идеи.
Пока нашел как реализовать выбор по кольцу, но не могу сообразить, как ввести задержку на выбор другого режима, кроме первого, а также остановить цикл той же кнопкой.
Вот Ваш скетч, с моими попытками.:

#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;
}

Підвал форуму