2015-10-19 84 views
0

我想創建一個數組,並能夠比較數組中的第二個和最後一個項目。它需要不斷添加和比較才能正常工作。這只是我試圖幫助控制步進電機功能的功能。我有一個快速循環,可以直接進行比較。我知道它的一些是錯誤的,但由於我沒有用C語言編碼,所以我不知道如何正確使用數組。先謝謝你。陣列在Arduino

int P[10],V[10],i,x,y; 

Serial.print("checkvalue = "); 
Serial.print(checkvalue);Serial.print("\n"); 
Serial.print("P = "); Serial.print(P[i]); Serial.print("\n"); //attempting to print array 
Serial.print("V = "); Serial.print(V[i]); Serial.print("\n"); //to see if it is collecting 
                   //data correctly 
//these variables are declared above in my code, just didn't copy in 
Dgreadpb = digitalRead(13); 
PBcheck = Dgreadpb; 
//Serial.print("Button in = ");Serial.print(Dgreadpb); Serial.print("\n"); 
Dgreadvls = digitalRead(12); 
VLScheck = Dgreadvls; 
//Serial.print("Photo in = ");Serial.print(Dgreadvls); Serial.print("\n"); 


for (i = 0; i < 10; i++){ 
x = Dgreadpb; 
y = Dgreadvls; 
P[i] = x; 
V[i] = y; 

if (P[i-1] == P[i] && V[i-1] == V[i]){  //trying to compare second to 
    checkvalue == 0;       //last term to the last term 
    return; 
} 
    else if(P[i-1] != P[i] || V[i-1] != V[i]){ 
    checkvalue == 1; 
    return; 
    } 
} 
delay (1000); 
+0

等等,我無法理解你想要得到什麼以及你實際得到了什麼。順便說一句,循環應該從1開始,而不是從0開始(因爲你不能比較項目0與 - 不存在 - 前一個) – frarugi87

+1

當'i = 0','P [i-1]'和'V [i-1]'超出範圍,你不能訪問那裏。 – MikeCAT

+0

我正在嘗試創建一個數組,以便我可以檢查當前循環中的傳感器值是否與先前循環中的傳感器值不同。這樣我的電機只有在傳感器值發生變化時纔會運行,並且不會每循環運行一次。除非有更好的方法來做到這一點,我不知道。 @ frarugi87 – bcv29

回答

0

通過「試圖第二比較上學期的最後期限」,你的意思是「試圖第二比較上學期與他們以前的」?如果是這種情況,您的索引是錯誤的,那應該是for(i = 1; i<10; i++)

這兩種情況都相反(兩者都相等或至少有一個不同),所以不需要else if。更重要的是,導致兩種情況都相反,它永遠不會完成循環。我認爲這是不打算,如果你想說,只有其中一人是不同的,你應該做的:

if (P[i-1] == P[i] && V[i-1] == V[i]){ //If both are equal  
    checkvalue == 0;       
    return; 
} 
else if(P[i-1] == P[i] || V[i-1] == V[i]){ //If only one is equal 
    checkvalue == 1; 
    return; 
} 
+0

我想創建一個數組,以便我可以檢查當前循環中的傳感器值是否與先前循環中的傳感器值不同。這樣我的電機只有在傳感器值發生變化時纔會運行,並且不會每循環運行一次。除非有更好的方法來做到這一點,我不知道。 – bcv29

0

好吧,那麼我會做出不同的事情。看看你的評論,它看起來像你想做這樣的事情:讀取兩個引腳的值,將它們與您讀取的最後一個值進行比較,如果它們不同,則啓動電機,否則停止。

現在,很多信息都丟失了(例如,您如何檢查電機?您想檢查傳感器的頻率是多少?),但恕我直言,您應該這樣做。

在這段代碼我想這

  1. 要檢查每100毫秒
  2. 如果值不同,要打開電機上的下一個100毫秒的傳感器
  3. 電機是通過設置相應引腳(例如10)而打開的直流電機,因爲您在代碼中寫入代碼
因爲傳感器在引腳12和13上有二進制輸出

順便說一句我用millis()函數,因爲我討厭delay,因爲它阻止了uC。使用我的功能,您可以在空閒時執行其他操作。

const byte motorPin = 10; 
const byte sensorPPin = 12; 
const byte sensorVPin = 13; 

#define LOOP_TIME_MS 100 

unsigned long lastLoopTime; 
boolean lastPval, lastVval; 

void setup() 
{ 
    pinMode(motorPin, OUTPUT); 
    pinMode(sensorPPin, INPUT); 
    pinMode(sensorVPin, INPUT); 

    lastPval = digitalRead(sensorPPin); 
    lastVval = digitalRead(sensorVPin); 

    lastLoopTime = millis(); 
} 

void loop() 
{ 
    if ((millis() - lastLoopTime >= LOOP_TIME_MS) 
    { 
     boolean Pval = digitalRead(sensorPPin); 
     boolean Vval = digitalRead(sensorVPin); 

     if ((Pval != lastPval) || (Vval != lastVval)) 
     { 
      digitalWrite(motorPin, HIGH); 
     } 
     else 
     { 
      digitalWrite(motorPin, LOW); 
     } 

     lastLoopTime += LOOP_TIME_MS; 
    } 

    /* Here you can do something else */ 
} 

編輯:如果,在另一邊,要使用數組(因爲你要測試的最後N值,而不是隻是前一個),請提供關於什麼是變化的條件進一步信息(或更好的提供例子)