簡體   English   中英

您可以使用Arduino Uno(C代碼)同時運行一個函數多次嗎?

[英]Can you run a function multiple times at the same time with Arduino Uno (c code)?

我有八個LED,四個紅色和四個黃色。 兩行都有一個按鈕。 按下按鈕時,一行LED會發出脈沖。 這意味着它們以0.1秒的間隔連續點亮。 我的問題現在是:我是否可以在處理另一個脈沖時發送脈沖? 目前,調用了一個函數,其中一個for循環將LED的狀態設置為HIGH和Low,但是在完成之前,我無法再次運行它。

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);
  Serial.begin(9600);
}
boolean wait(unsigned int j, unsigned int time) <-- test if 0.1 seconds have passed
{ 
  if (millis()>=time+j){
    return true;
  }
  else return false;
}
void pulse(int start)
{
    for(int j = start;j < start + 4;j++)
    {
      digitalWrite(j, HIGH);
      unsigned int time = millis();
     while(wait(100, time)==false){};
     digitalWrite(j, LOW);
    }
}
void loop()
{
  if (digitalRead(12) == HIGH)
  {
    Serial.println("yellow");
    pulse(2);                   <-- I have to wait for this function
  }
  if (digitalRead(11) == HIGH)
  {
    Serial.println("red");
    pulse(6);                   <-- I have to wait for this function
  }
}

您需要使用事件循環。 問題是您陷入了wait()和pulse()循環中,而沒有檢查將狀態重置為“脈沖x秒”的條件。

這涉及將您想做的每件事分解成較小的塊,以便可以將它們交錯在一起。 它要求您記住您在特定子流程中的位置,以便稍后返回。 在某種程度上,您需要通過使用狀態來說明應在特定函數中的何處開始運行來仿真協同例程。

此外,谷歌“反跳”。 如果不對按鈕按下進行反跳操作,將會看到很多奇怪的行為。 實際上,我建議您擱置該項目,直到您可以可靠地反跳按鈕按下時顯示為一次按下為止(因為這是一個更基本的問題)。

不要輕易放棄。 這絕對是可能的。 這項挑戰既誘人又有趣。 我希望我有時間為您編寫一些代碼,但明天我將進行一次非常重要的重要旅行,所以我沒有機會。

至少嘗試我的想法。 循環是殺死概念的原因,當您已經在使用可用的最佳計數工具時,依賴於停止並計數代碼:millis()

創建一個循環,使其循環通過您的LED,並使它們處於默認關閉狀態,除非基於以下情況觸發計時:millis()+“按下開關后的時間”

每個led的開關偏移量都超過redButtonPush或yellowButtonPush(當按下相應按鈕時,這些整數存儲millis())

例如,pin4(或黃色LED數字3)從yellowButtonPush + 200變為yellowButtonPush + 299

每次按下按鈕的循環檢查都將以某種方式循環,然后遍歷每個LED,以查看是否應基於其偏移量將其打開,關閉,保持打開或關閉

編碼愉快!

感謝大家。 這是我的最終代碼。

unsigned long redButtonPress = 0;
unsigned long yellowButtonPress = 0;

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);
}

void loop()
{
  if (digitalRead(12) == HIGH && yellowButtonPress+399 < millis())
  {
    yellowButtonPress = millis();
  }
  if (digitalRead(11) == HIGH && redButtonPress+399 < millis())
  {
    redButtonPress = millis();
  }


  if (millis() <= yellowButtonPress+99 && millis() >= yellowButtonPress+2)
  {
    digitalWrite(2, HIGH);
  }else{digitalWrite (2, LOW);}

  if (millis() <= redButtonPress+99 && millis() >= redButtonPress+2)
  {
    digitalWrite(6, HIGH);
  }else{digitalWrite (6, LOW);}

  if (millis() >= yellowButtonPress+100 && millis() <= yellowButtonPress+199)
  {
    digitalWrite(3, HIGH);
  }else{digitalWrite (3, LOW);}

  if (millis() >= redButtonPress+100 && millis() <= redButtonPress+199)
  {
    digitalWrite(7, HIGH);
  }else{digitalWrite (7, LOW);}

  if (millis() >= yellowButtonPress+200 && millis() <= yellowButtonPress+299)
  {
    digitalWrite(4, HIGH);
  }else{digitalWrite (4, LOW);}

    if (millis() >= redButtonPress+200 && millis() <= redButtonPress+299)
  {
    digitalWrite(8, HIGH);
  }else{digitalWrite (8, LOW);}

  if (millis() >= yellowButtonPress+300 && millis() <= yellowButtonPress+399)
  {
    digitalWrite(5, HIGH);
  }else{digitalWrite (5, LOW);}

  if (millis() >= redButtonPress+300 && millis() <= redButtonPress+399)
  {
    digitalWrite(9, HIGH);
  }else{digitalWrite (9, LOW);}
}

這就是我為該項目編寫代碼的方式。

unsigned long yellowButtonPress = 0;
unsigned long yellowTimeElapsed = 0;
int yellowLED = 2

unsigned long redButtonPress = 0;
unsigned long redTimeElapsed = 0;
int redLED = 6

unsigned long MAX_Time = 400;

void setup(){
  //Setup the INPUT and OUTPUT pins
  for (int x=2; x<10; x++){
    pinMode(x, OUTPUT);
  }
    pinMode(12, INPUT);  //Yellow Button
    pinMode(13, INPUT);  //Red Button
}

void loop{
  yellowTimeElapsed = millis() - yellowButtonPress;
  redTimeElapsed = millis() - redButtonPress;

  //Check if yellow button has been pressed
  if(digitalRead(12) == HIGH && yellowTimeElapsed > MAX_Time){
    yellowButtonPress = millis();
  }

  //Check if red button has been pressed
  if(digitalRead(13) == HIGH && redTimeElapsed > MAX_Time){
    redButtonPress = millis();
  }

  //Identify which yellow LED needs to be on at this time
  if (yellowTimeElapsed > Max_Time){
    yellowLED=0; //This will turn off all yellow LEDs
  } else {
    yellowLED = map(yellowTimeElapsed, 0, MAX_Time, 2,5);
  }

  //Identify which red LED needs to be on at this time
  if (redTimeElapsed > Max_Time){
    redLED=0;  //This will turn off all red LEDs
  } else {
    redLED = map(redTimeElapsed, 0, MAX_Time, 6,9);
  }

  //Turn the yellow and/or red LEDs on and off
  for (int i = 2; i<10; i++){
    if (i == yellowLED || i == redLED){
      digitalWrite(i,HIGH);
    } else {
      digitalWrite(i,LOW);
    }
  }
}

我不想說“不,你不能”,所以我只想說微處理器一次只能處理一個計算。

您要么需要多個微處理器,要么可以使用arduino nanos

-或者您需要比我或任何其他人更深入地了解一些非常深的電子產品,以計算從處理器告訴輸出到實際輸出之間需要多長時間,然后您必須做一些真正出色的雜技,可以將這些知識納入您的代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM