Возможность запуска двух функций одновременно

Итак, я делаю проект, в котором группа сервоприводов перемещается на 90–120 градусов и постепенно ускоряется, пока не достигнет максимальной скорости и, таким образом, не останется на этой скорости. Это делается путем редактирования задержки в цикле развертки сервопривода. Однако, хотя это и работает, со следующим компонентом это не работает.

Что я хочу сделать дальше, так это RFID-считыватель MFRC522, который всегда сканирует и в любой момент обнаруживает карту и проверяет ее, сервоприводы, на какой бы скорости они сейчас ни находились, начинают замедляться. Проблема в том, что я не могу заставить две функции работать одновременно. ЕСЛИ сервопривод выполняет функцию развертки, она должна завершиться, прежде чем RFID-метка сможет сканировать. Из-за этого все устройство выглядит очень медленным. Есть ли способ заставить RFID-сканер постоянно считывать показания, даже когда работает цикл сервопривода?

Вот код: Обратите внимание, что я разместил распечатки повсюду, чтобы увидеть, как часто сканируется RFID и т. д., пока я тестирую код. По сути, у меня есть две функции: одна называется nocardservo и yescardservo, каждая из которых активируется, есть ли там карта или нет. Любая помощь будет фантастической!!!

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define RST_PIN     9       //
#define SS_PIN      10      //

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Создаем экземпляр MFRC522

Servo myservo;
int pos = 0;
int y = 15;
int z = y;
void setup() {
  myservo.attach(6);
  myservo.writeMicroseconds(1518);
  Serial.begin(9600);       // Инициализируем последовательную связь с ПК
  while (!Serial);      // Ничего не делать, если последовательный порт не открыт (добавлено для Arduino на базе ATMEGA32U4)
  SPI.begin();          // Инициализация шины SPI
  mfrc522.PCD_Init();       // Инициализируем MFRC522
  //ПоказатьПодробностиЧитания(); // Показать подробную информацию о PCD - сведения о устройстве чтения карт MFRC522
  //Serial.println(F("Сканировать PICC, чтобы увидеть UID, тип и блоки данных..."));
}

void loop() {
  // Ищем новые карты
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
nocardservo();
    return;
  }
  delay(20);
  Serial.println("carddetected");
  // Выбираем одну из карт
  if ( ! mfrc522.PICC_ReadCardSerial()) {

  }
  Serial.println("correctcard");
  yescardservo();
delay(20);
return;
}


//***Если карта не обнаружена, эта функция запускается**//


void nocardservo() {

  for (pos = 90; pos < 180; pos += 1) // изменяется от 0 градусов до 180 градусов
  { // с шагом в 1 градус
    myservo.write(pos);              // сообщаем сервоприводу перейти на позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод достигнет позиции
  }
  for (pos = 180; pos >= 90; pos -= 1) // изменяется от 180 градусов до 0 градусов
  {
    myservo.write(pos);              // сообщаем сервоприводу перейти на позицию в переменной 'pos'
    delay(15);

  }
}
}


//***Если карта обнаружена, эта функция запускается**//

void yescardservo() {

  for (pos = 90; pos < 180; pos += 1) // изменяется от 0 градусов до 180 градусов
  { // с шагом в 1 градус
    myservo.write(pos);              // сообщаем сервоприводу перейти на позицию в переменной 'pos'
    delay(50);                       // ждем 15 мс, пока сервопривод достигнет позиции
  }
  for (pos = 180; pos >= 90; pos -= 1) // изменяется от 180 градусов до 0 градусов
  {
    myservo.write(pos);              // сообщаем сервоприводу перейти на позицию в переменной 'pos'
    delay(50);

  }

}

, 👍0

Обсуждение

«Секрет» заключается в использовании функции millis(), которая позволяет вам сделать снимок текущего времени и сравнить его с более поздним временем. Вот как JamesG ссылается на «Мигание без задержки» и достигает своего результата. Обратите внимание, что любые копии значения millis() должны храниться в «беззнаковой длинной» переменной и использовать, например, «long», как в предыдущей функции Millis(), сохраняя в пример «Мигание без задержки» в некоторых случаях приведет к ошибкам., @Russell McMahon


2 ответа


Лучший ответ:

4

То, что вы хотите реализовать, описано в разделе Мигание без задержки. По сути, вместо того, чтобы использовать функцию задержки, чтобы просто ждать, пока истечет ваше время, вы используете переменные для измерения того, сколько времени прошло, и выполняете операцию только тогда, когда она истечет. А пока вы можете проверить другие дела и заняться ими.

,

Хорошая ссылка. Только комментарий: обратите внимание, что любые копии значения millis() должны храниться в переменной «unsigned long», а использование, например, «long», как в предыдущем сохранении Millis() в примере «Мигание без задержки», приведет к ошибкам в некоторые случаи., @Russell McMahon


0

Посмотрите мой пример программы ниже.

/* 
 * Author BALASAIDULU.N 
 * function -1 : Fading led with pwm pin 9
 * fucntion -2 : Blinking LED on pin 13
 * connect an LED on pin 9 with a 330 ohms resistor   
 */
     int leda=9;
     int ledd=13;
int i,g,s1,s2;
int switchPin=8;

void setup() {
pinMode(ledd,OUTPUT);
pinMode(switchPin,INPUT);
}

void fading()
{
  st:
  if(s1==0){
if(s1==1){goto hy;}
analogWrite(leda,i);
delay(30);
i+=5;
if(i>255){s1=1;}
goto st1;
  }
hy:

if(i<0){s1=0;goto st;}
i-=5;
analogWrite(leda,i);
delay(30);
 st1:
delay(10);
}


void blinking()
{ 
digitalWrite(ledd,HIGH);
delay(30);
digitalWrite(ledd,LOW);
delay(30);

}
void loop() {

int g;
g=digitalRead(switchPin);
if(g==1) {delay(50);}
if(g==0){
blinking();
fading();}
}
,

Что не так с использованием goto: https://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto, @VE7JRO