2013-11-14 11 views
5

Sto cercando di capire come valutare se un valore aumenta o diminuisce. In questo caso sto usando un potenziometro mappato da 0 a 14. Fondamentalmente ho bisogno che guardi il valore corrente, e se il valore corrente sta aumentando, stampa una cosa, e se il valore sta diminuendo stampa qualcos'altro.Valutare se un valore aumenta o diminuisce (arduino)

Ecco quello che ho finora, so che non è giusto, ma è un inizio.

Pensieri?

Grazie.

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


void loop() { 

    int val = analogRead(A0); // read the input on analog pin 0: 
    val = map(val, 0, 1023, 0, 14); // map the vlaues to new values 
    Serial.println(val); // print those values 
    delay(1); // delay by a second. 

    // sudo code 

    if (val++) { 

    Serial.println("up"); 

    } else if (val--){ 

    Serial.print("down"); 

    }else{ 

    // do nothing 
    } 
}// end loop 

risposta

3

Dichiarazione di variabili

int val = analogRead(A0); // read the input on analog pin 0: 

Io non vi consiglio di dichiarare le variabili nella funzione loop() quando è possibile dichiararle all'esterno una volta:

// declaration here! 
int val = 0; 

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

void loop() { 

    // just set the value 
    val = analogRead(A0); // read the input on analog pin 0: 
    val = map(val, 0, 1023, 0, 14); // map the vlaues to new values 

     ... 

controlli di aumento/diminuzione

In C++ è possibile effettuare un incarico anche in un'istruzione condizionale. if (val++) e if (val--) non faranno quello che ti aspetti. La dichiarazione if verifica se val non è falso o 0, quindi ++ lo aumenta di 1. Lo stesso per val-- ma diminuisce di -1.

Che cosa si può fare è quello di mantenere il valore precedente in un'altra variabile (diciamo prev) per confrontare in un secondo momento come questo:

// declaration here! 
int val = 0; 
int prev; 

    ... 

void loop() { 

    // keep the previous value 
    prev = val; 

    // just set the value 
    val = analogRead(A0); // read the input on analog pin 0: 

    ... 

    // compare the previous value 
    if (val > prev) { 
     Serial.println("up"); 
    } else if (val < prev) { 
     Serial.println("down"); 
    } 

    // and no need to leave empty an `else` block 

} 
+1

Dichiarare le variabili al di fuori del ciclo dichiara variabili globali . Questo è comunemente considerato una cattiva pratica. Dichiararli all'interno del circuito non ha alcuna penalità di velocità. GCC è abbastanza intelligente da capire come compilarlo al meglio. –

0

si deve confrontare il valore corrente con il vecchio valore per determinare se è in aumento o in diminuzione

void setup() { 
    Serial.begin(9600); 
    int oldvalue = 0; 

} 


void loop() { 

    int val = analogRead(A0); // read the input on analog pin 0: 
    if(val > oldvalue) 
    { 
    // increasing 
    } 
    else if (val < oldvalue) 
    { 
    // decreasing 
    } 

    // get current value into oldvalue for next comparison 
    oldvalue = val; 

    // other code follows here... 
} 
0
if (val++) { 

mezzi confrontare il valore di val-0, e se non è 0 esegue il blocco if. Aumentare anche val (indipendentemente dal fatto che fosse 0 per iniziare).

Sembra che tu stia pensando che tale affermazione controlla se val è cambiato, ma non è così.

Se si vuole farlo, (come altre risposte suggeriscono) è necessario un altro variabile per memorizzare il valore precedente di val, e poi confrontare i due:

if (val > oldval) 
{ 
    Serial.println("Up\n"); 
} 
Problemi correlati