2014-01-14 3 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

Только один вопрос для своих собственных целей обучения: пересаживать (структура Пот * банк) ... это просто переименование «Пот» на «горшок»? Я привык к умножению, поэтому задаюсь вопросом, что это означает в этом утверждении и почему его сделано. –

+0

В этом случае * указывает указатель. Таким образом, функция принимает указатель на структуру Pot, и этот указатель называется «pot». Использование «struct» в определении функции - это немного странный угол C, и один из способов отличается от C++. Вы можете в принципе игнорировать «struct» и просто читать его как «rePot (Pot * pot)», который переводится как «функция, называемая rePot, которая берет указатель на банк с именем Pot. Возможно, было бы проще назвать это что-то вроде rePot (Pot * theInputPot) – admsyn

+0

Дополнительный вопрос: у меня есть небольшая функция blinkLED в другом месте программы, я использую его только для кнопок в основном. Он просто делает onlength/offlength, где offlength является задержкой. Я пытался использовать его w/this. Но задержка, если ее выше 50 приведет к тому, что банк перепутал показания. Почему это происходит? Я предполагаю, что это связано с тем, что замедление замедляет скорость чтения банкнот, когда он проходит через точку? –

Смежные вопросы