Остановка цикла while по или

Skif42
Offline
Зарегистрирован: 19.08.2017

День добрый!

Делаю слайдер для таймлапса.

Пока пишу скетч для него.

Ардуинко получает по 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 пульте.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Skif42 пишет:

while (digitalRead(5)== HIGH){ // срабатывание концевика (как бы еще и кнопку с пульта сюдабы присобачить?)

Ну, так и присобачить. Не знаю как Вы проверяете, что кнопка на пульте нажата, допустим это делает функция isRCButtonPressed(). Тогда вот так и присобачиваете

while (digitalRead(5)== HIGH || ! isRCButtonPressed()){

 

Skif42
Offline
Зарегистрирован: 19.08.2017

Очень криво я проверяю кнопки пульта

#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
  }  


}