Enhorabuena por tu implementación de la conversión a binario. Seguramente tu experiencia en C es escasa y por eso tiene mucho mérito lo que has hecho. Yo vengo a hacerte partícipe de mis conocimientos en C a nivel de tratamiento de bits y cómo haría yo la conversión a binario.
Un inciso: no hace falta “limitar” los valores de la variable contador ya que cuando el valor pase de 255 a 256 los ocho bits menos significativos pasan a valer cero y “vuelta a empezar” por sí solo. Cierto es que si la declaras de tipo byte te ahorras un byte. Pero eso no es crítico. Así que, independientemente de si contador es de tipo integer o de tipo byte, no hace falta el if siguiente:
if (contador >= 0 && contador <= 255){ //primero debe de estar en el rango de 0 a 255 (1 byte) ya que son 8 leds (bits)
En las llamada a la función digitalWrite en lugar poner LOW podemos poner un cero y en lugar de HIGH podemos poner un valor distinto de cero (1, 2, 234 o cualquier otro valor que no sea cero). Así que en lugar de ver si num2 % 1 es un 1 para usar el valor HIGH y si es un 0 usar el LOW podemos usar directamente el resultado de la operación y sustituir las líneas:
if (num2 % 2 == 1) { //si se cumple...
digitalWrite(LEDP[i], HIGH); //enciente el LEDP[i]
}
else {
digitalWrite(LEDP[i], LOW); //de lo contrario se apaga
}
… por la única línea de código:
digitalWrite(LEDP[i], num2 % 2); //enciente o apaga el LEDP[i]
Al igual que ponemos contador++ en lugar de poner contador = contador + 1 también podemos poner num2 /= 2 en lugar de num2 = num2 / 2. La línea:
num2 = num2 / 2; //y se divide por 2 hasta que i=8
… puede ponerse así:
num2 /= 2; //y se divide por 2 hasta que i=8
Dividir por dos y “desplazar a la derecha” una vez los bits de un entero produce el mismo efecto, así que en lugar de num2 /= 2 (num2 = num2 / 2) podemos usar el operador >> (desplazar a la derecha). Por lo que podemos sustituir la instrucción anterior por num2 >>= 1 (num2 = num2 >> 1). Quedando la línea:
num2 >>= 1; //y se desplazan una vez los bit a la derecha hasta que i=8
Usando otro operador de bits también podemos sustituir la operación num2 % 2. En su lugar podemos realizar la operación a nivel de bits num2 & 1.
Si “juntamos” todo lo dicho hasta ahora la conversión nos queda así:
//-------------------------------- CONVIERTE el valor de (contador) a Binario
num2 = contador; //se le pasa de la variable contador (numero de veces pulsados) a la variable "num2"
for (int i = 0; i < 8; i++) { //ciclo for desde valor i=0 (LEDP[0]= pin 2) al valor i=7 (LEDP[7]= pin 9) ENCIENDE O APAGA LOS LED´S
digitalWrite(LEDP[i], num2 & 1); //enciente o apaga el LEDP[i]
num2 >>= 1; //y se desplazan una vez los bit a la derecha hasta que i=8
delay(100);
}
Otro detalle: al igual que definimos e inicializamos a cero la variable i al principio del for para luego modificar e incrementar al final del for, podemos hacer algo semejante con la variable num2 en el mismo for aprovechando, entre otras cosas, que son del mismo tipo. Podemos definir y modificar la variable num2 separando por comas:
//-------------------------------- CONVIERTE el valor de (contador) a Binario
for (int i = 0, num2 = contador; i < 8; i++, num2 >>= 1) { //ciclo for desde valor i=0 (LEDP[0]= pin 2) al valor i=7 (LEDP[7]= pin 9) ENCIENDE O APAGA LOS LED´S
digitalWrite(LEDP[i], num2 & 1); //enciente o apaga el LEDP[i]
delay(100);
}
Se han quitado las líneas de la operación num2 >>= 1 y la de la asignación num2 = contador para “ponerlas” en el for. Otra línea que ya no hace falta es la de la definición int num2; al principio del programa ya que la variable se está definiendo en el for.
El programa, con todas las modificaciones, quedaría así:
int LEDP[] = {2, 3, 4, 5, 6, 7, 8, 9}; //mis pines a ocuparán serán del 2 al 9
int contador = 0; //Una curiosidad, si puse esto... estoy inicializando contador con valor inicial 0 o en el pin 0??.
int botton1y2 = 10;
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(LEDP[i], OUTPUT);
}
pinMode(botton1y2, INPUT);
}
void loop() {
//-----------------------------SUMA las pulsaciones
if (digitalRead(botton1y2)==HIGH) { //Solo entra hasta que el botón se pulse. Si no se pulsa quedará sin hacer nada hasta que se pulse
while (digitalRead(botton1y2)==HIGH) { //Su función es dejar en pausa hasta que se suelte el botón
delay(10);
}
if (digitalRead(botton1y2)==LOW) { //Solo entra hasta que el botón se suelte
contador++; //se incrementa el valor del contador
// CONVIERTE el valor de (contador) a Binario
for (int i = 0, num2 = contador; i < 8; i++, num2 >>= 1) {
digitalWrite(LEDP[i], num2 & 1); //enciente o apaga el LEDP[i]
}
}
}
delay(100);
}
Si buscas códigos que traten con bits, verás que se parecen bastante al código que te he puesto. Sé que de entrada se ve muy ofuscado y confuso, pero cuanto antes empieces a trabajar con los operadores de bits antes te “acostumbrarás” a ellos.