2014-01-14 51 views
1

所以我正在爲一些罐頭針寫這個小函數。鍋只在轉動時發送一個值,在休息時它不發送任何東西。這是我希望它的功能。如何寫入多個模擬引腳的功能? (arduino)

它與一個引腳工作正常。

我已經得到它的一半,它與多個引腳工作的一點。所以如果我在兩個引腳的循環中調用它兩次,我會在這兩個引腳上找回正確的值。但是我放棄了if語句的功能。基本上我無法弄清楚這個的後半部分。陣列已被建議我只是不確定如何進行。

對此提出建議?謝謝。

byte pots[2] = {A0, A2}; 


int lastPotVal = 0; 


void setup(){ 
    Serial.begin(9600); 

} 


void loop(){ 

    // get the pin out of the array 
    rePot(pots[0]); 
    rePot(pots[1]); 
    delay(10); 

} 

void rePot(const int potPin){ 


    // there is probably an issue around here somewhere... 


    int potThresh = 2; 
    int potFinal = 0; 
    int potVal = 0; 

    // set and map potVal 

    potVal = (analogRead(potPin));   
    potVal = map(potVal, 0, 664, 0, 200); 

    if(abs(potVal - lastPotVal) >= potThresh){ 

     potFinal = (potVal/2);  
     Serial.println(potFinal); 

     lastPotVal = potVal; 



    } // end of if statement 

} // end of rePot 

回答

1

這將使用struct來決定如何管理一個鍋和與之相關的數據(它是在腳,最後一個讀數,閾值,等等)。然後,rePot()函數被更改爲將這些結構中的一個作爲輸入,而不僅僅是引腳編號。

struct Pot { 
    byte pin; 
    int threshold; 
    int lastReading; 
    int currentReading; 
}; 

// defining an array of 2 Pots, one with pin A0 and threshold 2, the 
// other with pin A2 and threshold 3. Everything else is automatically 
// initialized to 0 (i.e. lastReading, currentReading). The order that 
// the fields are entered determines which variable they initialize, so 
// {A1, 4, 5} would be pin = A1, threshold = 4 and lastReading = 5 
struct Pot pots[] = { {A0, 2}, {A2, 3} }; 

void rePot(struct Pot * pot) { 
    int reading = map(analogRead(pot->pin), 0, 664, 0, 200); 

    if(abs(reading - pot->lastReading) >= pot->threshold) { 
     pot->currentReading = (reading/2); 
     Serial.println(pot->currentReading); 
     pot->lastReading = reading; 
    } 
} 

void setup(){ 
    Serial.begin(9600); 
} 

void loop() { 
    rePot(&pots[0]); 
    rePot(&pots[1]); 
    delay(10); 
} 

一個稍微不同的看法上,這是改變rePot()成採取整個數組作爲輸入,然後只更新了整個事情的功能。就像這樣:

void readAllThePots(struct Pot * pot, int potCount) { 
    for(int i = 0; i < potCount; i++) { 
     int reading = map(analogRead(pot[i].pin), 0, 664, 0, 200); 

     if(abs(reading - pot[i].lastReading) >= pot[i].threshold) { 
      pot[i].currentReading = (reading/2); 
      Serial.println(pot[i].currentReading); 
      pot[i].lastReading = reading; 
     } 
    } 
} 

void loop() { 
    readAllThePots(pots, 2); 
    delay(10); 
} 
+0

只有一個問題我自己學習的目的: rePot(結構*鍋鍋)......這只是重新命名「鍋」到「鍋」?我習慣於*倍增,所以想知道這個陳述中的含義以及爲什麼它完成了。 –

+0

在這種情況下,*指定一個指針。所以,該函數需要一個指向Pot結構的指針,並且該指針被命名爲「pot」。在函數定義中使用「struct」是C中一個奇怪的角落,它與C++不同。你基本上可以忽略「結構」,只是把它看作是「rePot(Pot * pot)」,它轉換爲「一個叫做rePot的函數,它將一個指向一個Pot的指針稱爲pot,它可能更清楚地稱之爲有點像rePot(Pot * theInputPot) – admsyn

+0

附加問題:我在程序的其他地方有一個blinkLED函數,我主要用它作爲按鈕,它只是在onlength/offlength的地方,offlength是一個延遲,我試圖使用它但是如果延遲超過50就會導致底池讀數錯亂,爲什麼會出現這種情況呢?我在猜測它是因爲延遲會降低底池讀數的速度,因爲它會循環通過? –