Ups+сигнализация=умный гараж на ардуино мега и ethernet shield

Тема в разделе "Arduino & Shields", создана пользователем Slavdej, 10 май 2020.

  1. Slavdej

    Slavdej Нерд

    Прошу помощи знатоков.
    Ребята, моему проекту исполнилось пол года и с железом проблем у меня никаких не возникло, до тех пор пока я не столкнулся с написанием кода. Так как в программировании я не силён и ранее делал лишь мелкие простейшие поделки на основе ардуино, я столкнулся с проблемой которую никак не могу решить.
    Суть дела в том что я никак не могу понять каким образом можно заставить ардуино прекратить зарядку АКБ при достижении определённого значения и включить зарядку резервного АКБ. Код который мне удалось написать работает не правильно, потому что заряд АКБ при зарядке плавает на +- 0.3 вольта и при отключении от заряда АКБ немного падает значение вольтметра. Я попытался реализовать задержку отключения зарядки при помощи функции millis, для того чтобы за время отсчёта таймера АКБ успел зарядиться выше указанного значения и смело переключить зарядку на резервный АКБ. Но учитывая мои скромные знания в программировании, а точнее практически полное незнание этого дела, что то пошло не так и я совсем запутался в своём же коде. Прошу не пинать меня сильно если наворотил лишнего, ну и конечно ОГРОМНАЯ ПРОСЬБА о помощи![​IMG] [​IMG]


    Код (C++):
    // Alarm of Garadjitsu //
    // Arduino Mega 2560+Ethernet Shield w5100;//
    // Analog pins: internal: A0;A1;A2;A3;A4 external: A9;A10;A11;A12;A13;A14 //
    // Digital pins: internal relay driver: D22;D23;D24;D25;D26;D27;D28;D29 //
    // External sensors: D30;D31;D32;D33;D34;D35 external_2: D38;D39;D40;D41;D42;D43;D44;D45;D46;D47 //
    // External sensors connector pins: 1-GND;7-+5V; //


    #define BLYNK_PRINT Serial
    #define W5100_CS  10
    #define SDCARD_CS 4
    #define pir_1_Pin 30 // Input1 for HC-S501
    #define pir_2_Pin 31 // Input2 for HC-S501
    #define pir_3_Pin 32 // Input3 for HC-S501
    #define SoundSensor_1_Pin 38
    #define PERIOD 3600000
    #include <SPI.h>
    #include <Ethernet.h>
    #include <BlynkSimpleEthernet.h>
    #include <SoftwareSerial.h>




    int LinePin = A0;     // the number of the Line pin
    int LineStatus;
    int LineOn;
    int LineOff;


    int Relay_1_Pin =  23;      // Зарядка батареи вкл/выкл
    int Relay_2_Pin =  22;      // Зарядка батареи или резервной батареи
    int Relay_3_Pin =  25;      // Питание от батареи или резервной батареи
    int Relay_4_Pin =  24;      // Питание от резервной батареи или от сети (D24)+(D25)= от сети
    int Relay_5_Pin =  26;      // Питание 12 Вольт вкл/выкл
    int Relay_6_Pin =  27;      // Питание 12 Вольт вкл/выкл
    int Relay_7_Pin =  28;      // Питание 12 Вольт вкл/выкл
    int Relay_8_Pin =  29;      // Питание 12 Вольт вкл/выкл


    int Bat = A1;
    int ResBat = A2;
    float ChargedStatusBat;
    float ChargedStatusResBat;
    float FullChargeBat;
    float FullChargeResBat;
    float DisChargeBat;

    int pir_1_Value; // Place to store read PIR_1 Value
    int pir_2_Value; // Place to store read PIR_2 Value
    int pir_3_Value; // Place to store read PIR_3 Value

    int SoundSensor_1_Value;

    float vout = 0.0;
    float vout_2 = 0.0;
    float vin = 0.0;
    float vin_2 = 0.0;
    float R1 = 30000.0;
    float R2 = 7500.0;
    int value = 0;
    int value_2 = 0;

    char auth[] = "****************************";

    WidgetLED LineStatusLed (0);    // объявляем светодиод на 0 виртуальном пине.
    WidgetLED ChargeBatLed (1);     // объявляем светодиод на 1 виртуальном пине.
    WidgetLED ChargeResBatLed (2);  // объявляем светодиод на 2 виртуальном пине.
    WidgetLED ActiveBatLed (3);     // объявляем светодиод на 3 виртуальном пине.
    WidgetLED ActiveResBatLed (4);  // объявляем светодиод на 4 виртуальном пине.


    void setup() {
      Serial.begin(9600);
      pinMode(SDCARD_CS, OUTPUT);
      digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card



      // initialize the Line pin as an input:
      pinMode(LinePin, INPUT);
      // initialize the Bat pin as an input:
      pinMode(Bat, INPUT);
      pinMode(ResBat, INPUT);

      // initialize the PIR pin as an input:
      pinMode(pir_1_Pin, INPUT);
      pinMode(pir_2_Pin, INPUT);
      pinMode(pir_3_Pin, INPUT);

      pinMode(SoundSensor_1_Pin, INPUT);


      // Инициализируем пины реле как выходы:
      pinMode(Relay_1_Pin, OUTPUT);
      digitalWrite(Relay_1_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_2_Pin, OUTPUT);
      digitalWrite(Relay_2_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_3_Pin, OUTPUT);
      digitalWrite(Relay_3_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_4_Pin, OUTPUT);
      digitalWrite(Relay_4_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_5_Pin, OUTPUT);
      digitalWrite(Relay_5_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_6_Pin, OUTPUT);
      digitalWrite(Relay_6_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_7_Pin, OUTPUT);
      digitalWrite(Relay_7_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_8_Pin, OUTPUT);
      digitalWrite(Relay_8_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
     
      Blynk.begin(auth);
    }


    void loop() {

    // getPirValue();

      uint32_t timer = 0;


      LineStatus = analogRead(LinePin);
      LineOn = LineStatus > 51;
      LineOff = LineStatus < 51;

      ChargedStatusBat = vin;
      ChargedStatusResBat = vin_2;
      FullChargeBat = ChargedStatusBat >= 12.60;
      FullChargeResBat = ChargedStatusResBat >= 12.60;
      DisChargeBat = ChargedStatusBat <= 9.70;
    //DisChargeResBat = ChargedStatusResBat <= 9.95;

    if (LineOn) {
      LineStatusLed.on ();             // виртуальный сигнал статус сети в приложении
    }
    if (LineOff)  {
      LineStatusLed.off ();             // виртуальный сигнал статус сети в приложении
    }
      if (LineOn && FullChargeBat == false) {
          digitalWrite(Relay_1_Pin, LOW);  // Зарядка батареи вкл/выкл
          digitalWrite(Relay_2_Pin, HIGH); // Зарядка батареи или резервной батареи
          digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
          digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
          ChargeBatLed.on ();
          ChargeResBatLed.off ();
          ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи        
          ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        }
    else if (LineOn && FullChargeBat == true && FullChargeResBat == false && millis() - timer >= PERIOD) {
        digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, LOW);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, LOW);  // Зарядка батареи или резервной батареи
        ChargeResBatLed.on ();
        ChargeBatLed.off ();
        ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи        
        ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        timer += PERIOD;
        }
    else if (LineOn && FullChargeBat == true && FullChargeResBat == true && millis() - timer >= PERIOD){
        digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ChargeResBatLed.off ();
        ChargeBatLed.off ();
        ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи        
        ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        timer += PERIOD;
        }

    if (LineOff && DisChargeBat == true && millis() - timer >= PERIOD) {
        digitalWrite(Relay_3_Pin, LOW);   // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, HIGH);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ActiveBatLed.off ();              // Потушить виртуальный сигнал активной батареи
        ChargeBatLed.off ();              // Потушить виртуальный сигнал зарядки батареи
        ActiveResBatLed.on ();            // Потушить виртуальный сигнал активной резервной батареи
        ChargeResBatLed.off ();
        timer += PERIOD;
    }

    else if (LineOff && (DisChargeBat == false)) {
        digitalWrite(Relay_3_Pin, HIGH);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, HIGH);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ActiveBatLed.on ();               // Потушить виртуальный сигнал активной батареи
        ChargeBatLed.off ();              // Потушить виртуальный сигнал зарядки батареи
        ActiveResBatLed.off ();           // Потушить виртуальный сигнал активной резервной батареи
        ChargeResBatLed.off ();
    }

     
     

      value = analogRead(Bat);      // Считываем уровень заряда батареи:
      vout = (value * 4.98) / 1023.0;
      vin = vout / (R2 / (R1 + R2));
      Serial.print("INPUT V= ");
      Serial.println(vin, 4);



      value_2 = analogRead(ResBat); // Считываем уровень заряда резервной батареи:
      vout_2 = (value_2 * 4.98) / 1023.0;
      vin_2 = vout_2 / (R2 / (R1 + R2));
      Serial.print("INPUT V2= ");
      Serial.println(vin_2, 4);



      Blynk.virtualWrite(V5, vin);       // Выводим значения батареи на виртуальный пин (V5)
      Blynk.virtualWrite(V6, vin_2);     // Выводим значения резервной батареи на виртуальный пин (V6)
      Blynk.run();
    }

    // void getPirValue(void) {

    //  pir_1_Value = digitalRead(pir_1_Pin);
    //  if (pir_1_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Pir 61");
    //  }
    //  pir_2_Value = digitalRead(pir_2_Pin);
    //  if (pir_2_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Pir 62");
    //  }
    //  pir_3_Value = digitalRead(pir_3_Pin);
    //  if (pir_3_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Gate Pir");
    //  }
    //}
    До датчиков движения и других функций программно я ещё не дошёл, главная моя проблема это управление батареями.
    В гаражах у нас часто отключают электричество ночью и так же часто грабят гаражи. Система безопасности просто необходима.
    Кстати контроль частично управляется при помощи Blynk приложения на смартфоне, в частности отслеживается заряд АКБ и наличие в сети напряжения, но в случае отсутствия соединения с сервером Blynk или интернета по какой либо причине, управление зарядом батарей хочу прописать на программном уровне, режим ручного управления зарядкой хочу исключить.
     
    Последнее редактирование модератором: 10 май 2020
  2. Slavdej

    Slavdej Нерд

    Вопрос у меня такой: Как можно реализовать срабатывание реле по достижению 12.6 вольт один раз и не по таймеру как я изначально задумал? Возможно при помощи цикла "for" или ещё как то?
    Люди добрые, подскажите пожалуйста в каком направлении нужно двигаться в этой ситуации, я не прошу за меня это сделать, просто совет и маленькая подсказка с Вашей стороны и я счастлив?)
    Для полного счастья ведь нужно так не много)
    Заранее благодарю отозвавшихся!)
     
  3. parovoZZ

    parovoZZ Гуру

    по флагу.
     
    Slavdej нравится это.
  4. Slavdej

    Slavdej Нерд

    Спасибо за Вашу подсказку, сейчас попытаюсь найти информацию о том, что это такое. Ранее я не сталкивался с такой функцией.
     
  5. parovoZZ

    parovoZZ Гуру

    никакая это не функция. Это бинарный (и не только) признак какого-либо состояния. Например:
    Код (C++):
    #define  ON 1
    #define  OFF 0
    Определяем в качестве флага 8-ми битную переменную:
    Код (C++):
    uint8_t    Light = OFF
    и далее проверка флага и ветвление условия;
    Код (C++):
    if (Light == ON)
    {

    }
    else
    {

    }
     
    Daniil и Slavdej нравится это.
  6. Slavdej

    Slavdej Нерд

    Спасибо за пример, но в случае с моим кодом значение может поменяться и опускаться ниже порога указанного. Например при указанном значении 12,60 В срабатывает реле и переключает зарядку на резервную батарею а через некоторое время напряжение на первой батарее падает на 12,57 В, при этом снова включается зарядка основного АКБ и так клацает реле туда-сюда(
    Может я и не правильно сформулировал свой вопрос, ведь код работает и выполняет свои функции. Мне всего лишь нужно сделать так чтобы переключение срабатывало по достижении значения и дальше эта часть кода пропускалась, но каким образом это сделать не понимаю. Даже как правильно сформулировать вопрос, как видите, не знаю)

    if(LineOn && FullChargeBat ==false){
    digitalWrite(Relay_1_Pin, LOW);// Зарядка батареи вкл/выкл
    digitalWrite(Relay_2_Pin, HIGH);// Зарядка батареи или резервной батареи
    digitalWrite(Relay_3_Pin, LOW);// Включить питание от резервной батареи
    digitalWrite(Relay_4_Pin, LOW);// Включить питание от сети
    ChargeBatLed.on();
    ChargeResBatLed.off();
    ActiveBatLed.off(); // Потушить виртуальный сигнал активной батареи
    ActiveResBatLed.off(); // Потушить виртуальный сигнал активной резервной батареи
    }
    Как заставить отработать это условие один раз и когда достигается следующее условие больше не проверять эту часть кода?
    Заранее прошу прощения если я чего то не до понимаю, как я уже писал выше, я пока на уровне подсматривающего за начинающим, даже не начинающий пока с моим уровнем знаний в программировании.
     
  7. SergeiL

    SergeiL Оракул Модератор

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

    Вот например, "Система питания сигнализации с акк. батареей и зарядкой". Какая батарея, какой источник питания... Вариантов много.
    Вы разобрались в технологии заряда батарей для обеспечения максимальной жизни батареи в Ваших условиях?
    Вы готовы к сценарию, когда выключают электричество на месяц, потом включают. Что будет с Вашей системой в такой ситуации?
     
    Slavdej нравится это.
  8. Slavdej

    Slavdej Нерд



    Доброго времени суток и спасибо что не остались равнодушным к моей теме.
    Задумка в том чтобы сделать универсальное устройство с возможностью доработок программной части и самой приблуды в будущем. Ардуино мега имеет достаточное количество вводов-выводов для такого проекта и количество задействованных мной на данный момент пинов видно в описании выше в скетче. Задача устройства в данный момент состоит в том, чтобы контролировать заряд-разряд двух литиевых АКБ 12В/30 АЧ (купленных на Али Экспресс) поочерёдно, так же контроль датчиков движения и звука и дыма, автоматический контроль и перезагрузка в случае зависания 4G роутера ( пинг сети каждые 10 минут, это в скетче пока ещё не реализовано), контроль температуры и вентиляции в помещении, звуковая сигнализация в случае пожара или несанкционированного проникновения в помещение... И т.д....
    Что касается правильности заряда АКБ там стоят контроллеры заряда встроенные с защитой от перезаряда и переразряда, я покупал вместе с АКБ родное зарядное устройство и создал аналогичный зарядник на базе старого БП АТХ, единственное что не сравнивал, длину импульса, но уже полгода отлично работает и показатели АКБ не упали. Полагаю с зарядкой проблем у меня нет. По поводу отключения электричества всё может конечно случиться но во первых я это контролирую в приложении Blynk на смартфоне, зарядку, состояние сети и т.д, а во вторых для моих нужд моих АКБ, в случае отключения электроэнергии в сети, хватает на сутки один АКБ, их у меня два, можно менять по очереди в случае таких непредвиденных обстоятельств, хотя это маловероятно. Как то так)
    С железом у меня получается работать нормально и это всё уже работает, но есть проблема с кодом и я пытаюсь освоить его написание в последнее время, даётся не очень легко но понемногу уже что то работает.
    Вчера пришёл к выводу что таймер на millis, всё таки хорошая идея, просто у меня не хватает знаний и в коде какая то ошибка.
    Я приложу свой вчерашний редактированный код, возможно Вы или ещё кто нибудь даст дельный совет или подсказку как правильно использовать millis в моём случае.
    Заранее благодарен.
     
  9. SergeiL

    SergeiL Оракул Модератор

    А почему именно литиевых ?
    У меня на даче стоят два тяговых, свинцовых, кислотных - 120А/ч на видеонаблюдение и 80А/ч на сигнализацию.
     
    Slavdej нравится это.
  10. Slavdej

    Slavdej Нерд

    Код (C++):
    // Alarm of Garadjitsu //
    // Arduino Mega 2560+Ethernet Shield w5100;//
    // Analog pins: internal: A0;A1;A2;A3;A4 external: A9;A10;A11;A12;A13;A14 //
    // Digital pins: internal relay driver: D22;D23;D24;D25;D26;D27;D28;D29 //
    // External sensors: D30;D31;D32;D33;D34;D35 external_2: D38;D39;D40;D41;D42;D43;D44;D45;D46;D47 //
    // External sensors connector pins: 1-GND;7-+5V; //


    #define BLYNK_PRINT Serial
    #define W5100_CS  10
    #define SDCARD_CS 4
    #define pir_1_Pin 30 // Input1 for HC-S501
    #define pir_2_Pin 31 // Input2 for HC-S501
    #define pir_3_Pin 32 // Input3 for HC-S501
    #define SoundSensor_1_Pin 38

    #include <SPI.h>
    #include <Ethernet.h>
    #include <BlynkSimpleEthernet.h>
    #include <SoftwareSerial.h>


    uint32_t timer;
    int period = 1800000;
    int LinePin = A0;     // the number of the Line pin
    int LineStatus;
    int LineOn;
    int LineOff;


    int Relay_1_Pin =  23;      // Зарядка батареи вкл/выкл
    int Relay_2_Pin =  22;      // Зарядка батареи или резервной батареи
    int Relay_3_Pin =  25;      // Питание от батареи или резервной батареи
    int Relay_4_Pin =  24;      // Питание от резервной батареи или от сети (D24)+(D25)= от сети
    int Relay_5_Pin =  26;      // Питание 12 Вольт вкл/выкл
    int Relay_6_Pin =  27;      // Питание 12 Вольт вкл/выкл
    int Relay_7_Pin =  28;      // Питание 12 Вольт вкл/выкл
    int Relay_8_Pin =  29;      // Питание 12 Вольт вкл/выкл


    int Bat = A1;
    int ResBat = A2;
    float ChargedStatusBat;
    float ChargedStatusResBat;
    float FullChargeBat;
    float FullChargeResBat;
    float DisChargeBat;

    int pir_1_Value; // Place to store read PIR_1 Value
    int pir_2_Value; // Place to store read PIR_2 Value
    int pir_3_Value; // Place to store read PIR_3 Value

    int SoundSensor_1_Value;

    float vout = 0.0;
    float vout_2 = 0.0;
    float vin = 0.0;
    float vin_2 = 0.0;
    float R1 = 30000.0;
    float R2 = 7500.0;
    int value = 0;
    int value_2 = 0;

    char auth[] = "*******************";

    WidgetLED LineStatusLed (0);    // объявляем светодиод на 0 виртуальном пине.
    WidgetLED ChargeBatLed (1);     // объявляем светодиод на 1 виртуальном пине.
    WidgetLED ChargeResBatLed (2);  // объявляем светодиод на 2 виртуальном пине.
    WidgetLED ActiveBatLed (3);     // объявляем светодиод на 3 виртуальном пине.
    WidgetLED ActiveResBatLed (4);  // объявляем светодиод на 4 виртуальном пине.


    void setup() {
      Serial.begin(9600);
      pinMode(SDCARD_CS, OUTPUT);
      digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
     
     

      // initialize the Line pin as an input:
      pinMode(LinePin, INPUT);
      // initialize the Bat pin as an input:
      pinMode(Bat, INPUT);
      pinMode(ResBat, INPUT);

      // initialize the PIR pin as an input:
      pinMode(pir_1_Pin, INPUT);
      pinMode(pir_2_Pin, INPUT);
      pinMode(pir_3_Pin, INPUT);

      pinMode(SoundSensor_1_Pin, INPUT);


      // Инициализируем пины реле как выходы:
      pinMode(Relay_1_Pin, OUTPUT);
      digitalWrite(Relay_1_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_2_Pin, OUTPUT);
      digitalWrite(Relay_2_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_3_Pin, OUTPUT);
      digitalWrite(Relay_3_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_4_Pin, OUTPUT);
      digitalWrite(Relay_4_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_5_Pin, OUTPUT);
      digitalWrite(Relay_5_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_6_Pin, OUTPUT);
      digitalWrite(Relay_6_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_7_Pin, OUTPUT);
      digitalWrite(Relay_7_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
      pinMode(Relay_8_Pin, OUTPUT);
      digitalWrite(Relay_8_Pin, HIGH); // Выключаем реле - посылаем высокий сигнал!!!!!!!
     
      Blynk.begin(auth);
    }


    void loop() {

    // getPirValue();
     
     
     
      LineStatus = analogRead(LinePin);
      LineOn = LineStatus > 51;
      LineOff = LineStatus < 51;

      ChargedStatusBat = vin;
      ChargedStatusResBat = vin_2;
      FullChargeBat = ChargedStatusBat >= 12.50;
      FullChargeResBat = ChargedStatusResBat >= 12.60;
      DisChargeBat = ChargedStatusBat <= 9.70;
    //DisChargeResBat = ChargedStatusResBat <= 9.70;

    if (LineOn) {
      LineStatusLed.on ();             // виртуальный сигнал статус сети в приложении
    }
    if (LineOff)  {
      LineStatusLed.off ();             // виртуальный сигнал статус сети в приложении
    }

    if (LineOn && FullChargeBat == false) {
          digitalWrite(Relay_1_Pin, LOW);  // Зарядка батареи вкл/выкл
          digitalWrite(Relay_2_Pin, HIGH); // Зарядка батареи или резервной батареи
          digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
          digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
          ChargeBatLed.on ();
          ChargeResBatLed.off ();
          ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи          
          ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        }
    else if (LineOn && FullChargeBat == true && millis() - timer >= period) {
        timer += period;
        digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, LOW);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, LOW);  // Зарядка батареи или резервной батареи
        ChargeResBatLed.on ();
        ChargeBatLed.off ();
        ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи          
        ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        }
       
    else if (LineOn && FullChargeBat && FullChargeResBat){
        digitalWrite(Relay_3_Pin, LOW);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, LOW);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ChargeResBatLed.off ();
        ChargeBatLed.off ();
        ActiveBatLed.off ();             // Потушить виртуальный сигнал активной батареи          
        ActiveResBatLed.off ();          // Потушить виртуальный сигнал активной резервной батареи
        }
     


    if (LineOff) {
        digitalWrite(Relay_3_Pin, HIGH);  // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, HIGH);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ActiveBatLed.on ();               // Потушить виртуальный сигнал активной батареи
        ChargeBatLed.off ();              // Потушить виртуальный сигнал зарядки батареи
        ActiveResBatLed.off ();           // Потушить виртуальный сигнал активной резервной батареи
        ChargeResBatLed.off ();
    }  

    else if (LineOff && DisChargeBat) {
        digitalWrite(Relay_3_Pin, LOW);   // Включить питание от резервной батареи
        digitalWrite(Relay_4_Pin, HIGH);  // Включить питание от сети
        digitalWrite(Relay_1_Pin, HIGH);  // Зарядка батареи вкл/выкл
        digitalWrite(Relay_2_Pin, HIGH);  // Зарядка батареи или резервной батареи
        ActiveBatLed.off ();              // Потушить виртуальный сигнал активной батареи
        ChargeBatLed.off ();              // Потушить виртуальный сигнал зарядки батареи
        ActiveResBatLed.on ();            // Потушить виртуальный сигнал активной резервной батареи
        ChargeResBatLed.off ();
    }    
     
     
      value = analogRead(Bat);      // Считываем уровень заряда батареи:
      vout = (value * 4.98) / 1023.0;
      vin = vout / (R2 / (R1 + R2));
      Serial.print("INPUT V= ");
      Serial.println(vin, 4);



      value_2 = analogRead(ResBat); // Считываем уровень заряда резервной батареи:
      vout_2 = (value_2 * 4.98) / 1023.0;
      vin_2 = vout_2 / (R2 / (R1 + R2));
      Serial.print("INPUT V2= ");
      Serial.println(vin_2, 4);



      Blynk.virtualWrite(V5, vin);       // Выводим значения батареи на виртуальный пин (V5)
      Blynk.virtualWrite(V6, vin_2);     // Выводим значения резервной батареи на виртуальный пин (V6)
      Blynk.run();
    }

    // void getPirValue(void) {

    //  pir_1_Value = digitalRead(pir_1_Pin);
    //  if (pir_1_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Pir 61");
    //  }
    //  pir_2_Value = digitalRead(pir_2_Pin);
    //  if (pir_2_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Pir 62");
    //  }
    //  pir_3_Value = digitalRead(pir_3_Pin);
    //  if (pir_3_Value)
    //  {
    //    Blynk.notify("T==> Motion detected Gate Pir");
    //  }
    //}
    НА данный момент код работает как и задумывалось, но задержка на таймере millis не работает, соответственно АКБ не успевает пройти порог заряда до переключение реле. Полный заряд АКБ 12.67 В, порог в скетче 12.60 и полчаса после порога по моим наблюдениям достаточно чтобы при выключении зарядка напряжение не просаживалось ниже указанного порога. 0-02-0a-5c7ed1455dc1e4f2bcaa2a9c2d513564f23b3809965b7d22488e621e90a154b3_3088507b.jpg 0-02-05-bb7b71de24c66509a53d6e59d903c600ea5d518555f5996bbef036e688af7c04_15c58c0c.jpg 0-02-0a-0ab736f7ef0174b788cf18077cdb201e1197af2964900de4a9887bb7474315aa_eeec57f6.jpg 0-02-0a-5b8c9159a1b590a560a98d6cf4256aa8ef492e8de5e67294a752c35515315015_20139f83.jpg
     
    Последнее редактирование: 11 май 2020
  11. Slavdej

    Slavdej Нерд

    В последнее время строительство, а учился на автослесаря.
    Это лишь хобби пока, но я очень хотел бы научиться программированию микроконтроллеров и заниматься этим серьёзно в будущем, но пока до этого ещё далеко к сожалению.
     
  12. Slavdej

    Slavdej Нерд

    У меня также был гелиевый АКБ 40 А/ч перед последним ограблением гаража), теперь его нет), я в тестовом режиме оставил его на виду и он стоял на автоматической китайской зарядке прямо при входе в гараж по этому камера была обесточена воришками раньше чем она успела мне отмаячить о взломе. Именно по этому я хочу датчики на звук ещё ставить.
    Ну а литиевые мне больше нравятся если честно, заряда 30 А/ч хватает на сутки в отличии от 40А/ч гелиевого, которого хватало на 15 часов, быстрая зарядка это второй плюс, заряжается за 6 часов, просадки практически никакой нет, габариты. Плюсов много в общем у лития и цена дешевле чем гелиевый.
     
  13. SergeiL

    SergeiL Оракул Модератор

    Главный плюс лития - он легче - это плюс на лодках.
    Дома, как по весу - все равно, тяговые не боятся полного разряда. В этом их плюс.
     
    Slavdej нравится это.
  14. SergeiL

    SergeiL Оракул Модератор

    Нарисуйте Вашу схему - обсудим.
    Мне не нравится там 12,6В :)
     
    Slavdej нравится это.
  15. Slavdej

    Slavdej Нерд

    В данный момент учитывая кризисную ситуацию и своё финансовое положение, пожалуй править и дорабатывать свой код мой единственный выход.
    Цены на UPS я анализировал и сейчас не тяну никак это решение, хотя и хотелось бы не заморачиваться.
    Но немаловажно и то, что это мой опыт и развитие в этом направлении в первую очередь, по этому и колупаюсь ища решение)
     
  16. Slavdej

    Slavdej Нерд

    К сожалению у меня нет знаний как нарисовать схему правильно, думаю что с моим этим увлечением мне придётся освоить и это)
    Пока схема у меня в голове, но я скачаю сегодня протеус и постараюсь в ближайшее время нарисовать схему этой умной шкатулки)
    Вопрос, чем же Вас так смутили 12.6 Вольт?
     
  17. Slavdej

    Slavdej Нерд

    Кстати функция газовая атака предназначена для невозможности находиться в гараже несанкционированно проникнувшим в него до моего приезда)
    Соленоид и газовый баллончик терен-5)
    Накипело просто, за 4 года уже 5 раз выставляли гараж, а я не успевал приехать(
     
  18. parovoZZ

    parovoZZ Гуру

    Не надо никаких протеусов и потенциальных проблем с законом. Есть отличный онлайн редактор изыдя)) А также бесплатный оффлайн диптрэйс.
     
    Slavdej нравится это.
  19. Slavdej

    Slavdej Нерд

    Купил на Авторынке , но скорее всего Вы правы, это был AGM.
     
  20. Slavdej

    Slavdej Нерд

    Спасибо за подсказку, ибо ранее я не знал альтернативы протеус.
    Уже качаю:
    DipTrace