Код Arduino для простого двигателя D C для управления положением и позволяет фиксировать период c движение руки между двумя переключателями, подключенными с левой и правой стороны - PullRequest
0 голосов
/ 05 августа 2020

Контур инкубатора. D C Motor

Привет Всем, я работаю над инкубатором, чтобы сделать его полностью автоматическим c. Я использовал прилагаемый код для изменения положения пластин каждые 3 часа, так как это простой двигатель D C и не имеет точного контроля положения. таким образом, активация мотора на 2 секунды вперед, а затем на 2 секунды назад не возвращает рычаг мотора обратно в его фактическое положение (движение вперед больше, чем назад за те же 2 секунды). Так что этот метод - не лучший выбор.

Теперь я хочу использовать два переключателя в левом и правом положении, рука мотора должна колебаться между переключателями. При запуске arduino должен переместить моторную руку в одну из сторон (влево или вправо), проверив состояние переключателей, ЕСЛИ рука дойдет до левого переключателя, она должна задержаться там на 3 часа, а после этого переместить руку вправо, пока правый переключатель нажат, остановитесь на нем и снова подождите 3 часа, а затем снова переместитесь влево.

Мне нужно, чтобы этот цикл продолжался снова и снова.

Пожалуйста, помогите мне в этом коде . Заранее всем спасибо



    int pin7 = 7;
int pin6 = 6;
void setup() {
  pinMode(pin6, OUTPUT);
  pinMode(pin7, OUTPUT);
  digitalWrite(pin6, LOW);
  digitalWrite(pin7, LOW);
}
void loop(){
  digitalWrite(pin6, HIGH);
  delay(2000);
  digitalWrite(pin6, LOW);
  delay(10800000);   //Delay 3 Hours
  digitalWrite(pin7, HIGH);
  delay(2500);
  digitalWrite(pin7, LOW);
  delay(10800000);   //Delay 3 hours
}
        

1 Ответ

0 голосов
/ 05 августа 2020

полный код

// define motorPotiton class to tell you  wher the moter
enum class MotorPosition
{
  one,
  two,
  unknown_positon
};

// define connections location passed on your hardware
const int switch_one_pin = 4;
const int switch_two_pin = 5;
const int motor_forward_Pin = 7;
const int motor_backward_pin = 6;

void setup()
{
  // define direction of connection
  pinMode(motor_backward_pin, OUTPUT);
  pinMode(motor_forward_Pin, OUTPUT);
  pinMode(switch_one_pin, INPUT);
  pinMode(switch_two_pin, INPUT);

  // set motor in second location at start
  changeMotorPosition(MotorPosition::two);
}
void loop()
{
  changeMotorPosition(MotorPosition::one);
  delay(10800000); //Delay 3 Hours
  changeMotorPosition(MotorPosition::two);
  delay(10800000); //Delay 3 hours
}


//******************************************************************
//           ****       helper functions       ****
// ******************************************************************

void changeMotorPosition(MotorPosition newPosition)
{
  // define a static variable to save cuerrnet location 
  // if you don't know what is static means .. you could think of it as a global variable but just inside this function ...means only ceareated one time
  static MotorPosition motorCurrentPosition = MotorPosition::unknown_positon;

  // if motor is alerady in the correct place then do nothing
  if(getActualPosition() == newPosition ){
          // just make sure that you update the current poition
           motorCurrentPosition = newPosition;
          return;
  }

  if(getActualPosition() == MotorPosition::unknown_positon){
    // motor is not in one of it's the position
    // this will happen if motor dose note have selfLock system 
    // so we will check on last saved position
    if(motorCurrentPosition == newPosition){
      // if you like you could rest the motor to correct place 
      // but i will let it not so important 
      // TO DO : make motor go back to correct place 
      return;
    }
  }

  // now let see were you like to go
  switch (newPosition)
  {
  case MotorPosition::one:
        // go forward untill you reach the second position
        while (digitalRead(switch_two_pin) == LOW)
        {
          digitalWrite(motor_forward_Pin,HIGH); 
        }
        // then stop motor
        digitalWrite(motor_forward_Pin,LOW);
        //change the currnt location Programmaticlly
        motorCurrentPosition = MotorPosition::one;
        
    break;

  case MotorPosition::two:
        // go backword untill you reach the first position
        while (digitalRead(switch_one_pin) == LOW)
        {
          digitalWrite(motor_backward_pin,HIGH); 
        }
        // then stop motor
        digitalWrite(motor_forward_Pin,LOW);
        //change the currnt location programmaticlly
        motorCurrentPosition = MotorPosition::two;
    break;

  default:
        // that means newPosition == unknown position
        // do nothing this will be error in calling function
    break;
  }
}

// the follloiwing function will return the acuall location of motor
MotorPosition getActualPosition(){
  if(digitalRead(switch_one_pin) == HIGH) return MotorPosition::one;
  if(digitalRead(switch_two_pin)==HIGH) return MotorPosition::two;
  return MotorPosition::unknown_positon;
}

некоторые пояснения

сначала вам нужно знать, что код arduino - это всего лишь код c++, поэтому, если вы уже знаете c++, то вам было легко чтобы понять

enum class MotorPosition
{
  one,
  two,
  unknown_positon
};

, как вы видите, я создал enum class с именем MotorPosition, чтобы использовать его в качестве переменной позиции, это даст вам возможность сделать переменную типа MotorPosition и только принять одно из трех значений (одно, два, unkonwn)

// look at int type can take any number value 
int a = 5;
// look at MotorPositon type can take one of it's value like this
MotorPosition b = MotorPosition::one;

подробнее о классе enum в cpp

затем я использую changeMotorPosition функцию, которая поможет вам изменить местоположение двигателя, просто укажите его местоположение, и оно будет go для него вы можете назвать это так

changeMotorPosition(MotorPosition::one); // go for first location
changeMotorPosition(MotorPosition::two); // go for second location

теперь прочитайте весь код и получайте удовольствие:)

...