Кто-нибудь может проверить мой код? Мой Arduino не делает последовательный цикл подсчета

Мне интересно, может ли кто-нибудь взглянуть на мой код и дать мне знать, если с ним что-то не так. Я сделал код для меня некоторое время назад и сделал быстрый тест, и он, казалось, работал. Теперь я построил пневматическую машину, чтобы она работала, и она делает некоторые странные вещи.

Первое реле включает и выключает пневматический соленоид, он соединен с небольшим пневматическим цилиндром, он входит и выходит. Этот цилиндр заставляет пневматический питатель активироваться и двигаться вперед и назад.

Питатель оснащен датчиком приближения, который загорается, когда питатель находится в положении покоя.

Соленоид включается примерно на полсекунды, а затем снова выключается, это выталкивает маленький цилиндр наружу, а затем обратно. Это посылает фидер вперед, затем он поворачивается и возвращается в свое положение покоя. Arduino ждет сигнала от датчика приближения, чтобы сообщить ему, что фидер вернулся в свое положение покоя, прежде чем сделать это снова.

Затем он повторяет этот подцикл около 20 раз.

После 20 субциклов Arduino включает второе реле примерно на секунду, прежде чем снова выключить его.

Затем он делает весь этот полный цикл 20 раз перед остановкой.

Есть также мгновенный переключатель, который при нажатии должен перезапустить все снова.

Это почти работает, самое близкое, что у меня было, - это то, где он делал циклы, но считал их неправильно. я изменил подцикл на 16 вместо 20, и он будет считаться где-то между 10 и 16. кажется, каждый раз он будет считать по-разному.

Я только что купил новую плату и попробовал снова, но теперь она считает до пяти субциклов, а затем прыгает на пушку и не ждет сигнала от датчика приближения, прежде чем сделать следующий подцикл. Таким образом, снова подсчет заканчивается неправильно.

Есть идеи, что я мог бы попробовать?

int Relay_1 = 10;           //first Relay
int Relay_2 = 11;           //second Relay
int Prox_Input = 12;        //input signal from proximity sensor
int Switch_Input = 13;      //the switch

int Cycle_Number = 20;      //number of repeating number of "complete" cycle
int Sub_Cycle_Number = 20;  //number of repeating number of "sub" cycle
int Delay_Cycle = 1000;     //delay of the "Complete" Cycle in milleseconds
int Delay_Sub_Cycle = 500;  //delay of the "Sub" Cycle  in milliseconds

bool Button_Pushed = true ; //the state required for the button
int i, j;

void setup() {
  /*configurate the output relays to be begin "low"*/
  pinMode(Relay_1 , OUTPUT);
  digitalWrite(Relay_1, LOW);

  pinMode(Relay_2 , OUTPUT);
  digitalWrite(Relay_2 , LOW);
  /*===========================================================*/
  /*configurate the input switch and sensor*/
  pinMode(Prox_Input , INPUT);
  pinMode(Switch_Input , INPUT_PULLUP);
  /*===========================================================*/
  /*configurate Serial port if you want it*/
  Serial.begin(9600);
  /*===========================================================*/
}

void loop() {
  if (Check_Button() == Button_Pushed) { //check the button
    for (i = 1 ; i <= Cycle_Number ; i++) { //the loop of the "complete" Cycle
      for (j = 1 ; j <= Sub_Cycle_Number ; j++) { //the loop of the "sub" Cycle
        digitalWrite(Relay_1 , HIGH);
        delay(Delay_Sub_Cycle);
        digitalWrite(Relay_1 , LOW);
        while (digitalRead(Prox_Input) == HIGH) {} // waiting the sensor signal
      }
      digitalWrite(Relay_2 , HIGH);
      delay(Delay_Sub_Cycle);
      digitalWrite(Relay_2 , LOW);
      delay(Delay_Cycle);
    }
  }
}

bool Check_Button()  {
  int Reading_1;
  int Reading_2;

  Reading_1 = digitalRead(Switch_Input);
  delay(20);
  Reading_2 = digitalRead(Switch_Input);
  if ((Reading_1 == 1) && (Reading_2 == 1))
    return true;
  else
    return false;
}

, 👍-2

Обсуждение

пожалуйста, конкретизируйте проблему. попробуйте добавить некоторую задержку в цикле sub., @Vaibhav

6V на самом деле недостаточно, чтобы поставить на этот бочонок домкрат. Вам действительно нужно не менее 7,5 В из-за падения напряжения на регуляторе. Если вы хотите использовать батарею 6V, то получите регулятор переключения, чтобы сделать 5V и подать его в контакт 5V вместо этого., @Delta_G

На вашем нечетком изображении отсутствует много важной информации, которая обычно присутствует на схеме. Ссылки на техническую информацию обо всех аппаратных устройствах могут помочь, ссылки azon обычно являются информацией о продажах и бесполезны для технической информации. Я согласен с использованием Vin из-за дополнительной фильтрации, но вам нужно подать на него напряжение 7,5 или более вольт, как упоминалось Delta_G. Если бы я взял SWAG, у вас либо был бы дребезг на входе, и/или нестабильность источника питания, либо отказ., @Gil


2 ответа


0

Единственной причиной, по которой он мог бы "поторопиться", была бы эта строка:

         while(digitalRead(Prox_Input) == HIGH){}          // ожидание сигнала датчика 

Я предлагаю вам проверить наличие перехода, то есть убедиться, что бесконтактный переключатель стал НИЗКИМ, а затем дождаться, пока он снова станет ВЫСОКИМ. Так, например, если передача ВЫСОКОГО уровня на реле должна привести к тому, что датчик приближения будет считывать НИЗКИЙ уровень, затем вставьте петлю, чтобы убедиться, что он это делает, прежде чем продолжить.

,

0

В вашем нечетком изображении отсутствует много важной информации, которая обычно содержится на схеме. Ссылки на техническую информацию обо всех аппаратных устройствах помогли бы, ссылки azon обычно являются информацией о продажах и бесполезны для технической информации. Я согласен с использованием Vin из-за дополнительной фильтрации, но вам нужно подать на него напряжение 7,5 или более вольт, как упоминалось Delta_G, Если бы я взял ДОБЫЧУ, у вас либо отказ входного сигнала, либо нестабильность питания и / или сбой.

,