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

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

  1. Slavdej

    Slavdej Нерд

    Читал об этом когда купил его, но в автоматическом режиме зарядка была именно 14.2 и не превышалась.
    Не надулся за пару месяцев постоянной зарядка, значит гель не кипел)
    В любом случае его украли и я узнал о этом китайском чуде как эти батери паки на 30 А/ч. Прекрасная вещь.
     
  2. Slavdej

    Slavdej Нерд

    А тем временем мне удалось решить задачу с переключением по таймеру изменив что то в коде, я сам не понял ничего к сожалению, но пошарив в инете изменил исходный свой недокод на это, начало всё работать и через 15 минут после достигнутого значения 12.60 успевает зарядиться до 12.63 и переключается на зарядку резервной батареи. Новую версию кода прилагаю.
    Но хотелось бы оставаться в Вашей приятной компании т.к. могут и возникнут ещё вопросы в правке, а Вы ребята вселяете в меня надежду и силы продолжать это делать. Спасибо Вам!!!
    Код (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  1800000
    #include <SPI.h>
    #include <Ethernet.h>
    #include <BlynkSimpleEthernet.h>
    #include <SoftwareSerial.h>


    uint32_t timer;

    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 Вольт вкл/выкл


    float Bat = A1;
    float 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;
    float value = 0;
    float value_2 = 0;

    char auth[] = "hbwE4WFW3w-VAGLrKlzzRKitOIjG0fjo";

    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.60;
      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");
    //  }
    //}

    Сейчас допилю чтобы отключался через 15 минут после полной зарядки резервной батареи на просто питание от сети ( заряженные батареи в режиме ожидания отключений сети) и буду переходить к датчикам и функции пинга интернет ( для автоматической перезагрузки роутера в случае зависания через 15 минут)
     
  3. Slavdej

    Slavdej Нерд

    Оооо А таких у меня 2 остались после ремонта UPS ( замены 40 шт. ) и зарядка автомобильная для них не подходит действительно. для этих я у китайцев отдельно специальные автоматические зарядники брал.
     
  4. b707

    b707 Гуру

    "Решил задачу" ?
    если вы программируете методом тыка - то есть ищете в инете куски кода и не разбираясь. встраиваете в программу - мне в вашей компании делать нечего.
    Я вам сказал почитать про гистерезис - читали? Что сложного добавить это в код. вместо совершенно дурацкой идеи с таймером?
     
  5. Сейчас BM8039D стоит очень дорого. А за 2500 только Сова-900 теперь купишь.