<Risolto> spiegazione di istruzioni

Ciao a tutti.
Volendo scrivere un programma di lettura di un encoder incrementale ho trovato in rete questo programma

// Wiring connections for my encoder:
// Red : VCC = 5V
// Black: 0V = GND
// White: OUTA = Digital pin 2
// Green: OUTB = Digital pin 3
// With these OUTA/OUTB connections and the interrupt code below,
// clockwise rotation gives positive encoder counts.

const int outA = 2;
const int outB = 3;
volatile long encoder = 0; // declare volatile since modified by interrupt routines
long encoder_save = 0;
byte contatore = 0;
int oldcontatore = 0;

void setup() {
  // set encoder pins
  pinMode(outA, INPUT_PULLUP);
  pinMode(outB, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  // attach interrupts to pins
  // call digitalPinToInterrupt(pin) to be compatible with different Arduino boards
  attachInterrupt(digitalPinToInterrupt(outA), outAChange, CHANGE);
  attachInterrupt(digitalPinToInterrupt(outB), outBChange, CHANGE);

  // initialize serial
  Serial.begin(9600);
  Serial.println("");
  Serial.println("Rotary encoder test.");
}

void loop() {
  if (encoder_save != encoder) { // only print if new value
    encoder_save = encoder;
    contatore = (encoder/10);
     if((contatore) ==255){
    contatore =254;
  }
  if((contatore) == 0){
    contatore = 1;
    }
    Serial.print(" asse X   ");
    Serial.println(contatore);
    analogWrite(10, contatore);
  }
  //delay(100);
}

// interrupt routines
void outAChange() {
  // when outA changes, outA==outB means negative direction
  encoder += digitalRead(outA) == digitalRead(outB) ? -1 : 1;
}

void outBChange() {
  // when outB changes, outA==outB means positive direction
  encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
}

io in parte l' ho modificata per comandare in pwm un led e vedere la variazione di luminosita , il programma funziona ma io non sono riuscito a capire certe istruzioni ? 1 : -1 messe in questa riga:

void outBChange() {
  // when outB changes, outA==outB means positive direction
  encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
}

rslogix52

E' un "operatore ternario" applicato ad un operatore di somma ed assegnazione ...

Cominciamo con la parte dell'operatore ternario ...

digitalRead(outA) == digitalRead(outB) ? 1 : -1;

... si chiede "se la lettura da outA è uguale a quella da outB", se è uguale ritorna 1 altrimenti -1

A questo punto l'assegnazione con somma

encoder +=

somma al valore di encoder quanto ritornato dall'operatore ternario.

Se esso ha ritornato 1 allora sarà:

encoder += 1;

... se invece ha ritornato -1 allora sarà:

encoder += -1;

Tutto chiaro ?

Guglielmo

quindi l'operatore ? è una interrogazione che in base alla risposta che può essere 1 o -1 si incrementa la variabile encoder. Grazie
rslogix52

rslogix52:
quindi l'operatore ? è una interrogazione ...

Si chiama operatore ternario e lo trovi tranquillamente su google ... :wink:

(condizione) ? valore se vero : valore se falso;

Guglielmo

Grazie della spiegazione.
rslogix52