Проект перестает работать. Я делал автоматический звонок для колледжа.

Тема в разделе "Arduino & Shields", создана пользователем Vladimirkorneev, 14 ноя 2018.

  1. Во время тестирования проекта без подключения нагрузки к реле все работало сутками, после подключения он даёт 1-4 звонка и все накрывается. Дисплей перестает работать и звонки не подаются. Не могу прикрепить схему подключения, попробую объяснить на выход 3.3 вольта подключены кнопки. На выход в 5 вольт реле, дисплей и счётчик времени
    Код (C++):
    #include <LiquidCrystal_I2C.h>
    #include <Time.h>
    #include <Wire.h>
    #include <DS1307RTC.h>

    LiquidCrystal_I2C disp(0x27,16,2);

    const byte RELAY_PIN = 5;

    bool isShorten  = false;
    bool isAuto     = false;

    void setup()
    {
      //disp.init();
      disp.begin();
      //disp.backlight();
      setSyncProvider(RTC.get);
      //Часы, минуты, секунды, день, месяц, год
      setTime(6,59,50,5,11,2018);
      RTC.set(now());
      pinMode(RELAY_PIN, OUTPUT);
      currMode();
    }

    void loop() {
      //disp.backlight();
      if ((hour() == 20) && minute() == 0 && (second() == 0)) { disp.noBacklight(); }
      if ((hour() == 7) && minute() == 0 && (second() == 0)) { disp.backlight(); }
      if ( (hour() == 0) && (minute() == 0) && (second() == 0) && isAuto) { isAuto = true; }
      if ( (hour() == 0) && (minute() == 0) && (second() == 0) && !isAuto){ isShorten = false; isAuto = false; }
      if ( second() == 0 ) { disp.clear(); }
      tmElements_t tm;
      if (RTC.read(tm)) {
        modeSettings(checkButton());
        if ( !isAuto ) {
          mode(weekday());
        }
     
        if ( isAuto )
        {
          disp.setCursor(0,0);
          disp.print("Auto");
        }
     
        if ( weekday() == 1 )
        {
          isAuto = true;
          disp.setCursor(0,0);
          disp.print("Auto");
        }
     
        Serial.println();
        currMode();
        disp.setCursor(10,0);
        disp.print(weekDay(weekday()));
        disp.setCursor(14,0);
        disp.print(day());
        disp.setCursor(0,1);
        disp.print(month());
        disp.print("/");
        disp.print(year());
        disp.setCursor(8,1);
        disp.print(hour());
        disp.print(":");
        disp.print(minute());
        disp.print(":");
        disp.print(second());
      }
      else
      {
        disp.print("time error");
      }
      delay(300);
    }

    bool isSaturday(int weekDay)
    {
      if (weekDay == 7) { return true; }
      else { return false; }
    }

    void mode(int weekDay)
    {
       if (isShorten && isSaturday(weekDay))
       {
          shortSaturday();
       }
       if (!isShorten && isSaturday(weekDay))
       {
          typicalSaturday();
       }
       if (isShorten && !isSaturday(weekDay))
       {
          shortDay();
       }
       if (!isShorten && !isSaturday(weekDay))
       {
          typicalDay();
       }
    }

    void currMode()
    {
      if (isShorten  && !isAuto) { disp.setCursor(0,0); disp.print("Short");   }
      if (!isShorten && !isAuto) { disp.setCursor(0,0); disp.print("Typical"); }
      //else                { disp.setCursor(0,0); disp.print("Auto");    }
    }

    void modeSettings(int btn)
    {
        if( btn == 4 )
        {
          alarm();
        }
        if( btn == 2 )
        {
          isShorten = false;
          isAuto    = false;
          disp.clear();
          disp.setCursor(0,0);
          disp.print("Typical");
        }
        if( btn == 3 )
        {
          isShorten = true;
          isAuto    = false;
          disp.clear();
          disp.setCursor(0,0);
          disp.print("Short");
        }
        if( btn == 1 )
        {
          isAuto = true;
          disp.clear();
          disp.setCursor(0,0);
          disp.print("Auto");
        }
    }

    String weekDay(int numOfWeekDay)
    {
      if (numOfWeekDay == 2) { return "Mon"; }
      if (numOfWeekDay == 3) { return "Tue"; }
      if (numOfWeekDay == 4) { return "Wed"; }
      if (numOfWeekDay == 5) { return "Thu"; }
      if (numOfWeekDay == 6) { return "Fri"; }
      if (numOfWeekDay == 7) { return "Sat"; }
      if (numOfWeekDay == 1) { return "Sun"; }
    }

    void alarm()
    {
      disp.clear();
      digitalWrite(RELAY_PIN, HIGH);
      disp.setCursor(5, 0);
      disp.print("ALARM!");
      delay(4500);
      disp.clear();
      digitalWrite(RELAY_PIN, LOW);
    }

    void typicalDay()
    {
      if (  (((hour() == 8)  && (minute() == 0 && second() == 0  ))
          || ((hour() == 8)  && (minute() == 55 && second() == 0 ))
          || ((hour() == 9)  && (minute() == 0 && second() == 0  ))
          || ((hour() == 9)  && (minute() == 45 && second() == 0 ))
          || ((hour() == 9)  && (minute() == 50 && second() == 0 ))
          || ((hour() == 10) && (minute() == 35 && second() == 0 ))
          || ((hour() == 10) && (minute() == 50 && second() == 0 ))
          || ((hour() == 11) && (minute() == 35 && second() == 0 ))
          || ((hour() == 11) && (minute() == 40 && second() == 0 ))
          || ((hour() == 12) && (minute() == 25 && second() == 0 ))
          || ((hour() == 12) && (minute() == 45 && second() == 0 ))
          || ((hour() == 13) && (minute() == 30 && second() == 0 ))
          || ((hour() == 13) && (minute() == 35 && second() == 0 ))
          || ((hour() == 14) && (minute() == 20 && second() == 0 ))
          || ((hour() == 14) && (minute() == 30 && second() == 0 ))
          || ((hour() == 15) && (minute() == 15 && second() == 0 ))
          || ((hour() == 15) && (minute() == 20 && second() == 0 ))
          || ((hour() == 16) && (minute() == 5 &&  second() == 0 ))
          || ((hour() == 16) && (minute() == 15 && second() == 0 ))
          || ((hour() == 17) && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 17) && (minute() == 5 &&  second() == 0 ))
          || ((hour() == 17) && (minute() == 50 && second() == 0 )))

         ) { alarm(); }
    }

    void shortDay()
    {
      if (   (((hour() == 8)  && (minute() == 0 && second() == 0 ))
          || ((hour() == 8)  && (minute() == 55 && second() == 0 ))
          || ((hour() == 9)  && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 10) && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 10) && (minute() == 10 && second() == 0 ))
          || ((hour() == 11) && (minute() == 10 && second() == 0 ))
          || ((hour() == 11) && (minute() == 20 && second() == 0 ))
          || ((hour() == 12) && (minute() == 20 && second() == 0 ))
          || ((hour() == 12) && (minute() == 30 && second() == 0 ))
          || ((hour() == 13) && (minute() == 30 && second() == 0 ))
          || ((hour() == 13) && (minute() == 40 && second() == 0 ))
          || ((hour() == 14) && (minute() == 40 && second() == 0 )))

         ) { alarm(); }
    }

    void typicalSaturday()
    {
      if (   (((hour() == 8)  && (minute() == 0 && second() == 0 ))
          || ((hour() == 8)  && (minute() == 45 && second() == 0 ))
          || ((hour() == 8)  && (minute() == 50 && second() == 0 ))
          || ((hour() == 9)  && (minute() == 35 && second() == 0 ))
          || ((hour() == 9)  && (minute() == 45 && second() == 0 ))
          || ((hour() == 10) && (minute() == 30 && second() == 0 ))
          || ((hour() == 10) && (minute() == 35 && second() == 0 ))
          || ((hour() == 11) && (minute() == 20 && second() == 0 ))
          || ((hour() == 11) && (minute() == 30 && second() == 0 ))
          || ((hour() == 12) && (minute() == 15 && second() == 0 ))
          || ((hour() == 12) && (minute() == 20 && second() == 0 ))
          || ((hour() == 13) && (minute() == 5 &&  second() == 0 ))
          || ((hour() == 13) && (minute() == 15 && second() == 0 ))
          || ((hour() == 14) && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 14) && (minute() == 5 &&  second() == 0 ))
          || ((hour() == 14) && (minute() == 50 && second() == 0 ))
          || ((hour() == 15) && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 16) && (minute() == 0 &&  second() == 0 )))

         ) { alarm(); }
    }

    void shortSaturday()
    {
      if (   ((hour() == 8)  && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 9)  && (minute() == 0 &&  second() == 0 ))
          || ((hour() == 9)  && (minute() == 10 && second() == 0 ))
          || ((hour() == 10) && (minute() == 10 && second() == 0 ))
          || ((hour() == 10) && (minute() == 20 && second() == 0 ))
          || ((hour() == 11) && (minute() == 20 && second() == 0 ))
          || ((hour() == 11) && (minute() == 30 && second() == 0 ))
          || ((hour() == 12) && (minute() == 30 && second() == 0 ))
          || ((hour() == 12) && (minute() == 40 && second() == 0 ))
          || ((hour() == 13) && (minute() == 40 && second() == 0 ))

         ) { alarm(); }
    }

    int checkButton()
    {
      int in = analogRead(A0);

        if(in >= -10 && in <= 10)
        {
            return 1;
        }
        else if(in >= 70 && in <= 115)
        {
            return 2;
        }
        else if(in >= 210 && in <= 245)
        {
            return 3;
        }
        else if(in >= 320 && in <= 375)
        {
           return 4;
        }
        else if(in >= 480 && in <= 520)
        {
           return 5;
        }

      delay(100);
    }
     
     

    Вложения:

    Последнее редактирование: 14 ноя 2018
  2. NikitOS

    NikitOS Король шутов Администратор

    Vladimirkorneev нравится это.
  3. Извини, я понимаю, малочитабельно, я первый раз выкладываю вопрос на каком либо форуме. Недавно заинтересовался этим.
     
  4. DIYMan

    DIYMan Guest

    Помехи по питанию при срабатывании реле.
     
  5. Таааак, и как это исправить?
     
  6. parovoZZ

    parovoZZ Гуру

    Если ничего не понимаешь в схемотехнике и программировании - не лезь. Научись или закажи у умных дядек. Здесь целая куча ошибок.
     
  7. DIYMan

    DIYMan Guest

    Для начала - вбить ключевую фразу в гугль и посмотреть на выдачу: там есть варианты решений, тема избитая довольно-таки ;)

    Если хотите более конкретной помощи, то, как минимум - надо схему ваших соединений и перечисление всех китайских модулей, которые там юзаются.
     
  8. По твоему я делая этот проект не учусь чему-то?
     
    Последнее редактирование: 14 ноя 2018
  9. И е
    И если тут так много ошибок укажи на них, я их с удовольствием исправлю.
     
  10. b707

    b707 Гуру

    ну ошибки или не ошибки. но код очень далек от оптимальности. Скажите, вас не раздражают эти длиннющие IF по 40 строк?
    Не проще было бы все звонки собрать в массив, отсортировать и искать по нему? Весь код сократился бы строк до 40 вместо нынешних 200-от, да и вносить изменения было бы всяко удобнее.
    А вот вдогонку - предложение попроще... Зачем в КАЖДОМ условии проверять (seconds == 0) ? сделайте это один раз...
     
  11.  

    Вложения:

  12. DIYMan

    DIYMan Guest

    Это не схема, а наскальный рисунок, разглядывать, что и куда подключено - не айс. Нарисуйте схему, пж. И дайте ссылку хотя бы на модуль реле.
     
    parovoZZ нравится это.
  13. http://www.gdeo.ru/product/37200/KEYES_5V_Arduino_rele_modulj - это модуль реле, а рисунок лучше я сделать не могу, извините(
     
  14. DIYMan

    DIYMan Guest

    Надо не рисунок, а схему, разницу понимаете?

    Реле по виду - без опторазвязки, плохо.
     
  15. То есть реле лучше питать от отдельного источника?
     
  16. DIYMan

    DIYMan Guest

    Лучше, когда реле опторазвязано от сигнала управления. Могу ошибаться, но на вашем реле я не увидел оптопары, если это так - оно не опторазвязано, и все помехи при срабатывании реле лезут по питанию в МК, диод на модуле реле тут не спасёт, пмсм.
     
  17. parovoZZ

    parovoZZ Гуру

    Учаться по учебникам, а на практике нарабатывают опыт. Где принципиальная схема, выполненная по ГОСТ?
     
  18. parovoZZ

    parovoZZ Гуру

    Абсолютно пофигу. Надо нормально платы разводить и реле ставить не абы как.
     
  19. parovoZZ

    parovoZZ Гуру

    По коду - в общем случае оформление кода никак не влияет на работоспособность, но вот применённый алгоритм напрямую влияет на надежность. В коде не вижу вачдога. Это же звонок для колледжа, а не какой-то зд принтер. Если звонок завис, ребята будут учиться вечно?
    Если надо сменить расписание - что делать?
     
  20. Есть расписание короткое и обычное, больше не каких нет. Смена их переходит нажатием кнопки. Для незапланированного расписания есть автоматический режим. Звонки в нем подаются по кнопке
     
    Последнее редактирование: 14 ноя 2018