Lettura di un selettore rotativo a 16 posizioni

Un caro saluto a tutti voi.
Ho acquistato da poco Arduino 1 e sto man mano provando tutti i progetti.
Me ne sono inventato uno.
Ho un selettore rotativo codificato a 16 posizioni (PT65103L508), l'ho collegato sui pin digitali 2 3 4 e 5 di Arduino.
Seguendo altre discussioni del forum, sono arrivato a compilare il seguente codice:

const int P1 = 2; // ingressi selettore rotativo
const int P2 = 3; // ingressi selettore rotativo
const int P4 = 4; // ingressi selettore rotativo
const int P8 = 5; // ingressi selettore rotativo
int numero, R1,R2,R4,R8;

void setup() {
 Serial.begin (9600);
  pinMode (P1, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P2, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P4, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P8, INPUT_PULLUP); // ingressi selettore rotativo
  digitalWrite (P1, HIGH);
  digitalWrite (P2, HIGH);
  digitalWrite (P4, HIGH);
  digitalWrite (P8, HIGH);
}

void loop() {
 int R1 = digitalRead (2);
 int R2 = digitalRead (3);
 int R4 = digitalRead (4);
 int R8 = digitalRead (5);
    int numero = 0;
    if (R1 == LOW) {int numero = (numero+1);}
    if (R2 == LOW) {int numero = (numero+2);}
    if (R4 == LOW) {int numero = (numero+4);}
    if (R8 == LOW) {int numero = (numero+8);}
 Serial.print ("Il numero selezionato è:");
 Serial.println (numero);

delay (1000);

}

Ma non mi funziona. Resta fisso sul numero 0.
Cosa sbaglio?

Hai collegato a massa il terminale comune del commutatore?

Si.
Ho controllato le tensioni, ho controllato uno per uno tutte le commutazioni, ho ricontrollato i collegamenti e che il tutto combaciasse col software.
Niente non mi va.
Ho solo un dubbio sul fatto che le tensioni di uscita siano tutte a 4,83 volt, ma non credo sia un problema, perché in commutazione vanno a 0.
Credo che sia una questione di software.

Devi dichiarare la variabile “numero” una volta sola.

    int numero = 0;
    if (R1 == LOW) {numero = (numero+1);}
    if (R2 == LOW) {numero = (numero+2);}
    if (R4 == LOW) {numero = (numero+4);}
    if (R8 == LOW) {numero = (numero+8);}

Sì, sulimarco, ci sarebbe molto da dire:

  • Dichiara le variabili P, ma poi non le usa nei digitalRead
  • La dichiarazione di più variabili separate da virgola non è bella
  • I primi 4 digitalWrite sono inutili
  • Le variabili R e numero possono essere byte, che occupano metà spazio in RAM
  • numero è una variabile globale dichiarata all'inizio, perciò non deve essere dichiarata nuovamente
  • Le parentesi in (numero+1) ecc. non servono
  • il delay (1000) in fondo è accettabile finché al programma non venga aggiunta qualche cosa che necessiti di una esecuzione rapida e continua.

È strano, però, che legga zero...

Farò le correzioni e vi farò sapere.

Datman:
È strano, però, che legga zero...

Ma come "strano"??? Non glielo hai detto tu stesso?
Quando fa:

   if (R1 == LOW) {int numero = (numero+1);}
   if (R2 == LOW) {int numero = (numero+2);}
   if (R4 == LOW) {int numero = (numero+4);}
   if (R8 == LOW) {int numero = (numero+8);}

all'interno di ogni "if" viene creata una nuova variabile locale chiamata "numero", gli assegna un valore e poi quella variabile "muore" appena esce dall'if! Quindi visualizza il valore della variabile globale "numero" che sarà sempre zero!
Deve fare così:

const int P1 = 2; // ingressi selettore rotativo
const int P2 = 3; // ingressi selettore rotativo
const int P4 = 4; // ingressi selettore rotativo
const int P8 = 5; // ingressi selettore rotativo
int numero, R1,R2,R4,R8;

void setup() {
 Serial.begin (9600);
  pinMode (P1, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P2, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P4, INPUT_PULLUP); // ingressi selettore rotativo
  pinMode (P8, INPUT_PULLUP); // ingressi selettore rotativo
}

void loop() {
  R1 = digitalRead (P1);
  R2 = digitalRead (P2);
  R4 = digitalRead (P4);
  R8 = digitalRead (P8);
  numero = 0;
  if (R1 == LOW) numero += 1;
  if (R2 == LOW) numero += 2;
  if (R4 == LOW) numero += 4;
  if (R8 == LOW) numero += 8;
  Serial.print ("Il numero selezionato è:");
  Serial.println (numero);
  delay (1000);
}

Uh, certo! Resta chiusa nell'if! Il problema non è solo che non fa la somma delle quattro!

Rieccoci.
Buongiorno.
Si effettivamente ho fatto un mega casino. A volte ci si concentra su una cosa e te ne scappano altre 100.
Non capivo perché @Datman diceva che i digitalwrite erano inutili. Poi ho cercato in giro ed ho scoperto il perché.
Ho apportato le varie correzioni ed ora funziona.
Grazie!!!