Всем привет, в мне проблема с реализацией включения шагового двигателя с кнопки. Задача состоит в том, чтобы при нажиме кнопки сработал реле прошло 2 секунды и сработал мотор, сделал 200 шагов и остановился. При следующем нажатия кнопки тоже самое. Я уже реализовал реле и время когда должен включится мотор. Вот как задать 200 шагов через Step / Дир вот в чем проблема. Может есть какие-то варианты запуска двигателя с кнопки. Буду благодарен. Код (C++): unsigned long mill; const byte btnPin =/*пин*/A0; bool btn; const byte relePin =/*пин*/3; bool Rele; unsigned long past; const unsigned long time1sec = 2000; unsigned long eventTime=0; void setup() { pinMode(btnPin, INPUT_PULLUP); pinMode(relePin, OUTPUT); digitalWrite(relePin, Rele = 0); } void loop() { mill = millis(); btn = digitalRead(btnPin); if (!btn) { /* если кнопка нажата*/ digitalWrite(relePin, Rele = 1); /*то вкл реле*/ past = mill; } if (Rele & mill - past >= time1sec) {/*если реле вкл больше 1 сек*/ digitalWrite(relePin, Rele = 0);/*то выкл*/ past = mill; eventTime=0; } if(!btn) eventTime=millis(); // засекли когда произошло событие if(eventTime && (millis()-eventTime>2000)) // проверям прошло ли XXXX миллесекунд с события { // как поместить сюда мотор } }
Код (C++): /**/ unsigned long mill; unsigned long mill2; //-------------------------------------- const byte btnPin =/*пин*/A0; bool btn; const byte ledPin =/*пин*/3; bool Led; const byte ledPin1 =/*пин*/5; bool Led1; unsigned long past; unsigned long past2; const unsigned long time1sec = 2000; const unsigned long time2sec = 2000; const unsigned long time3sec = 10; unsigned long eventTime=0; int stp = 13; //подключите 13 пин к step int dir = 12; //подключите 12 пин к dir int a = 0; void setup() { pinMode(btnPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); pinMode(ledPin1, OUTPUT); digitalWrite(ledPin, Led = 1); digitalWrite(ledPin1, Led1 = 1); pinMode(stp, OUTPUT); pinMode(dir, OUTPUT); } void loop() { mill = millis(); btn = digitalRead(btnPin); if (!btn) { /* если кнопка нажата*/ digitalWrite(ledPin, Led = 0); /*то вкл светодиод*/ past = mill; } if (Led1 & mill - past >= time1sec) {/*если светодиод горит больше 1 сек*/ digitalWrite(ledPin, Led = 1);/*то выкл*/ past = mill; } //----------------------------------------------------------- if(!btn) eventTime=millis(); // засекли когда произошло событие if(eventTime && (millis()-eventTime>2000)) // проверям прошло ли XXXX миллесекунд с события { if (a < 200) // вращение на 200 шагов в направлении 1 { a++; digitalWrite(stp, HIGH); time3sec; digitalWrite(stp, LOW); time3sec; } else { digitalWrite(dir, HIGH); a++; digitalWrite(stp, HIGH); time3sec; digitalWrite(stp, LOW); time3sec; } if (btn) { /* если кнопка нажата*/ digitalWrite(stp, LOW); a = 0; } } } от переделал
Добрый вечер, Вот добился таких успехов, при первом нажатии на кнопку срабатывает реле через 3 секунды двигатель делает 100 шагов и реле отключается. Но при следующем нажатия кнопки реле срабатывает, а двигатель не реагирует. Как сделать чтобы повторялось вновь и вновь Код (C++): #include <AccelStepper.h> AccelStepper Stepper1(1,13,12); unsigned long mill; const byte btnPin = A0; bool btn; const byte relePin = 5; bool Myrele; unsigned long past; const unsigned long time1sec = 3000; unsigned long eventTime=0; void setup() { Stepper1.setMaxSpeed(3000); Stepper1.setAcceleration(1300); pinMode(btnPin, INPUT_PULLUP); pinMode(relePin, OUTPUT); digitalWrite(relePin, Myrele = 0); } void loop() { mill = millis(); btn = digitalRead(btnPin); if (!btn) { /* если кнопка нажата*/ digitalWrite(relePin, Myrele = 1); /*то вкл реле*/ past = mill; } if (Myrele & mill - past >= time1sec) {/*если реле вкл больше 1 сек*/ digitalWrite(relePin, Myrele = 0);/*то выкл*/ past = mill; } if(!btn) eventTime=millis(); // засекли когда произошло событие if(eventTime && (millis()-eventTime>2000)) // проверям прошло ли XXXX миллесекунд с события { Stepper1.runSpeed(); Stepper1.moveTo(100); while(Stepper1.currentPosition() != 100) Stepper1.run(); } }