Остановка цикла while по или
- Войдите на сайт для отправки комментариев
Сб, 19/08/2017 - 09:40
День добрый!
Делаю слайдер для таймлапса.
Пока пишу скетч для него.
Ардуинко получает по IR каналу сигналы и выставляет шаг мотора и интервал спуска затвора а также запускает процесс.
В данный момент реализовонно практически все и можно приступать к технической части к изготовлению салазок и каретки.
Проблема в том, что остановка происходит или по кнопке стоп на плате или по концевикам. Ахочется добавить к этому возможность остановки процесса еще и с пульта
case 0xD7E84B1B: // Запускаем процесс съемки. Крутим шаговик и через заданные промежутки щелкаем затвором
while (digitalRead(5)== HIGH){ // срабатывание концевика (как бы еще и кнопку с пульта сюдабы присобачить?)
lcd.setCursor(11,0);
lcd.print("Run ");
for(int x = 0; x < step_speed; x++) { //количество шагов
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(duration);
digitalWrite(13, LOW); // Нажимаем на затвор
delay(200); // ждем
digitalWrite(13, HIGH); // Отпускаем затвор
delay(500);
}
break;
0xD7E84B1B это код кнопки пуск на IR пульте.
0x7EC31EF7 это код кнопки стопна IR пульте.
while (digitalRead(5)== HIGH){ // срабатывание концевика (как бы еще и кнопку с пульта сюдабы присобачить?)Ну, так и присобачить. Не знаю как Вы проверяете, что кнопка на пульте нажата, допустим это делает функция isRCButtonPressed(). Тогда вот так и присобачиваете
while (digitalRead(5)== HIGH || ! isRCButtonPressed()){Очень криво я проверяю кнопки пульта
#include "Stepper.h" #include "IRremote.h" #include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C lcd(0x3f, 16, 2); // Set the LCD I2C address #define STEPS 500 // int Steps2Take; // Задаем переменную в виде целого числа int receiver = 6; // Задаем пин приемника IR int step_speed = 200; // Шагов на полный оборот int duration = 1000; // Интервал по умолчанию int result; // Задаем переменную в виде целого числа // Подключаем A4988 const int stepPin = 2; const int dirPin = 3; IRrecv irrecv(receiver); // Задаем переменную для 'irrecv' decode_results results; // Задаем переменную для 'decode_results' void setup() { irrecv.enableIRIn(); // Запускаем прием IR pinMode (13, OUTPUT); // Задаем пин затвора digitalWrite(13, HIGH); // Выключаем затвор (не могу понять почему при включении платы он щелкает пару раз и остается активным) pinMode (5, INPUT_PULLUP); // Задаем пины кнопок pinMode (4, INPUT_PULLUP); // Задаем пины кнопок // Sets the two pins as Outputs A4988 pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); Wire.begin(); lcd.begin(16,2); lcd.clear(); lcd.backlight();// Включаем подсветку дисплея ( у нас же I2C все таки) lcd.setCursor(0,0); lcd.print("Step: "); lcd.print(step_speed); lcd.setCursor(0,1); lcd.print("Interval: "); lcd.print(duration / 1000); lcd.print(" sec"); lcd.setCursor(11,0); lcd.print("Stop"); } void loop() { if (irrecv.decode(&results)) // Берем полученный IR сигнал { switch(results.value) // И погнали его сравнивать { case 0x12209C7B: // - if (duration >= 2000) { result = duration-1000; duration = result; } break; case 0xAB91951F: // + if (duration <= 9000) { result = duration+1000; duration = result; } break; case 0xF377C5B7: // 0 step_speed = 25; break; case 0xE5CFBD7F: // 1 step_speed = 50; break; case 0xA23C94BF: // 2 step_speed = 100; break; case 0xE721C0DB: // 3 step_speed = 200; break; case 0xF0C41643: // 4 step_speed = 300; break; case 0x97483BFB: // 5 step_speed = 400; break; case 0x86B0E697: // 6 step_speed = 500; break; case 0x9EF4941F: // 7 step_speed = 600; break; case 0xA3C8EDDB: // 8 step_speed = 700; break; case 0x5BE75E7F: // 9 step_speed = 800; break; case 0xF63C8657: // RIGHT button pressed A4988 while (digitalRead(5)== HIGH) //срабатывание концевика for(int x = 0; x < 1; x++){ digitalWrite(dirPin,LOW); // Крутим против часовой digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); break; } break; case 0x2A89195F: // LEFT button pressed A4988 while (digitalRead(4)== HIGH) //срабатывание концевика for(int x = 0; x < 1; x++){ digitalWrite(dirPin,HIGH); // Крутим по часовой digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); break; } break; case 0xD7E84B1B: // Запускаем процесс съемки. Крутим шаговик и через заданные промежутки щелкаем затвором while (digitalRead(5)== HIGH){ // срабатывание концевика (как бы еще и кнопку с пульта сюдабы присобачить?) lcd.setCursor(11,0); lcd.print("Run "); for(int x = 0; x < step_speed; x++) { // колличество шагов за 1 цикл digitalWrite(stepPin,HIGH); delayMicroseconds(450); digitalWrite(stepPin,LOW); delayMicroseconds(450); } delay(duration); digitalWrite(13, LOW); // Нажимаем на затвор delay(200); // ждем digitalWrite(13, HIGH); // Отпускаем затвор delay(100); } break; } lcd.clear(); lcd.setCursor(0,0); lcd.print("Step: "); lcd.print(step_speed); lcd.setCursor(0,1); lcd.print("Interval: "); lcd.print(duration / 1000); lcd.print(" sec"); lcd.setCursor(11,0); lcd.print("Stop"); irrecv.resume(); // receive the next value } }