簡體   English   中英

Arduino-執行循環時讀取串行數據

[英]Arduino - Reading Serial Data while performing for loop

前幾天我剛得到了arduino。 我目前正在用Java編寫一個程序,以使用串行通信控制arduino。 到目前為止,我只打開或關閉該程序。 但是我遇到了一個問題。 我的arduino淡入兩個rgb led,在每種顏色之間循環。 我在這里碰到我的問題。 當我按下按鈕將其關閉時(java程序),它直到所有顏色都運行時才關閉(完成for循環)。 我希望它立即關閉。 有什么方法可以讀取for循環中的串行數據,或者有什么可能的方式可以立即關閉串行數據,而不必等待for循環完成? 這是代碼:

const int redPins[] = {11,6};
const int greenPins[] = {10,5};
const int bluePins[] = {9, 3};

const int pinCountPerColor = 2;

const int sensorPin = 0;
int lightLevel;
int val = 0;
boolean isOn;

void setup() {
  Serial.begin(9600);
  setColourRgb(0,0,0);
  isOn = true;
}

void loop() {
  if(isOn) {
    unsigned int rgbColour[3];

    lightLevel = analogRead(sensorPin);

    if(lightLevel >= 400) { 
      rgbColour[0] = 255;
      rgbColour[1] = 0;
      rgbColour[2] = 0;  

      for (int decColour = 0; decColour < 3; decColour += 1) {
        int incColour = decColour == 2 ? 0 : decColour + 1;

        for(int i = 0; i < 255; i += 1) {
          lightLevel = analogRead(sensorPin);
          if(lightLevel <= 400) { 
            setColourRgb(255, 255, 255);
          } else {
            rgbColour[decColour] -= 1;
            rgbColour[incColour] += 1;

            setColourRgb(rgbColour[0], rgbColour[1], rgbColour[2]);
            delay(5);
          }
        }
      } 
    } else {
      setColourRgb(255, 255, 255);
    }
  }
}

void setColourRgb(unsigned int red, unsigned int green, unsigned int blue) {
  for(int r = 0; r < pinCountPerColor; r++) {
    analogWrite(redPins[r], red);
  }
  for(int g = 0; g < pinCountPerColor; g++) {
    analogWrite(greenPins[g], green);
  }
  for(int b = 0; b < pinCountPerColor; b++) {
    analogWrite(bluePins[b], blue);
  }
}

void serialEvent() 
{
  while (Serial.available())
  {
    val = Serial.parseInt();
    if(val == 1)   
    {
      isOn = true;
      //do nothing
    }
    else if(val == 0) 
    {
      setColourRgb(255, 255, 255);
      isOn = false;
    }
  }

  Serial.println("Succesfully received.");
}

最好為顏色創建一個狀態機,該狀態機不留任何循環阻塞,特別是對於有延遲的循環。 這樣循環中的每個循環都會更改顏色並輪詢序列號。

這是編寫實時代碼或簡單地非阻塞代碼的藝術。

請注意,可以創建一個定時器中斷來更好地調度RGB更新。 請參閱有關定時器中斷的答案以編寫精度更新。

@mpflaga正確回答了您的問題。

我要補充的是,如果您的項目變得不僅僅是兩個led衰落所致,您可能希望使用比手工制造的狀態機更可靠的產品。

這稱為實時操作系統(RTOS),它允許您以不同的頻率運行不同的線程。

我個人將ChibiOS / RT用於我的機器人項目 有一個用於Arduino的端口,您可以在此處下載,該端口已被很好地記錄下來 ,一旦您掌握了基礎知識,我會說它非常易於使用。 不錯的事情是添加一個更高層次的層來管理線程。

這是描述它和其他解決方案的頁面: Arduino rtoslibs

以下是一些實時和Arduino ChibiOS教程:

希望能幫助到你! :)

暫無
暫無

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

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