Convertir una letra de Binario a su caracter normal

Buenos días, espero alguien pueda ayudarme con éste problema.
Tengo el valor de una letra almacenada en su valor binario en un arreglo de caracteres o String, por ejemplo

String Letra="01000001"  //Esto sería una 'A';
Letra="01000010"  //Esto sería una 'B';
Letra="01010100"  //Esto sería una 'T';

Lo que deseo es imprimir esas letras la 'A' y la 'T'.

Cabe mencionar que ésos arreglos los he obtenido a traves de pulsos en una fotoresistencia (0 y 1) y los he ido almacenando en esos arreglos, practicmente estoy atorado en esta parte ya que necesito imprimir ésos valores en un display, pero obvio primero tengo que convertirlos a letras

Creo que ya encontré la solucion, primero debo convertir a decimal ese valor en binario y luego imprimir en su correspondiente valor Ascii

Esto

String Letra="01000001"  //Esto sería una 'A';

no es ASCII
es String
ojo como lo conviertes!!

Para imprimir una letra representada en binario (por código), yo hubiera hecho lo siguiente:

Serial.write(B01000001);
Serial.write(B01000010);
Serial.write(B01010100);

Observa que se coloca una B antes de los 8 bits.

sergestux:
Cabe mencionar que ésos arreglos los he obtenido a traves de pulsos en una fotoresistencia (0 y 1) y los he ido almacenando en esos arreglos, practicmente estoy atorado en esta parte ya que necesito imprimir ésos valores en un display, pero obvio primero tengo que convertirlos a letras

Pues precisamente habrías optimizado mucho tu programa en uso de memoria, y obtenido directamente los caracteres, cambiando la rutina que trata esos pulsos de la fotorresistencia. Supongo que los strings los consigues más o menos con un bucle similar a esto:

string cadena="";
for (a=0; a< 8; a++) {
    if (pulso=HIGH) 
        cadena=cadena+"1";
    else 
        cadena=candena+"0";
}

A ver si eres capaz de sustituirlo por algo que se parezca a esto:

char caracter=0;
for (a=0; a< 8; a++) {
    caracter<<=1;
    if (pulso=HIGH) 
        caracter=caracter & 1;

Y caracter debería ser directamente la letra.

@sergestux

ammm recuerda que en ASCII hay 266 valores asignados(ASCII EXTENDIDO) eso quiere decir que A equivale a 65 decimal , 65 decimal corresponde a 34 en Hexadecimal y en binario 11 0100, y mas simple aun recuerda que una variable es almacenada en binario... sea el tipo que sea el microcontrolador las almacena en binario.
lo que me lleva a la siguiente pregunta "a qué te refieres con imprimir" imprimir a donde?
no necesitas guardar en una constante numérica un valor tan pequeño como 52 a mi parecer. quizás cuestión de gustos yo ocuparía una constante para un valor numérico grande o difícil de interpretar.
ahora int("variable char"), te devuelve el valor numérico de la variable tipo char. eso quiere decir
int(o también puede ser tipo byte o uint8_t como quieras llamarle")
valor=int('A')
te devolverá 65, 65 lo puedes representar binario, Hex, Bin, Octal lo que quieras.
Saludos

Perdon chicos, es el primer post que hago y me agrada que sean tan activos. Creo que me emocioné demasiado al decirles que ya tenia la solucion. El problema sigue siendo el mismo.

Veran mi proyecto es que a traves de un laser apuntador, pueda pasar un mensaje de una tarjeta arduino a otra, la parte del emisor ya la tengo ya que desde el bluetoth envío el mensaje a la arduino. Mi arduino lee esa letra y gracias a la sig. instruccion convierto esa letra en binario:

String binario = String(letra, BIN);  //Convierto la letra en Binario

Con un for recorro ese String y si encuentro un 1, enciendo mi laser, si encuentro un 0 lo apago. Hasta ahi todo bien.

Ahora del lado del receptor gracias a que mi laser apunta al fotosensor estoy guuardando esos valores en una variable String, ahi tambien batallé bastante para identificar cuando es un 1 y cuando es un cero, debido a la iluminacion cambiante propia del medio ambiente

String LetraBin;   //Para almacenar las letras em binario

//CODIGO PARA GUARDAR LOS VALORES

//HASTA ÉSTE PUNTO ES DONDE MI VARIBALE TIPO STRING YA TIENE LOS VALORES EN BINARIO CORRESPONDIENTE
LetraBin="01010101";  //Suponiendo que recibío una U

//ACA tengo pensado imprimir esa 'U' en un display

Espero no haberlos enredado más ya que lo que necesito es imprimir el valor de ésa misma letra ("U") ya que actualmente sólo tengo su valor en binario("01010101"), de preferencia sería mejor para mi si la guardo en otra variable tipo char o String.

Muchas gracias por comentar colegas, les agradezco el tiempo que se toman

noter:
Pues precisamente habrías optimizado mucho tu programa en uso de memoria, y obtenido directamente los caracteres, cambiando la rutina que trata esos pulsos de la fotorresistencia. Supongo que los strings los consigues más o menos con un bucle similar a esto:

string cadena="";

for (a=0; a< 8; a++) {
    if (pulso=HIGH)
        cadena=cadena+"1";
    else
        cadena=candena+"0";
}




A ver si eres capaz de sustituirlo por algo que se parezca a esto:


char caracter=0;
for (a=0; a< 8; a++) {
    caracter<<=1;
    if (pulso=HIGH)
        caracter=caracter & 1;




Y caracter debería ser directamente la letra.

Efectivamente algo así estoy haciendo

   if (pulso=HIGH) 
        cadena=cadena+"1";
    else 
        cadena=candena+"0";

Pero no logro entender tú código, me lo podrías explicar mejor

Al final hice mi propia funcion que hiciera la conversion de cadena Binaria a su representacion original Ascii. Les pongoel codigo de ejemplo con el que estuve trabajando colegas:

/*Sergestux@gmail.com*/
String StrAbecedario;
String LetraBin;
char Letra;

void setup() 
{
  StrAbecedario = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz !#$%&/()=?*";
  Serial.begin(9600);
}

//Regresa una cadena binaria en su correspondiente valor ascii
char ValorAscii(String CadenaBinaria)
{
  int Multiplo=1;
  char Res=0;
  char Bit;  
  for(int Cont=CadenaBinaria.length()-1; Cont>=0; Cont--)
  {
    Bit=CadenaBinaria.charAt(Cont);                //Obtengo el bit que estoy manipulando
    if(Bit=='1')    
      Res= Res + Multiplo;      
    Multiplo= Multiplo* 2;
  }
  return Res;
}

void loop() 
{
  for (int Cont=0; Cont<StrAbecedario.length(); Cont++)   //Recorro las letras
  {
    Letra=StrAbecedario.charAt(Cont);                //Obtengo la letra que estoy manipulando
    LetraBin=String(Letra, BIN);                     //Convierto la letra en Binario
    Serial.print(Letra);                             //Imprimo la letra original
    Serial.print("\t-\t");                          
    Serial.print(LetraBin);                           //Imprimo la representacion de la letra en Binario        
    Serial.print("\t-\t'");
    Serial.print(ValorAscii(LetraBin));               //Convierto la letra binaria a su valor ASCII nuevamente
    Serial.print("'");
    delay(100);    
    Serial.print("\n");
  }    
  delay(10000);
}

y ésta es la salida que me da el programa

A	-	1000001	-	'A'
B	-	1000010	-	'B'
C	-	1000011	-	'C'
D	-	1000100	-	'D'
E	-	1000101	-	'E'
F	-	1000110	-	'F'
G	-	1000111	-	'G'
H	-	1001000	-	'H'
I	-	1001001	-	'I'
J	-	1001010	-	'J'
K	-	1001011	-	'K'
L	-	1001100	-	'L'
M	-	1001101	-	'M'
N	-	1001110	-	'N'
O	-	1001111	-	'O'
P	-	1010000	-	'P'
Q	-	1010001	-	'Q'
R	-	1010010	-	'R'
S	-	1010011	-	'S'
T	-	1010100	-	'T'
U	-	1010101	-	'U'
V	-	1010110	-	'V'
W	-	1010111	-	'W'
X	-	1011000	-	'X'
Y	-	1011001	-	'Y'
Z	-	1011010	-	'Z'
 	-	100000	-	' '
a	-	1100001	-	'a'
b	-	1100010	-	'b'
c	-	1100011	-	'c'
d	-	1100100	-	'd'
e	-	1100101	-	'e'
f	-	1100110	-	'f'
g	-	1100111	-	'g'
h	-	1101000	-	'h'
i	-	1101001	-	'i'
j	-	1101010	-	'j'
k	-	1101011	-	'k'
l	-	1101100	-	'l'
m	-	1101101	-	'm'
n	-	1101110	-	'n'
o	-	1101111	-	'o'
p	-	1110000	-	'p'
q	-	1110001	-	'q'
r	-	1110010	-	'r'
s	-	1110011	-	's'
t	-	1110100	-	't'
u	-	1110101	-	'u'
v	-	1110110	-	'v'
w	-	1110111	-	'w'
x	-	1111000	-	'x'
y	-	1111001	-	'y'
z	-	1111010	-	'z'
 	-	100000	-	' '
!	-	100001	-	'!'
#	-	100011	-	'#'
$	-	100100	-	'

% - 100101 - '%'
& - 100110 - '&'
/ - 101111 - '/'
( - 101000 - '('
) - 101001 - ')'
= - 111101 - '='
? - 111111 - '?'

    • 101010 - '*'

Entonces si te estoy entendiendo estas tratando de implementar una comunicación inalámbrica por láser?
quizás no sea relevante, pero como vas a sincronizar los "unos" y "ceros" que vas a enviar? es decir después de un cero como saber cuando leer el siguiente número? que pasará si vuelve a ser cero?
en cuanto a como enviar eso creo que no es tan dificil veo que la información de cada letra la almacenas en un byte entonces lo unico que debes hacer es acceder a cada bit esto lo puedes hacer con un for asi:

int a=bin10101010;
bool bin=0;
for(int pos=8;pos<1;pos--){
 bin=a>>pos;
 Serial.print(bin,BIN);
 }

La idea es tener una variable que almacene el valor desplazado de tu variable, después transfieres, y el ciclo hace menos desplazamientos.
y así accedes a los valores binarios, no se si es lo que quieres. la función no se si funcione es solo un ejemplo creado rápidamente.Esto seria para enviar.
para recibir haces lo mismo, recives un bit, lo guardas en una variable(recorrido varias veces) recibes el siguiente lo sumas a la variable (recorrido varias vecces-1)
y asi, aqui debes tener en cuenta que bit sera enviado primero, el mas significativo o e menos.
Saludos y Suerte

Eduardosanchez:
Entonces si te estoy entendiendo estas tratando de implementar una comunicación inalámbrica por láser?
quizás no sea relevante, pero como vas a sincronizar los "unos" y "ceros" que vas a enviar? es decir después de un cero como saber cuando leer el siguiente número? que pasará si vuelve a ser cero?

Él tiene razón, necesitas determinar los tiempos para muestrear los bits (debe ser constante durante la transmisión).

En comunicación serial (claramente es lo que pretendes hacer), tienes dos opciones: con señal de reloj (como I2C) o sin señal de reloj (como UART). Supongo que pretendes llevar todo en una sola línea, así que el camino de UART (Serial) es la opción.
Para fines didácticos, es posible recrear dicho protocolo; sin embargo, si no quieres "reinventar la rueda", puedes incluso transmitir el propio UART por... láser tengo entendido.

A - 1000001 - 'A'
B - 1000010 - 'B'
C - 1000011 - 'C'
D - 1000100 - 'D'
...

¿Es algún código usual, ó es propio?
Saludos

Lucario448:
En comunicación serial (claramente es lo que pretendes hacer), tienes dos opciones: con señal de reloj (como I2C) o sin señal de reloj (como UART). Supongo que pretendes llevar todo en una sola línea, así que el camino de UART (Serial) es la opción.
Para fines didácticos, es posible recrear dicho protocolo; sin embargo, si no quieres "reinventar la rueda", puedes incluso transmitir el propio UART por... láser tengo entendido.

Exacto! solo que en lugar de una fotocelda un fototransistor o algo semejante, una LDR(fotocelda) tiene tiempos largos de conmutación, asi que quizas no sea de utilidad a la velocidad de switcheo de un uart.
saludos es interesante quieres hacer un li-fi deverias hacer el proyecto :v

Eduardosanchez:
solo que en lugar de una fotocelda un fototransistor o algo semejante, una LDR(fotocelda) tiene tiempos largos de conmutación, asi que quizas no sea de utilidad a la velocidad de switcheo de un uart.

Encima para usar un LDR hay que ponerle un schmitt trigger de por medio; es más sencillo eso que muestrear una señal analógica (a menos que el divisor de voltaje esté tan bien configurado para poder levantar los estados lógicos de una entrada digital, en el umbral correcto).
Si la "inercia" de un LDR es excesiva (en el rango de los milisegundos), el puerto serial o UART tendría que ir ridículamente despacio (< 1000 bps).

Créelo o no, un LED también puede hacer de fotodiodo (y de rápida conmutación); solo que requiere de amplificación porque el voltaje generado no llega ni al voltio.

Lucario448:
Créelo o no, un LED también puede hacer de fotodiodo (y de rápida conmutación); solo que requiere de amplificación porque el voltaje generado no llega ni al voltio.

Lo se pero para que usar un diodo(o fotodiodo) cuando ya puedes tener un fototransistor hasta con salida darlington :v

Porque quizá un fototransistor sea más útil para conmutar cargas más grandes; pero para una entrada digital de muy alta impedancia, el Darlington está de más...

Aunque eso sí, no le quita la conveniencia de no requerir schmitt trigger o amplificador operacional.

Ya me quedó él proyecto amigos en sí es un proyecto escolar, use la foto resistencia por que era él componente que ya había comparado para otro proyecto anterior. El objetivo era pasar información a través de fibra óptica y para esto fue que decidí utilizar él laser.
Al momento de enviar las letras no tuve mucho problema, dónde se me complicó un poco fue al querer leer el valor y cómo bien comentan algunos me era difícil identificar cuándo se estaba recibiendo información y cuándo no, tuve qué aislar de la luz externa dónde recibía el láser sobre la fotoresistencia y los pulsos obviamente están sincronizados en las dos tarjetas arduinos, probé con 100 milisegundos y seguía recibiendo bien las letras aunque visualmente no veía ningún cambio.
De verdad les agradezco a todos y aunque ya había programado en C, nunca había tocado los bits de la manera en que varios me sugirieron, muchas gracias por sus sugerencias

vffgaston:
A - 1000001 - 'A'
B - 1000010 - 'B'
C - 1000011 - 'C'
D - 1000100 - 'D'
...

¿Es algún código usual, ó es propio?
Saludos

Lo que sucede es que la letra A tiene su representación en número, el cuál es él código ASCII. La A en ASCII es 65, éste número 65 es él qué convierto en binario (1000001), la letra B en ASCII es 66 y en binario es 1000010 y así sucesivamente

Que bueno que hayas resuelto tu proyecto, te estabas metiendo en un concepto bastante bueno con la implementación de un sistema de comunicación con luz.
con otro LRD y otro laser facilmente hubiesen implementado una comunicacion sincrona y creeme que era más fácil.(solo esperar señal de reloj para validar a informacion)
Saludos y buena suerte.