Таймер для контактной сварки

Тема в разделе "Arduino & Shields", создана пользователем Proger_xxx, 18 июн 2017.

  1. Proger_xxx

    Proger_xxx Нуб

    Доброго времени суток!

    Недавно собрал контактную сварку. Теперь необходимо логика. Чтобы в милли-секунды варка была. Чтобы логику можно было управлять с помощью одной кнопки. Кодинга написал. В протеусе не работает. Логика иная. Вместо жк дисплея использую светодиоды. Время пульса: 0,3*0,5*0,7*1 сек
    Код (C++):
    int LedR = 1;
    int LedG = 3;
    int LedB = 5;
    int Load = 9;
    int Button = 2;
    int SigTime1 = 300;
    int SigTime2 = 500;
    int SigTime3 = 700;
    int LowTime = 1000;
    int flag = 0;
    int regim = 0;

    void setup()
    {
    pinMode(LedR, OUTPUT);
    pinMode(LedG, OUTPUT);
    pinMode(LedB, OUTPUT);
    pinMode(Load, OUTPUT);
    }

    void loop()
    {
    if(digitalRead(Button) == HIGH && flag == 0)
    {
    regim ++;
    flag = 1;

    if(regim > 4)
    {
    regim = 0;
    }
    }

    if(digitalRead(Button) == LOW && flag == 1)
    {
    flag = 0;
    }

    if(regim == 0)
    {
    digitalWrite(LedR, LOW);
    digitalWrite(LedG, LOW);
    digitalWrite(LedB, LOW);
    digitalWrite(Load, LOW);
    }

    if(regim == 1)
    {
    digitalWrite(LedR, HIGH);
    digitalWrite(Load, HIGH);
    delay(SigTime1);
    digitalWrite(Load, LOW);
    digitalWrite(LedR, LOW);
    }

    if(regim == 2)
    {
    digitalWrite(LedG, HIGH);
    digitalWrite(Load, HIGH);
    delay(SigTime2);
    digitalWrite(Load, LOW);
    digitalWrite(LedG, LOW);
    }

    if(regim == 3)
    {
    digitalWrite(LedB, HIGH);
    digitalWrite(Load, HIGH);
    delay(SigTime3);
    digitalWrite(Load, LOW);
    digitalWrite(LedB, LOW);
    }
    }
     
  2. DetSimen

    DetSimen Guest

    Шта?
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    не вижу в коде кнопки запуска сварки.
    Что такое LowTime? В коде есть, но не используется.

    Код (C++):
    #define LEDR_PIN        1                               // пин 1 использовать не рекомендуется, он занят Rx/Tx
    #define LEDG_PIN        3
    #define LEDB_PIN        5
    #define LOAD_PIN        9
    #define BTN_MODE_PIN    2
    #define BTN_START_PIN   11                              // кнопка (педаль) запуска сварки
    #define BUTTON_PRESSED(pin) (!digitalRead(pin))         // макрос для удобства
    const byte numModes = 4;                                // количество режимов
    const unsigned int sigTime[numModes] = {300, 500, 700, 1000}; // длительность импульса, мс
    const unsigned int pause = 1000;                        // пауза перед следующим запуском (чтобы успело зарядиться)
    byte mode; // текущий режим
    // int LowTime = 1000;

    void setup()
    {
      pinMode(BTN_MODE_PIN, INPUT_PULLUP);                  // кнопка между пином и GND
      pinMode(BTN_START_PIN, INPUT_PULLUP);                 // кнопка между пином и GND
      pinMode(LEDR_PIN, OUTPUT);
      pinMode(LEDG_PIN, OUTPUT);
      pinMode(LEDB_PIN, OUTPUT);
      pinMode(LOAD_PIN, OUTPUT);
      pinMode(LED_BUILTIN, OUTPUT);                         // встроенный LED, обычно на пине 13. Будет индикатор старта сварки
      mode = 1;                                             // режим после включения питания. 0 - не используется
    }

    void loop()
    {
      if (BUTTON_PRESSED(BTN_MODE_PIN))                     // нажата кнопка выбора режимов
      {
        mode++;
        if (mode > numModes) mode = 1;
      }


      switch (mode)                                       // отображение текущего режима
      {
        case 1:                                           // зеленый - самый слабый режим
          digitalWrite(LEDR_PIN, LOW);
          digitalWrite(LEDG_PIN, HIGH);
          digitalWrite(LEDB_PIN, LOW);
          break;

        case 2:
          digitalWrite(LEDR_PIN, LOW);
          digitalWrite(LEDG_PIN, LOW);
          digitalWrite(LEDB_PIN, HIGH);
          break;

        case 3:
          digitalWrite(LEDR_PIN, HIGH);
          digitalWrite(LEDG_PIN, HIGH);
          digitalWrite(LEDB_PIN, LOW);
          break;

        case 4:                                           // красный - самый мощный режим
          digitalWrite(LEDR_PIN, HIGH);
          digitalWrite(LEDG_PIN, LOW);
          digitalWrite(LEDB_PIN, LOW);
          break;

        default:                                           // защита от дурака. При нештатной ситуации моргаем белым
          for (byte i = 0; i > 5; i++)
          {
            digitalWrite(LEDR_PIN, HIGH);
            digitalWrite(LEDG_PIN, HIGH);
            digitalWrite(LEDB_PIN, HIGH);
            delay(100);
            digitalWrite(LEDR_PIN, LOW);
            digitalWrite(LEDG_PIN, LOW);
            digitalWrite(LEDB_PIN, LOW);
            delay(100);
          }
      } // switch


      if (BUTTON_PRESSED(BTN_START_PIN))                    // нажата кнопка (педаль) запуска
      {
        digitalWrite(LED_BUILTIN, HIGH);
        digitalWrite(LOAD_PIN, HIGH);
        delay(sigTime[mode]);                               // задержка согласно текущему режиму
        digitalWrite(LOAD_PIN, LOW);
        digitalWrite(LED_BUILTIN, LOW);
        while (BUTTON_PRESSED(BTN_START_PIN));              // тупим пока не отпустят педаль
        delay(pause);                                       // защитная пауза
      }
    } // loop
     
    Последнее редактирование: 19 июн 2017
    Cynep нравится это.
  4. qwone

    qwone Гик

    Примитивное ТЗ, но если напишу я , то работать будет, а вот понять как написана программы нет.
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    потому что режимов четыре, а светодиодов три ;)
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    во, именно такое чувство у меня, когда я рассматриваю ваш код с классами.
     
  7. Proger_xxx

    Proger_xxx Нуб

    Хорошо. Я постараюсь из себя создать что то
     
  8. Proger_xxx

    Proger_xxx Нуб

    Может это глюк Протеуса? Частота кварца не соответствующая может быть. Сработала аж через 25 секунд. То есть выключилась через 25 сек. Странно. Совсем в логику не ложиться
     
  9. Cynep

    Cynep Нерд

    А что вообще должно происходить? По-шагово.
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    что-то вроде такого, только полуавтомат.


     
    Cynep нравится это.
  11. qwone

    qwone Гик

    А что делать.:oops: То что подсел на стиль ООП. Зато пишется легко , Да и отлаживать проще. Я даже удивляюсь, как вы на своем стиле справляетесь.;)
    Код (C++):
    /* Contact welding.ino ПО для контактной сварки
      ардуино
      пин 2,3 <==>  светодиоды индик режима 00,01,10,11
      пин 4   <==>  кнопка выбора режима 0 1 2 3
      пин 5   <==>  реле прожега
      пин 6   <==>  кнопка пуск
    */

    class Cl_Sys;// предварительно объявить о создании класса Sys для послед подключения к нему
    //----------------Cl_LED------------------------------------------------------------
    class Cl_LED {
        byte pin; // нога для подключения светодиода
        bool inv; // 0 светодиод горит при 1/ 1 светодиод горит при 0
        bool stat_ON = 0, led = 0;
        uint32_t time = 500, past = 0;
      public:
        //указатель на следующий компонент
        Cl_LED *pnt_LED;
        //конструктор
        Cl_LED(Cl_Sys *Sys, byte _pin, bool _inv);
        // setup()
        void setup() {
          pinMode(pin, OUTPUT);// подключить светодиод
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
        // loop()
        void loop() {
          if (stat_ON && millis() - past >= time)OFF();
        }
        // включить светодиод
        void ON() {
          stat_ON = 0;
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // включить светодиод на время
        void ON( uint32_t _time) {
          time = _time;
          stat_ON = 1;
          past = millis();
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // выключить светодиод
        void OFF() {
          stat_ON = 0;
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
    };
    //----------------Cl_Mech_BTN_4mode------------------------------------------------------------
    // класс на механич кнопку выбирающую 4 варианта последовательно и записыв в памяти
    #include <EEPROM.h>
    class Cl_Mech_BTN_4mode {
        int adrEEPROM;
        byte pin; // номер ноги на кнопке
        bool inv; // инверсия вывода
        void (*Do1)(), (*Do2)() , ( *Do3)(), ( *Do4)();// указатели на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
        byte mode;// 0,1,2,3 режим
      public:
        //указатель на следующий компонент
        Cl_Mech_BTN_4mode *pnt_Mech_BTN_4mode;
        //конструктор
        Cl_Mech_BTN_4mode(Cl_Sys *Sys, byte _pin, bool _inv, void (* _Do1)(), void (* _Do2)(), void (* _Do3)(), void (* _Do4)(), int _adrEEPROM);
        void setup() {
          pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
          btn = digitalRead(pin)^inv; // прочитать реальное значение на выводе};
          byte _mode = EEPROM.read(adrEEPROM);
          if (_mode <= 3 )mode = _mode;
          else mode = 0;
          EEPROM.update(adrEEPROM, mode);
          if (mode == 0) Do1();
          else if (mode == 1) Do2();
          else if (mode == 2) Do3();
          else Do4();
        }
        void loop () {
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                              // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;                                // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin)^inv ;                   // прочитать реальное значение на выводе
            if (btn_old && !btn) {
              byte _mode = EEPROM.read(adrEEPROM);
              ++_mode;
              if (_mode <= 3 )mode = _mode;
              else mode = 0;
              EEPROM.update(adrEEPROM, mode);
              if (mode == 0) Do1();
              else if (mode == 1) Do2();
              else if (mode == 2) Do3();
              else Do4();
            }
          }
        }
    };
    //----------------Cl_Mech_BTN------------------------------------------------------------
    // класс на механич кнопку подкл к кнопке Ардуины.
    class Cl_Mech_BTN {
        byte pin; // номер ноги на кнопке
        void (* Do)();// указатель на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        //указатель на следующий компонент
        Cl_Mech_BTN *pnt_Mech_BTN;
        //конструктор
        Cl_Mech_BTN(Cl_Sys *Sys, byte _pin, void (* _Do)());
        void setup() {
          pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
          btn = digitalRead(pin); // прочитать реальное значение на выводе};
        }
        void loop () {
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                              // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;                                // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin) ;                   // прочитать реальное значение на выводе
            if (btn_old && ! btn) Do();
          }
        }
    };
    //----------------Cl_Sys------------------------------------------------------------
    class Cl_Sys {
      public:
        // указатели на блоки однотипных классов в системе
        Cl_LED * Start_LED = NULL;
        Cl_Mech_BTN_4mode * Start_Mech_BTN_4mode = NULL;
        Cl_Mech_BTN * Start_Mech_BTN = NULL;
        void setup() {
          for (Cl_LED *i = Start_LED; i != NULL           ; i = i->pnt_LED)                       i->setup();
          for (Cl_Mech_BTN_4mode *i = Start_Mech_BTN_4mode; i != NULL; i = i->pnt_Mech_BTN_4mode) i->setup();
          for (Cl_Mech_BTN *i = Start_Mech_BTN            ; i != NULL; i = i->pnt_Mech_BTN)       i->setup();
        }
        void loop () {
          for (Cl_LED *i = Start_LED                      ; i != NULL; i = i->pnt_LED)             i->loop ();
          for (Cl_Mech_BTN_4mode *i = Start_Mech_BTN_4mode; i != NULL; i = i->pnt_Mech_BTN_4mode)  i->loop ();
          for (Cl_Mech_BTN *i = Start_Mech_BTN            ; i != NULL; i = i->pnt_Mech_BTN)        i->loop ();
        }
    };
    //-----------------конструкторы классов вход в систему-------------------------------
    Cl_LED::Cl_LED(Cl_Sys *Sys, byte _pin, bool _inv): pin(_pin), inv(_inv) {
      pnt_LED = Sys->Start_LED;
      Sys->Start_LED = this;
    }
    Cl_Mech_BTN_4mode::Cl_Mech_BTN_4mode(Cl_Sys *Sys, byte _pin, bool _inv, void (* _Do1)(), void (* _Do2)(), void (* _Do3)(), void (* _Do4)(), int _adrEEPROM)
      :                                                pin(_pin), inv(_inv),    Do1(_Do1),       Do2(_Do2),       Do3(_Do3),   Do4(_Do4), adrEEPROM(_adrEEPROM) {
      pnt_Mech_BTN_4mode = Sys->Start_Mech_BTN_4mode;
      Sys->Start_Mech_BTN_4mode = this;
    }
    Cl_Mech_BTN::Cl_Mech_BTN(Cl_Sys *Sys, byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {
      pnt_Mech_BTN = Sys->Start_Mech_BTN;
      Sys->Start_Mech_BTN = this;
    }
    //------------------компоновка-------------------------------------------------------
    Cl_Sys *Sys = new Cl_Sys();
    Cl_LED *LED1 = new Cl_LED(Sys,/*пин*/2,/*инверсия*/0);// создать светодиод LED1
    Cl_LED *LED2 = new Cl_LED(Sys,/*пин*/3,/*инверсия*/0);// создать светодиод LED2
    uint16_t time;// время прожига
    const uint16_t time_03s = 300;
    const uint16_t time_05s = 500;
    const uint16_t time_07s = 700;
    const uint16_t time_1s = 1000;
    Cl_LED *WELDING = new Cl_LED(Sys,/*пин*/5,/*инверсия*/0);// создать вывод на прожиг
    void Do1_BTN1() {
      time = time_03s;
      LED1->OFF();
      LED2->OFF();
    }
    void Do2_BTN1() {
      time = time_05s;
      LED1->ON();
      LED2->OFF();
    }
    void Do3_BTN1() {
      time = time_07s;
      LED1->OFF();
      LED2->ON();
    }
    void Do4_BTN1() {
      time = time_1s;
      LED1->ON();
      LED2->ON();
    }
    Cl_Mech_BTN_4mode *BTN1 = new Cl_Mech_BTN_4mode(Sys,/*пин*/4,/*инверсия*/0,
        /*обработчик1*/Do1_BTN1,/*обработчик2*/Do2_BTN1,/*обработчик3*/Do3_BTN1,/*обработчик4*/Do4_BTN1,/*adrEEPROM*/0x00);// создать кнопку BTN1
    void Do_BTN2() {
      WELDING->ON(time);
    }
    Cl_Mech_BTN *BTN2 = new Cl_Mech_BTN(Sys,/*пин*/6,/*обработчик*/Do_BTN2);// создать кнопку BTN2
    //------------------ main()----------------------------------------------------------
    void setup() {
      Sys->setup();
    }

    void loop() {
      Sys->loop();
    }
     
    Последнее редактирование: 20 июн 2017
    Промах нравится это.