Ayuda RS232 + Placa Relés

Hola amigos,
tengo un arduino uno + Placa ethernet + Placa de 8 Relés 5 y me gustaría poder hacer lo mismo que hace esta placa que os envio en el enlace.
La comunicación se realizaría mediante el protocolo RS-232 (9600, n, 8, 1).
Y cada vez que recibamos uno nuevo byte por el puerto RS232 , actualice el estado de relés de la placa.

Y me gustaría que cuando le mando los siguiente datos me active los Relés.

Data received: 00000001 Activa Relé 1
Data received: 00000010 Activa Relé 2
Data received: 00000100 Activa Relé 3
Data received: 00001000 Activa Rele 4
Data received: 00010000 Activa Relé 5
Data received: 00100000 Activa Relé 6
Data received: 01000000 Activa Relé 7
Data received: 10000000 Activa Relé 8

Y a la inversa los cierra.
¿Alguien me ayuda en su programación?

Las entradas de la placa no las necesito, solo las salidas de relés y la recepción de datos del puerto serie.

PS6E8S (6 entradas logicas 8 salidas reles)
http://www.micropik.com/pag_puertos.htm

Mil gracias :wink:

si envias multiplos de 2 puedes identificar cada bit
1,2,4,8,16,32,128 y deberias poner 1 byte mas para avisar si es de encendido o apagado.

si haces por ejemplo 2+8+128=138 puedes activar los 3 bits a la vez y de un solo envio prendes 3 reles a la vez.

void loop() {
        if (Serial.available() > 0) 
        {
                // read the incoming byte:
                valor = Serial.read();
                if( valor && 128)
                   ActivarRele(8);
                if( valor && 64)
                   ActivarRele(7);
                if( valor && 32)
                   ActivarRele(6);
                if( valor && 16)
                   ActivarRele(5);
                if( valor && 8)
                   ActivarRele(4);
                if( valor && 4)
                   ActivarRele(3);
                if( valor && 2)
                   ActivarRele(2);
                if( valor && 1)
                   ActivarRele(1);
        }

si entendí y es lo que te puse.
Si pasas a decimal esa cadena binaria te va a dar los numeros 1,2,4,8,16,32,64,128.

00000001=1
00000010=2
00000100=4
00001000=8
00010000=16
00100000=32
01000000=64
10000000=128

Lo que no queda calaro es que siempre recibe 00000000, en los 8 casos!
¿como sabes cual relé debes desactivar? o desactivas todos?

de igual forma puedes comparar con un and negando el valor recibido.
Hay que probarlo. no se si va a funcionar.

//00000001=1 NOT = 11111110

void loop() {
        if (Serial.available() > 0) 
        {
                // read the incoming byte:
                valor = Serial.read();
                valorApagar= not valor;

                if( valor && 128)
                   ActivarRele(8);
                if( valor && 64)
                   ActivarRele(7);
                if( valor && 32)
                   ActivarRele(6);
                if( valor && 16)
                   ActivarRele(5);
                if( valor && 8)
                   ActivarRele(4);
                if( valor && 4)
                   ActivarRele(3);
                if( valor && 2)
                   ActivarRele(2);
                if( valor && 1)
                   ActivarRele(1);


                if( valorApagar && 128)
                   ApagarRele(8);
                if( valorApagar && 64)
                   ApagarRele(7);
                if( valorApagar && 32)
                   ApagarRele(6);
                if( valorApagar && 16)
                   ApagarRele(5);
                if( valorApagar && 8)
                   ApagarRele(4);
                if( valorApagar && 4)
                   ApagarRele(3);
                if( valorApagar && 2)
                   ApagarRele(2);
                if( valorApagar && 1)
                   ApagarRele(1);

        }

void ActivarRele(int puerto)
{
digitalWrite(puerto+1,HIGH); //para que arranque en el pin2 sumar 1
}

void ApagarRele(int puerto)
{
digitalWrite(puerto+1,LOW); //para que arranque en el pin2 sumar 1
}

void setup()
{
Serial.begin(9600);

}

void loop()
{
if (Serial.available() > 0)
{
// read the incoming byte:
byte valor = Serial.read();
byte valorApagar= not valor;

if( valor && 128)
ActivarRele(8);
if( valor && 64)
ActivarRele(7);
if( valor && 32)
ActivarRele(6);
if( valor && 16)
ActivarRele(5);
if( valor && 8)
ActivarRele(4);
if( valor && 4)
ActivarRele(3);
if( valor && 2)
ActivarRele(2);
if( valor && 1)
ActivarRele(1);

if( valorApagar && 128)
ApagarRele(8);
if( valorApagar && 64)
ApagarRele(7);
if( valorApagar && 32)
ApagarRele(6);
if( valorApagar && 16)
ApagarRele(5);
if( valorApagar && 8)
ApagarRele(4);
if( valorApagar && 4)
ApagarRele(3);
if( valorApagar && 2)
ApagarRele(2);
if( valorApagar && 1)
ApagarRele(1);

}
}

empieza, con la terminal a probar.
Creo que ati te envian una cadena, lo que tendrias que convertir esa cadena de caracteres binarios en un numero.

yo te lo simplifique para cuendo reciba un numero.

Ahora sigue investigando

Te falta los indices del vector
PIN_LED para decirle cual quieres