trasformare un carattre in un int

In questo esercizio premo un bottone un massimo di 7 volte. Il numero di volte che ho premuto il bottone devo trasformarlo in binario e a seconda del binario si accendono le lampadine, tipo
101
accesa spenta accesa.
ho fatto il codice dove il contatore aumenta a seconda di quante volte premo il bottone e quello funziona, poi questo funziona:

int i=0;
while (i < 3 && b[1] == true) {
    binario = contatore % 2 + binario;
    Serial.println(binario);
    i++;
    contatore /= 2;
  }

il binario lo stampa giusto, ma così non funziona:

  int i = 0;
  while (i < 3 && b[1] == true) {
    binario = contatore % 2 + binario;
    Serial.println((int)binario.charAt(i));
    i++;
    contatore /= 2;
  }

qui Serial.println((int)binario.charAt(i)); sembra che non aggiorni la i dentro, tipo segna tutti 48 o tutti 49.

però se faccio così:

  int i = 0;
  while (i < 3 && b[1] == true) {
    binario = contatore % 2 + binario;
    i++;
    contatore /= 2;
  }
  Serial.println((int)binario.charAt(0));
  Serial.println((int)binario.charAt(1));
  Serial.println((int)binario.charAt(2));

li stampa giusti, quindi sembra non aggiornare la i dentro.

Se dopo il while faccio così

  if((int)binario.charAt(0)==48){
    digitalWrite(lampadina[0],HIGH);
  }else{
     digitalWrite(lampadina[0],LOW);
  }
   if((int)binario.charAt(0)==48){
     digitalWrite(lampadina[1],HIGH);
  }else{
     digitalWrite(lampadina[1],LOW);
  }
   if((int)binario.charAt(0)==48){
     digitalWrite(lampadina[2],HIGH);
  }else{
     digitalWrite(lampadina[2],LOW);
  }

le lampadine rimangono spente tutte.
Con 48 così ‘48’ non funziona nemmeno
così non funziona nemmeno:

  if ((int)binario.charAt(0) == '48') {
    digitalWrite(lampadina[0], HIGH);
  } if((int)binario.charAt(0) == '49') {
    digitalWrite(lampadina[0], LOW);
  }
  if ((int)binario.charAt(0) == '48') {
    digitalWrite(lampadina[1], HIGH);
  } if((int)binario.charAt(0) == '49') {
    digitalWrite(lampadina[1], LOW);
  }
  if ((int)binario.charAt(0) == '48') {
    digitalWrite(lampadina[2], HIGH);
  } if((int)binario.charAt(0) == '49') {
    digitalWrite(lampadina[2], LOW);
  }

Se faccio così non funziona nemmeno

  if ((int)binario.charAt(0) == 48) {
    digitalWrite(lampadina[0], HIGH);
  } if((int)binario.charAt(0) == 49) {
    digitalWrite(lampadina[0], LOW);
  }
  if ((int)binario.charAt(0) == 48) {
    digitalWrite(lampadina[1], HIGH);
  } if((int)binario.charAt(0) == 49) {
    digitalWrite(lampadina[1], LOW);
  }
  if ((int)binario.charAt(0) == 48) {
    digitalWrite(lampadina[2], HIGH);
  } if((int)binario.charAt(0) == 49) {
    digitalWrite(lampadina[2], LOW);
  }

nemmeno così va:

  if (binario.charAt(0) == 1) {
    digitalWrite(lampadina[0], HIGH);
  } if(binario.charAt(0) == 0) {
    digitalWrite(lampadina[0], LOW);
  }
  if (binario.charAt(0) == 1) {
    digitalWrite(lampadina[1], HIGH);
  } if(binario.charAt(0) == 0) {
    digitalWrite(lampadina[1], LOW);
  }
  if (binario.charAt(0) == 1) {
    digitalWrite(lampadina[2], HIGH);
  } if(binario.charAt(0) == 0) {
    digitalWrite(lampadina[2], LOW);
  }

nemmeno così va:

  if (binario.charAt(0) == '1') {
    digitalWrite(lampadina[0], HIGH);
  } if(binario.charAt(0) == '0') {
    digitalWrite(lampadina[0], LOW);
  }
  if (binario.charAt(0) =='1') {
    digitalWrite(lampadina[1], HIGH);
  } if(binario.charAt(0) == '0') {
    digitalWrite(lampadina[1], LOW);
  }
  if (binario.charAt(0) == '1') {
    digitalWrite(lampadina[2], HIGH);
  } if(binario.charAt(0) == '0') {
    digitalWrite(lampadina[2], LOW);
  }

ora che mi viene in mente mettere il 48 tra le virgolette così ‘48’ non aveva molto senso, dato che il 48 sono due caratteri…

E ora che noto non avevo cambiato i numeri dentro a binario.charAt(), ma credo che riprovando non funzioni cmnq .

Ok ho trovato il codice, quiesto funziona, ma sinceramente non mi piace, conoscete un modo per farlo meglio?

  if (binario.charAt(0) == '1') {
    digitalWrite(lampadina[0], HIGH);
  } if(binario.charAt(0) == '0') {
    digitalWrite(lampadina[0], LOW);
  }
  if (binario.charAt(1) =='1') {
    digitalWrite(lampadina[1], HIGH);
  } if(binario.charAt(1) == '0') {
    digitalWrite(lampadina[1], LOW);
  }
  if (binario.charAt(2) == '1') {
    digitalWrite(lampadina[2], HIGH);
  } if(binario.charAt(2) == '0') {
    digitalWrite(lampadina[2], LOW);
  }

e poi c’è un altro problema, il codice lo fa tutto e dopo un po’ di volte che lo fa entra in un ciclo infinito, ho contato 8 volte ma magari è un caso.

int bottone = 13;
int lampadina[] = {12, 11, 10};
boolean b[] = {true, true};
int contatore = 0;
int tempo = 0;
String binario = "";
void setup() {
  pinMode(bottone, INPUT);
  pinMode(lampadina[0], OUTPUT);
  pinMode(lampadina[1], OUTPUT);
  pinMode(lampadina[2], OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.println("iniziato");
  while (millis() - tempo <= 3000) {
    if (digitalRead(bottone) == HIGH) {
      if (b[0] == true) {
        contatore++;
        b[0] = false;
        b[1] = true;
        tempo = millis();
      }
    } else {
      b[0] = true;
    }
  }
  if (contatore > 7) {
    contatore = 7;
  }

  int i = 0;
  while (i < 3 && b[1] == true) {
    binario = contatore % 2 + binario;
    i++;
    contatore /= 2;
  }
  if (binario.charAt(0) == '1') {
    digitalWrite(lampadina[0], HIGH);
  } if(binario.charAt(0) == '0') {
    digitalWrite(lampadina[0], LOW);
  }
  if (binario.charAt(1) =='1') {
    digitalWrite(lampadina[1], HIGH);
  } if(binario.charAt(1) == '0') {
    digitalWrite(lampadina[1], LOW);
  }
  if (binario.charAt(2) == '1') {
    digitalWrite(lampadina[2], HIGH);
  } if(binario.charAt(2) == '0') {
    digitalWrite(lampadina[2], LOW);
  }
  Serial.println(binario.charAt(0));
  Serial.println(binario.charAt(1));
  Serial.println(binario.charAt(2));
  // non legge binario.charAt(i) non aggiorna la variabile i dentro?
  // non legge nemmeno   digitalWrite(lampadina[0], binario.charAt(0) - 48);
  b[1] = false;
  binario = "";
  tempo = millis();
}

Quindi i problemi sono :
1 - non mi piace l’ultima parte di codice, c’è un modo per farla meglio?
2 - perché non aggiorna la i dentro?
3 - perché non legge binario.charAt(0) - 48 dentro a digitalWrite?
4 - perché entra in un ciclo infinito?

Per ora non mi vengono in mente altre domande.

Mi paiono inutili tutti quei giri, esiste la bitRead() che ti legge se un singolo bit è 0 o 1
https://www.arduino.cc/en/Reference/BitRead
La funzione poi in realtà è una macro e si basa sugli operatori di manipolazione dei bit del C.
http://www.tutorialspoint.com/ansi_c/c_bits_manipulation.htm

che cosa devo mettere nel codice?

nid69ita:
Mi paiono inutili tutti quei giri, esiste la bitRead() che ti legge se un singolo bit è 0 o 1

Ancora più semplice, dopo il conteggio delle chiusure del pulsante si trasferisce il valore direttamente su un port al quale sono stati collegati dei led nel corretto ordine 0-7, in questo modo si ottiene con solo poche righe di codice il risultato voluto.
Rammento che all’interno del micro i numeri sono sempre in formato binario, non serve nessuna conversione.

Quindi che devo fare?

Una volta che hai il contatore dentro hai già i bit a 0 o 1 a seconda del valore.
Quindi un bel for con indice idx da 0 a 7 e quello è l'indice di quale bit verificare.
Ora se hai letto la bitRead(), deve lavorare su contatore e in base all'indice idx del for.
Lo stesso indice idx lo usi per quale bit verificare e per l'indice dell'array lampadina