ARDUINO + RS232 (Activación Relés en Placa)

Buenas tardes,
me gustaría que me ayudaran a realiza un pequeño proyecto.

Se trata de que mediante un arduino + un placa de 8 Relés y la recepción de un dato por las patillas RS232, me active / desactive Relés.

Buenas tardes,
me gustaría que me ayudaran a realiza un pequeño proyecto.

Se trata de que mediante un arduino + un placa de 8 Relés y la recepción de un dato por las patillas RS232, me active / desactive Relés.

Recepción Dato 01

00000001 Me tendría que accionar el Relé 1 de la Placa.
00000000 Me desactiva el Relé 1 de la Placa.

Recepción Dato 02

00000010 Me tendría que accionar el Relé 2 de la Placa.
00000000 Me desactiva el Relé 2 de la Placa.

Recepción Dato 04

00000100 Me tendría que accionar el Relé 3 de la Placa.
00000000 Me desactiva el Relé 3 de la Placa.

Recepción Dato 08

00001000 Me tendría que accionar el Relé 4 de la Placa.
00000000 Me desactiva el Relé 4 de la Placa.

Recepción Dato 10

00010000 Me tendría que accionar el Relé 5 de la Placa.
00000000 Me desactiva el Relé 5 de la Placa.

Recepción Dato 20

00100000 Me tendría que accionar el Relé 6 de la Placa.
00000000 Me desactiva el Relé 6 de la Placa.

Recepción Dato 40

01000000 Me tendría que accionar el Relé 7 de la Placa.
00000000 Me desactiva el Relé 7 de la Placa.

Recepción Dato 80

10000000 Me tendría que accionar el Relé 8 de la Placa.
00000000 Me desactiva el Relé 8 de la Placa.

Recepción Dato 00 Relés en Reposo

Comienza y te ayudaremos.

y me responderás: Para eso posteé en este foro, para que me ayuden
y otro forero o yo te responderemos: Bueno, lee las normas del foro y verás porque te digo que comiences y pegues tu código para que te ayudemos con tus dudas y con tus errores, pero no pidas que hagamos tu trabajo.

Hola surbyte,

Empecé con este proyecto que era mediante una web abriera y cerrara relés.
Pero el programa me pesa mucho porque hace falta hacer Arrays etc...
Y no tengo ni papa!! Yo soy muy malo en esto e intento leer y leer.
Una vez tengo este programa quiero plasmarlo en el ejemplo que he puesto por RS232.

/*
Arduino Ethernet Shield
Control Remoto de Reles v1.0
*/

#include <SPI.h>
#include <Ethernet.h>

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC
IPAddress ip(10,10,10,100); //IP
EthernetServer servidor(80);

int PIN_LED1=5;
String readString1=String(30);
String state1=String(3);
int PIN_LED2=6;
String state2=String(3);
int PIN_LED3=7;
String state3=String(3);
int PIN_LED4=8;
String state4=String(3);
int PIN_LED5=9;
String state5=String(3);
int PIN_LED6=11;
String state6=String(3);
int PIN_LED7=12;
String state7=String(3);
int PIN_LED8=13;
String state8=String(3);

void setup()
{
Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
servidor.begin();

pinMode(PIN_LED1,OUTPUT);
digitalWrite(PIN_LED1,LOW);
state1="OFF";
digitalWrite(PIN_LED2,LOW);
pinMode(PIN_LED2,OUTPUT);
state2="OFF";
pinMode(PIN_LED3,OUTPUT);
digitalWrite(PIN_LED3,LOW);
state3="OFF";
pinMode(PIN_LED4,OUTPUT);
digitalWrite(PIN_LED4,LOW);
state4="OFF";
pinMode(PIN_LED5,OUTPUT);
digitalWrite(PIN_LED5,LOW);
state5="OFF";
pinMode(PIN_LED6,OUTPUT);
digitalWrite(PIN_LED6,LOW);
state6="OFF";
pinMode(PIN_LED7,OUTPUT);
digitalWrite(PIN_LED7,LOW);
state7="OFF";
pinMode(PIN_LED8,OUTPUT);
digitalWrite(PIN_LED8,LOW);
state8="OFF";
}

void loop()
{
EthernetClient cliente= servidor.available();

if(cliente)
{
boolean lineaenblanco=true;
while(cliente.connected())//Cliente conectado
{
if(cliente.available())
{
char c=cliente.read();
if(readString1.length()<30)//Leemos petición HTTP caracter a caracter
{
readString1.concat(c); //Almacenar los caracteres en la variable readString

}
if(c=='\n' && lineaenblanco)//Si la petición HTTP ha finalizado
{
int LED1 = readString1.indexOf("LED1=");
int LED2 = readString1.indexOf("LED2=");
int LED3 = readString1.indexOf("LED3=");
int LED4 = readString1.indexOf("LED4=");
int LED5 = readString1.indexOf("LED5=");
int LED6 = readString1.indexOf("LED6=");
int LED7 = readString1.indexOf("LED7=");
int LED8 = readString1.indexOf("LED8=");

if(readString1.substring(LED1,LED1+6)=="LED1=T")
{
digitalWrite(PIN_LED1,HIGH);
state1="ON";
} else if (readString1.substring(LED1,LED1+6)=="LED1=F")
{
digitalWrite(PIN_LED1,LOW);
state1="OFF";
}
if(readString1.substring(LED2,LED2+6)=="LED2=T")
{
digitalWrite(PIN_LED2,HIGH);
state2="ON";
} else if (readString1.substring(LED2,LED2+6)=="LED2=F")
{
digitalWrite(PIN_LED2,LOW);
state2="OFF";
}
if(readString1.substring(LED3,LED3+6)=="LED3=T")
{
digitalWrite(PIN_LED3,HIGH);
state3="ON";
} else if (readString1.substring(LED3,LED3+6)=="LED3=F")
{
digitalWrite(PIN_LED3,LOW);
state3="OFF";
}

if(readString1.substring(LED4,LED4+6)=="LED4=T")
{
digitalWrite(PIN_LED4,HIGH);
state4="ON";
} else if (readString1.substring(LED4,LED4+6)=="LED4=F")
{
digitalWrite(PIN_LED4,LOW);
state4="OFF";
}
if(readString1.substring(LED5,LED5+6)=="LED5=T")
{
digitalWrite(PIN_LED5,HIGH);
state5="ON";
} else if (readString1.substring(LED5,LED5+6)=="LED5=F")
{
digitalWrite(PIN_LED5,LOW);
state5="OFF";
}
if(readString1.substring(LED6,LED6+6)=="LED6=T")
{
digitalWrite(PIN_LED6,HIGH);
state6="ON";
} else if (readString1.substring(LED6,LED6+6)=="LED6=F")
{
digitalWrite(PIN_LED6,LOW);
state6="OFF";
}

if(readString1.substring(LED7,LED7+6)=="LED7=T")
{
digitalWrite(PIN_LED7,HIGH);
state7="ON";
} else if (readString1.substring(LED7,LED7+6)=="LED7=F")
{
digitalWrite(PIN_LED7,LOW);
state7="OFF";
}

if(readString1.substring(LED8,LED8+6)=="LED8=T")
{
digitalWrite(PIN_LED8,HIGH);
state8="ON";
} else if (readString1.substring(LED8,LED8+6)=="LED8=F")
{
digitalWrite(PIN_LED8,LOW);
state8="OFF";
}
//Cabecera HTTP estándar
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println();
//Página Web en HTML
cliente.println("");
cliente.println("");
cliente.println("CRR v1.0");
cliente.println("

Control Remoto de Reles v1.0</font color>

");
cliente.print("");
cliente.println("");
cliente.println("

RELE 1

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED1=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED1=F'>");
cliente.print("Estado: ");
cliente.print(state1);
cliente.println("

RELE 2

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED2=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED2=F'>");
cliente.print("Estado: ");
cliente.print(state2);
cliente.println("

RELE 3

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED3=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED3=F'>");
cliente.print("Estado: ");
cliente.print(state3);
cliente.println("

RELE 4

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED4=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED4=F'>");
cliente.print("Estado: ");
cliente.print(state4);
cliente.println("

RELE 5

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED5=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED5=F'>");
cliente.print("Estado: ");
cliente.print(state5);
cliente.println("

RELE 6

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED6=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED6=F'>");
cliente.print("Estado: ");
cliente.print(state6);
cliente.println("

RELE 7

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED7=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED7=F'>");
cliente.print("Estado: ");
cliente.print(state7);
cliente.println("

RELE 8

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED8=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED8=F'>");
cliente.print("Estado: ");
cliente.print(state8);
cliente.println("");
cliente.println("");
cliente.stop();//Cierro conexión con el cliente
readString1="";
}
}
}
}
}

Gracias por postear el código, pero no has leído las normas del foro que te pedí hicieras porque no usas tag para postear ese código.

Se trata de que mediante un arduino + un placa de 8 Relés y la recepción de un dato por las patillas RS232, me active / desactive Relés.

Recepción Dato 1

00000001 Me tendría que accionar el Relé 1 de la Placa.
00000000 Me desactiva el Relé 1 de la Placa.

Tu hablas de recepción de dato via RS232 pero, luego muestras un código con iteracción Ethernet-Web entonces, en que quedamos?

Hola,
la idea es que reciba los datos por RS232 y se pueda ver mediante web el estado de los relés.

Pero me he quedado ahí porque no se más!!

Ahora si.
Probaste viendo un ejemplo simple del IDE para usar el puerto Serie como entrada?

Aca uno que se llama Dimmer y esta en ejemplos del IDE -> Communications -> Dimmer

const int ledPin = 9;      // the pin that the LED is attached to

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

                                                // check if data has been sent from the computer:
  if (Serial.available()) {             // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();     // set the brightness of the LED:
    analogWrite(ledPin, brightness);
  }
}

Serial.available() será distintos de 0 cada vez que haya datos en el buffer serie.
brightness se cargará con el valor recibido por el puerto serie
analogWrite() lo envia por la salida PWM ledPin.

Hace mucho tiempo y con la ayuda de un compañero probamos esto.
Pero no me funcionaba bien.

00000001=1 Dato HEX 01
00000010=2 Dato HEX 02
00000100=4 Dato HEX 04
00001000=8 Dato HEX 08
00010000=16 Dato HEX 10
00100000=32 Dato HEX 20
01000000=64 Dato HEX 40
10000000=128 Dato HEX 80

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);

}
}

algo que resuelves asi

for (int i=0; i<8; i++){
	if (valor && (1<<i)) {
		ActivarRele(i+1);
	}
        else 
        	ApagarRele(i+1);
	}		
}

lo hice rápidamente espero este bien.

Aca lo tienes todo integrado.
No es mas que lo mismo que haces tu de forma SOLO mas elegante.

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;

      for (int i=0; i<8; i++){
          if (valor && (1<<i)) {
            ActivarRele(i+1);
          }
          else 
            ApagarRele(i+1);
          }   
      }

  }
}

Los valores presentados en formato Hexadecimal 0x10 = 16 en decimal y asi sucesivamente

10h = 16
20h = 32
40h = 64
80h = 128

asi que hablamos el mismo idioma
pero estoy viendo el programa si funciona como debe

Lindo ejercicio, ahora si va a funcionar , pq lo probé.
Tenía todo tipo de errores, mas que nada de interpretación del comando recibido

void setup() {
  Serial.begin(9600);
  for (int i=0; i<8; i++)   
      pinMode(i+2, OUTPUT);

}


void loop()
{
  char buffer[20];

  if (Serial.available() > 0)   {
                // read the incoming byte:
      byte valor = 1<<(Serial.read()-'1');
      //byte valorApagar= not valor;
      sprintf(buffer, "Valor = %d %x", valor, valor);
      Serial.println(buffer);

      for (int i=0; i<8; i++){
  
          //sprintf(buffer, "Dato = %d %0X %d", valor, 1<<i, 1<<i);
          //Serial.println(buffer);

          if (valor & (1<<i)) {
             ActivarRele(i+1);
             sprintf(buffer, "%d %d %s", valor, 1<<i, (valor & (1<<i))?"ON":"OFF");
             Serial.println(buffer);

          }
          else
            ApagarRele(i+1);
             
      }

  }
}

void ActivarRele(int puerto) {
  digitalWrite(puerto+1,HIGH); //para que arranque en el pin2 sumar 1
  Serial.print("Activo = ");
  Serial.println(puerto);
  
}

void ApagarRele(int puerto) {
  digitalWrite(puerto+1,LOW); //para que arranque en el pin2 sumar 1
  Serial.print("Desactivo = ");
  Serial.println(puerto);

}

Estimado subyte,
comentarte que no me funciona como debería.

Te explico otra vez la idea...
Por el RS232 recibo lo siguiente... por el software (Serialmon)

Hexadecimal

01
02
04
08
10
20
40
80
00

Entonces el proyecto es el siguiente...

Recibo 01 Activa pin Arduino 02
Recibo 00 desactiva pin Arduino 02

Recibo 02 Activa pin Arduino 03
Recibo 00 desactiva pin Arduino 03

Recibo 04 Activa pin Arduino 04
Recibo 00 desactiva pin Arduino 04

Recibo 08 Activa pin Arduino 05
Recibo 00 desactiva pin Arduino 05

Recibo 10 Activa pin Arduino 06
Recibo 00 desactiva pin Arduino 06

Recibo 20 Activa pin Arduino 07
Recibo 00 desactiva pin Arduino 07

Recibo 40 Activa pin Arduino 08
Recibo 00 desactiva pin Arduino 08

Recibo 80 Activa pin Arduino 09
Recibo 00 desactiva pin Arduino 09

Y ya desde cada pin conecto una placa de 8 relés y me conecta o desconecta su relé correspondiente.

Lo que yo te puse funciona. De la salida 2 a la salida 9. Prende 1 a 1 y apaga los demas que es lo que tu pretendías o explicaste que debía hacer.
Ahora como lo empleas con TU código no lo he visto.
Yo lo simulé y funciona por el puerto serie.
Yo te puse un sketch que funciona, como lo transferiste al tuyo no lo sé.
Sería bueno que copies y pegues tu código.

Adjunto mí código y la simulación.

Rele.zip (19.7 KB)

Hola amigo,
disculpa que he estado fuera por trabajo y no he podido probar y contestarte antes.

El código que me envías me da el siguiente error:

Arduino:1.6.4 (Windows 7), Placa:"Arduino Uno"

Opciones de compilación cambiadas, reconstruyendo todo

Rele.ino:2:20: fatal error: RTClib.h: No such file or directory
compilation terminated.
Error de compilación

This report would have more information with
"Show verbose output during compilation"
activala desde Archivo > Preferencias

Me parece que te envié algo que no era para ti.

Entonces el codigo que dices que has probado y funciona es este... Pregunto?

void setup() {
Serial.begin(9600);
for (int i=0; i<8; i++)
pinMode(i+2, OUTPUT);

}

void loop()
{
char buffer[20];

if (Serial.available() > 0) {
// read the incoming byte:
byte valor = 1<<(Serial.read()-'1');
//byte valorApagar= not valor;
sprintf(buffer, "Valor = %d %x", valor, valor);
Serial.println(buffer);

for (int i=0; i<8; i++){

//sprintf(buffer, "Dato = %d %0X %d", valor, 1<<i, 1<<i);
//Serial.println(buffer);

if (valor & (1<<i)) {
ActivarRele(i+1);
sprintf(buffer, "%d %d %s", valor, 1<<i, (valor & (1<<i))?"ON":"OFF");
Serial.println(buffer);

}
else
ApagarRele(i+1);

}

}
}

void ActivarRele(int puerto) {
digitalWrite(puerto+1,HIGH); //para que arranque en el pin2 sumar 1
Serial.print("Activo = ");
Serial.println(puerto);

}

void ApagarRele(int puerto) {
digitalWrite(puerto+1,LOW); //para que arranque en el pin2 sumar 1
Serial.print("Desactivo = ");
Serial.println(puerto);

}

Post 15 y sigues copiando y pegando sin usar tags?

Este código que te adjunto al pie de la página, funciona

Rele.zip (20.5 KB)

Me aparece este error con tu código...

Arduino:1.6.4 (Windows 7), Placa:"Arduino Uno"

Rele.ino:2:20: fatal error: RTClib.h: No such file or directory
compilation terminated.
Error de compilación

This report would have more information with
"Show verbose output during compilation"
activala desde Archivo > Preferencias

Hola:

Aquí dejo enlaces para que tengna algo de idea que estoy haciendo un tutorial sobre el puerto serie y controlar esas placas de relés.

Mirar en el post #2.
http://forum.arduino.cc/index.php?topic=315176.new#2

Saludos.