Control Con Relés Por Interfaz Serie
Control Con Relés Por Interfaz Serie
Control Con Relés Por Interfaz Serie
En este ejemplo haremos un sistema de encendido lámparas y equipos eléctricos que funcionan
con voltaje de red, y los controlaremos con caracteres enviados por línea serie a través del
Monitor Serie del IDE de Arduino.
Para controlar artefactos con voltaje de red, usaremos las salidas normalmente abiertas de un
módulo de relé.
Advertencia de seguridad
Componentes
Esquemático
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
Criterio de control
En este primer experimento hemos elegido como comandos para encender y apagar las salidas
un conjunto de letras a enviar por línea serie. Para el relé 1 enviamos la letra “A” para
encender, y la letra “a” para apagar. El relé 2 se enciende con la letra “B” y se apaga con la “b”.
Y así sucesivamente para los 8 relés. Para apagar todo al mismo tiempo elegimos envíar un “0”
(cero).
Programa 1
Arduino
/* Control de 8 relay */
// definicion de nombres de salidas
int rele1 = 2;
int rele2 = 3;
int rele3 = 4;
int rele4 = 5;
int rele5 = 6;
int rele6 = 7;
int rele7 = 8;
int rele8 = 9;
void setup() {
// Pines de rele se definen como salidas
pinMode(rele1,OUTPUT);
pinMode(rele2,OUTPUT);
pinMode(rele3,OUTPUT);
pinMode(rele4,OUTPUT);
pinMode(rele5,OUTPUT);
pinMode(rele6,OUTPUT);
pinMode(rele7,OUTPUT);
pinMode(rele8,OUTPUT);
Serial.begin(9600);
}
void loop() {
/**************************************************************************/
while(Serial.available() == 0); // si llego un caracter por linea serie
char val = Serial.read(); // lee el caracter en una variable
/**************************************************************************/
break;
case 'E':
digitalWrite(rele5,LOW);
Serial.println("E - ACTIVAR RELAY 5");
break;
case 'e':
digitalWrite(rele5,HIGH);
Serial.println("e - APAGAR RELAY 5");
break;
case 'F':
digitalWrite(rele6,LOW);
Serial.println("F - ACTIVAR RELAY 6");
break;
case 'f':
digitalWrite(rele6,HIGH);
Serial.println("f - APAGAR RELAY 6");
break;
case 'G':
digitalWrite(rele7,LOW);
Serial.println("G - ACTIVAR RELAY 7");
break;
case 'g':
digitalWrite(rele7,HIGH);
Serial.println("g - APAGAR RELAY 7");
break;
case 'H':
digitalWrite(rele8,LOW);
Serial.println("H - ACTIVAR RELAY 8");
break;
case 'h':
digitalWrite(rele8,HIGH);
Serial.println("h - APAGAR RELAY 8");
break;
case '0':
digitalWrite(rele1,HIGH);
digitalWrite(rele2,HIGH);
digitalWrite(rele3,HIGH);
digitalWrite(rele4,HIGH);
digitalWrite(rele5,HIGH);
digitalWrite(rele6,HIGH);
digitalWrite(rele7,HIGH);
digitalWrite(rele8,HIGH);
Serial.println("TODOS APAGADOS");
break;
default:
break;
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
}
}
/* Control de 8 relay */
// definicion de nombres de salidas
int rele1 = 2;
int rele2 = 3;
int rele3 = 4;
int rele4 = 5;
int rele5 = 6;
int rele6 = 7;
int rele7 = 8;
int rele8 = 9;
void setup() {
// Pines de rele se definen como salidas
pinMode(rele1,OUTPUT);
pinMode(rele2,OUTPUT);
pinMode(rele3,OUTPUT);
pinMode(rele4,OUTPUT);
pinMode(rele5,OUTPUT);
pinMode(rele6,OUTPUT);
pinMode(rele7,OUTPUT);
pinMode(rele8,OUTPUT);
void loop() {
/**************************************************************************/
while(Serial.available() == 0); // si llego un caracter por linea serie
char val = Serial.read(); // lee el caracter en una variable
/**************************************************************************/
case 'E':
digitalWrite(rele5,LOW);
Serial.println("E - ACTIVAR RELAY 5");
break;
case 'e':
digitalWrite(rele5,HIGH);
Serial.println("e - APAGAR RELAY 5");
break;
case 'F':
digitalWrite(rele6,LOW);
Serial.println("F - ACTIVAR RELAY 6");
break;
case 'f':
digitalWrite(rele6,HIGH);
Serial.println("f - APAGAR RELAY 6");
break;
case 'G':
digitalWrite(rele7,LOW);
Serial.println("G - ACTIVAR RELAY 7");
break;
case 'g':
digitalWrite(rele7,HIGH);
Serial.println("g - APAGAR RELAY 7");
break;
case 'H':
digitalWrite(rele8,LOW);
Serial.println("H - ACTIVAR RELAY 8");
break;
case 'h':
digitalWrite(rele8,HIGH);
Serial.println("h - APAGAR RELAY 8");
break;
case '0':
digitalWrite(rele1,HIGH);
digitalWrite(rele2,HIGH);
digitalWrite(rele3,HIGH);
digitalWrite(rele4,HIGH);
digitalWrite(rele5,HIGH);
digitalWrite(rele6,HIGH);
digitalWrite(rele7,HIGH);
digitalWrite(rele8,HIGH);
Serial.println("TODOS APAGADOS");
break;
default:
break;
}
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
Colocamos entre dos hileras de asteriscos la parte del código donde se obtiene la letra de
comando desde la línea serie. Reemplazando ese bloquecito de código es posible utilizar
diversos métodos de ingreso de datos para comandar la placa de relés.
Por ejemplo utilizando caracteres llegados desde una placa bluetooth, por I2C o SPI desde otro
microcontrolador, un módulo de interfaz RS-485, o diversos sistemas basados en RF (Wi-Fi, 2,4
GHz, etc.) o enlaces de luz infrarroja, láser, etc.
En todos los casos, la comunicación de control se basará en caracteres de control ingresados por
TX/RX u otro medio similar de comunicación de caracteres, incluyendo una entrada paralela de
8 bits implementada por un puerto o con el uso de un chip auxiliar, y convertidos en una variable
char (cuando es necesario).
El resto del código será siempre el mismo, la función con la estructura Switch…Case.
Por supuesto, usted puede iniciar sus pruebas con un circuito más sencillo, como el que sigue:
Programa 2
En esta modificación de programa utilizamos una opción que nos permite usar una única letra
de comando para encender y apagar. El «truco» consiste en alternar el estado del relé de
encendido a apagado en cada recepción de la letra, utilizando una operación lógica NOT, que se
representa con el símbolo !
Criterio de control
Arduino
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
void setup() {
// Pines de rele se definen como salidas
pinMode(rele1,OUTPUT);
pinMode(rele2,OUTPUT);
pinMode(rele3,OUTPUT);
pinMode(rele4,OUTPUT);
pinMode(rele5,OUTPUT);
pinMode(rele6,OUTPUT);
pinMode(rele7,OUTPUT);
pinMode(rele8,OUTPUT);
void loop() {
/**************************************************************************/
while(Serial.available() == 0); // si llego un caracter por linea serie
char val = Serial.read(); // lee el caracter en una variable
/**************************************************************************/
void setup() {
// Pines de rele se definen como salidas
pinMode(rele1,OUTPUT);
pinMode(rele2,OUTPUT);
pinMode(rele3,OUTPUT);
pinMode(rele4,OUTPUT);
pinMode(rele5,OUTPUT);
pinMode(rele6,OUTPUT);
pinMode(rele7,OUTPUT);
pinMode(rele8,OUTPUT);
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
void loop() {
/**************************************************************************/
while(Serial.available() == 0); // si llego un caracter por linea serie
char val = Serial.read(); // lee el caracter en una variable
/**************************************************************************/
digitalWrite(rele3,valor);
if (valor == HIGH) Serial.println("RELE 3 apagado");
else Serial.println("RELE 3 activo");
break;
case 'd':
valor = !digitalRead(rele4);
digitalWrite(rele4,valor);
if (valor == HIGH) Serial.println("RELE 4 apagado");
else Serial.println("RELE 4 activo");
break;
case 'e':
valor = !digitalRead(rele5);
digitalWrite(rele5,valor);
if (valor == HIGH) Serial.println("RELE 5 apagado");
else Serial.println("RELE 5 activo");
break;
case 'f':
valor = !digitalRead(rele6);
digitalWrite(rele6,valor);
if (valor == HIGH) Serial.println("RELE 6 apagado");
else Serial.println("RELE 6 activo");
break;
case 'g':
valor = !digitalRead(rele7);
digitalWrite(rele7,valor);
if (valor == HIGH) Serial.println("RELE 7 apagado");
else Serial.println("RELE 7 activo");
break;
case 'h':
valor = !digitalRead(rele8);
digitalWrite(rele8,valor);
if (valor == HIGH) Serial.println("RELE 8 apagado");
else Serial.println("RELE 8 activo");
break;
case '0':
digitalWrite(rele1,HIGH);
digitalWrite(rele2,HIGH);
digitalWrite(rele3,HIGH);
digitalWrite(rele4,HIGH);
digitalWrite(rele5,HIGH);
digitalWrite(rele6,HIGH);
digitalWrite(rele7,HIGH);
digitalWrite(rele8,HIGH);
Serial.println("TODOS APAGADOS");
break;
default:
TEMA: ARDUINO
CICLO LECTIVO 2021
PROFESOR GERARDO DÍAZ
break;
}
}