Доброго времени суток! Недавно собрал контактную сварку. Теперь необходимо логика. Чтобы в милли-секунды варка была. Чтобы логику можно было управлять с помощью одной кнопки. Кодинга написал. В протеусе не работает. Логика иная. Вместо жк дисплея использую светодиоды. Время пульса: 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); } }
не вижу в коде кнопки запуска сварки. Что такое 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
Может это глюк Протеуса? Частота кварца не соответствующая может быть. Сработала аж через 25 секунд. То есть выключилась через 25 сек. Странно. Совсем в логику не ложиться
А что делать. То что подсел на стиль ООП. Зато пишется легко , Да и отлаживать проще. Я даже удивляюсь, как вы на своем стиле справляетесь. Спойлер: МОЙ КОД Код (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(); }