Кто-нибудь может проверить мой код? Мой 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;
}
@Jase, 👍-2
Обсуждение2 ответа
Единственной причиной, по которой он мог бы "поторопиться", была бы эта строка:
while(digitalRead(Prox_Input) == HIGH){} // ожидание сигнала датчика
Я предлагаю вам проверить наличие перехода, то есть убедиться, что бесконтактный переключатель стал НИЗКИМ, а затем дождаться, пока он снова станет ВЫСОКИМ. Так, например, если передача ВЫСОКОГО уровня на реле должна привести к тому, что датчик приближения будет считывать НИЗКИЙ уровень, затем вставьте петлю, чтобы убедиться, что он это делает, прежде чем продолжить.
В вашем нечетком изображении отсутствует много важной информации, которая обычно содержится на схеме. Ссылки на техническую информацию обо всех аппаратных устройствах помогли бы, ссылки azon обычно являются информацией о продажах и бесполезны для технической информации. Я согласен с использованием Vin из-за дополнительной фильтрации, но вам нужно подать на него напряжение 7,5 или более вольт, как упоминалось Delta_G, Если бы я взял ДОБЫЧУ, у вас либо отказ входного сигнала, либо нестабильность питания и / или сбой.
- Как я могу прервать задержку() при нажатии кнопки?
- Объявление переменной внутри основного цикла
- Светодиод мигает с помощью кнопки
- в то время как (1) внутри, если условно
- HTML-страница переменной ESP8266 Webserver ESP8266WebServer (не как один постоянный символ)
- ESP8266 Webserver ESP8266WebS сервер перемещает функцию обработчика в отдельный файл .h .c
- Понимание кода Debounce
- Как использовать передатчик и приемник для условной отправки строковых сообщений получателю?
пожалуйста, конкретизируйте проблему. попробуйте добавить некоторую задержку в цикле sub., @Vaibhav
6V на самом деле недостаточно, чтобы поставить на этот бочонок домкрат. Вам действительно нужно не менее 7,5 В из-за падения напряжения на регуляторе. Если вы хотите использовать батарею 6V, то получите регулятор переключения, чтобы сделать 5V и подать его в контакт 5V вместо этого., @Delta_G
На вашем нечетком изображении отсутствует много важной информации, которая обычно присутствует на схеме. Ссылки на техническую информацию обо всех аппаратных устройствах могут помочь, ссылки azon обычно являются информацией о продажах и бесполезны для технической информации. Я согласен с использованием Vin из-за дополнительной фильтрации, но вам нужно подать на него напряжение 7,5 или более вольт, как упоминалось Delta_G. Если бы я взял SWAG, у вас либо был бы дребезг на входе, и/или нестабильность источника питания, либо отказ., @Gil