En este tutorial armaremos un sistema de encendido de luces dual, ya que podemos controlar el encendido y pagado mediante un control remoto por infrarrojos, y también por medio de 8 pulsadores. Usaremos un módulo relay de 8 canales, un arduino nano, un módulo receptor infrarrojos, un pcb fabricado en pcbway, y otros componentes electrónicos. Armaremos el circuito, analizaremos paso a paso el código fuente y finalmente probaremos todo el funcionamiento del sistema.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Materiales
Un Arduino nano
El Arduino Nano es una placa pequeña, completa y compatible con la placa de pruebas basada en el ATmega328 (Arduino Nano 3.x). Tiene más o menos la misma funcionalidad del Arduino Duemilanove, pero en un paquete diferente. Solo carece de un conector de alimentación de CC y funciona con un cable USB Mini-B en lugar de uno estándar.
Microcontrolador | ATmega328 |
Arquitectura | AVR |
Tensión de funcionamiento | 5 V |
Memoria flash | 32 KB de los cuales 2 KB utiliza el gestor de arranque |
SRAM | 2 KB |
Velocidad de reloj | 16 MHz |
Pines analógicos IN | 8 |
EEPROM | 1 KB |
Corriente CC por pines de E / S | 40 mA (pines de E / S) |
Voltaje de entrada | 7-12 V |
Pines de E / S digitales | 22 (6 de los cuales son PWM) |
Salida PWM | 6 |
El consumo de energía | 19 mA |
Tamaño de PCB | 18 x 45 mm |
Peso | 7 g |
Diagrama de pines
Pines hembra
Un zócalo para el arduino nano
Módulo relay de 8 canales
Características
Permite controlar el encendido/apagado de equipos de alta potencia (electrodomésticos). Funciona perfectamente con Arduino, Pic o cualquier otro sistema digital.
Dentro de la gran variedad de proyectos que podemos realizar con Arduino, podemos llegar a desear controlar componentes de alto voltaje o alto amperaje, como bombillas o bombas de agua, los cuales no pueden ser manejados directamente con Arduino. En estos casos es necesario utilizar Relays o Reles, estos dispositivos permiten controlar cargas de alto voltaje con una señal pequeña.
El modulo posee 8 Relays de alta calidad, capaces de manejar cargas de hasta 250V/10A. Cada canal posee aislamiento eléctrico por medio de un optoacoplador y un led indicador de estado. Su diseño facilita el trabajo con Arduino, al igual que con muchos otros sistemas como Raspberry Pi, ESP8266 (NodeMCU y Wemos), Teensy y Pic. Este modulo Relay activa la salida normalmente abierta (NO: Normally Open) al recibir un “0” lógico (0 Voltios) y desactiva la salida con un “1” lógico (5 voltios). Para la programación de Arduino y Relays se recomienda el uso de timers con la función “millis()” y de esa forma no utilizar la función “delay” que impide que el sistema continue trabajando mientras se activa/desactiva un relay.
Entre las cargas que se pueden manejar tenemos: bombillas de luz, luminarias, motores AC (220V), motores DC, solenoides, electroválvulas, calentadores de agua y una gran variedad de actuadores más. Se recomienda realizar y verificar las conexiones antes de alimentar el circuito, también es una buena práctica proteger el circuito dentro de un case.
Datos técnicos
8 canales independientes
8 Relevadores (Relays) de 1 polo 2 tiros
El voltaje de la bobina del relé es de 5 VDC
Led indicador para cada canal (enciende cuando la bobina del relé esta activa)
Activado mediante corriente: el circuito de control debe proveer una corriente de 15 a 20 mA
Puede controlado directamente por circuito lógicos
Terminales de conexión de tornillo (clemas)
Terminales de entrada de señal lógica con headers macho de 0.1″.
Puede controlado directamente por circuito lógicos
Alimentación y consumo
La forma mas sencilla de alimentar este módulo es desde Vcc y GND de la placa Arduino, manteniendo el Jumper en su lugar, con lo que JD-Vcc = Vcc. Esta conexión tiene dos limitaciones importantes:
Se pierde la aislación eléctrica que brindan los optoacopladores, lo que aumenta la posibilidad de daño al Arduino si hay algún problema con las cargas de los relés.
La corriente consumida por las bobinas de los relés debe ser provista por la placa Arduino. Cada bobina consume unos 90 mA y las cuatro juntas suman 360 mA. Si a esto le sumamos los consumos que pueden tener otras salidas, estamos muy cerca de los 500 mA que puede suministrar un puerto USB. En este caso se debería alimentar al Arduino con una fuente externa, lo que aumenta el limite de corriente a 1 A (en el caso de la Arduino UNO).
La forma mas segura es remover el jumper y alimentar la placa de relés con dos fuentes: la de la placa Arduino conectada a Vcc y una segunda fuente, con el positivo a JD-Vcc y el negativo a GND, sin estar éste unido a la placa Arduino. Esta conexión tiene como ventajas:
Hay completa aislación entre la carga y el Arduino.
Todo el consumo de los relés es tomado de la segunda fuente y no del Arduino o el puerto USB.
Entradas
Las entradas a la placa pueden conectarse directamente a las salidas digitales de la placa Arduino. La única precaución a tener en cuenta es que cuando Arduino arranca al ser alimentado, los pines se configuran como entradas automáticamente y puede ocurrir que, por un brevísimo lapso de tiempo entre el arranque y la correcta configuración de estos pines como salidas, las entradas de control al módulo de relé queden en un estado indeterminado. Esto se puede evitar conectando en cada entrada un pull-up con una resistencia de 10K a Vcc, lo que asegura un estado ALTO durante el arranque.
Pines macho
Módulo receptor infrarrojo ky-022
Tamaño: 6.4 * 7.4 * 5.1MM, ángulo de aceptación 90 °, voltaje de trabajo 2.7-5.5V.
Frecuencia 37.9KHZ, recibiendo la distancia 18 m.
Rechazo de luz diurna hasta 500LUX, capacidad de interferencia electromagnética, IC dedicado de infrarrojos incorporado.
Ampliamente utilizado: estéreo, TV, VCR, CD, decodificadores, marco de fotos digital, audio para el automóvil, juguetes de control remoto, receptores de satélite, disco duro, aire acondicionado, calefacción, ventiladores, iluminación y otros electrodomésticos.
Pinout:
1 …. GND (-)
2 …. + 5V
3 …. Salida (S)
Ocho pulsadores
Un pcb
Descargar –> Control de luces de 8 canales por infrarrojo
Código Fuente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
//Más proyectos en www.rogerbit.com #include <IRremote.h> #define RECV_PIN 2 //indicamos el pin por el que recibimos los datos del //sensor TSOP1838 IRrecv irrecv(RECV_PIN); decode_results results; int estadoBoton11 = 0; int estadoBoton12 = 0; int estadoBotonA5 = 0; int estadoBotonA0 = 0; int estadoBotonA1 = 0; int estadoBotonA2 = 0; int estadoBotonA3 = 0; int estadoBotonA4 = 0; int estado11 = 0; int estado12 = 0; int estadoA5 = 0; int estadoA0 = 0; int estadoA1 = 0; int estadoA2 = 0; int estadoA3 = 0; int estadoA4 = 0; //Pulsadores int botonPin11 =11; int botonPin12 =12; int botonPinA5 =A5; int botonPinA0 =A0; int botonPinA1 =A1; int botonPinA2 =A2; int botonPinA3 =A3; int botonPinA4 =A4; void setup() { Serial.begin(9600);//Velocidad del puerto //Definimos estos pines como salidas pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); //Ponemos en estado Alto todas las salidas digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); digitalWrite(9,HIGH); digitalWrite(10,HIGH); //Definimos estos pines como entrdas para los pulsadores pinMode(botonPin11, INPUT_PULLUP); pinMode(botonPin12, INPUT_PULLUP); pinMode(botonPinA5, INPUT_PULLUP); pinMode(botonPinA0, INPUT_PULLUP); pinMode(botonPinA1, INPUT_PULLUP); pinMode(botonPinA2, INPUT_PULLUP); pinMode(botonPinA3, INPUT_PULLUP); pinMode(botonPinA4, INPUT_PULLUP); irrecv.enableIRIn(); // Iniciamos la recepcion } void loop() { //Si tenemos datos de lectura debido a que se pulsa una tecla en el mando if (irrecv.decode(&results)) { //Mostramos por puerto serie dicho codigo en Hexadecimal(para depuracion) Serial.print("Codigo: 0x") ; Serial.println(results.value,HEX) ; //Pin 3 arduino IN1 en módulo relay de 8 canales if(results.value==0x2B||results.value==0x82B)//Apagado { digitalWrite(3,HIGH); estado11 = 0; } if(results.value==0x2A||results.value==0x82A)//Encendido { digitalWrite(3, LOW); estado11 = 1; } //Pin 4 arduino IN2 en módulo relay de 8 canales if(results.value==0x23||results.value==0x823)//Apagado { digitalWrite(4,HIGH); estado12 = 0; } if(results.value==0x27||results.value==0x827)//Encendido { digitalWrite(4, LOW); estado12 = 1; } //Pin 5 arduino IN3 en módulo relay de 8 canales if(results.value==0xB||results.value==0x80B)//Apagado { digitalWrite(5,HIGH); estadoA5 = 0; } if(results.value==0x3D||results.value==0x83D)//Encendido { digitalWrite(5,LOW); estadoA5 = 1; } //Pin 6 arduino IN4 en módulo relay de 8 canales if(results.value==0x30||results.value==0x830)//Apagado { digitalWrite(6,HIGH); estadoA0 = 0; } if(results.value==0x2F||results.value==0x82F)//Encendido { digitalWrite(6,LOW); estadoA0 = 1; } //Pin 7 arduino IN5 en módulo relay de 8 canales if(results.value==0x33||results.value==0x833)//Apagado { digitalWrite(7,HIGH); estadoA1 = 0; } if(results.value==0x31||results.value==0x831)//Encendido { digitalWrite(7,LOW); estadoA1 = 1; } //Pin 8 arduino IN6 en módulo relay de 8 canales if(results.value==0x21||results.value==0x821)//Apagado { digitalWrite(8,HIGH); estadoA2 = 0; } if(results.value==0x20||results.value==0x820)//Encendido { digitalWrite(8,LOW); estadoA2 = 1; } //Pin 9 arduino IN7 en módulo relay de 8 canales if(results.value==0x24||results.value==0x824)//Apagado { digitalWrite(9,HIGH); estadoA3 = 0; } if(results.value==0xE||results.value==0x80E)//Encendido { digitalWrite(9,LOW); estadoA3 = 1; } //Pin 10 arduino IN8 en módulo relay de 8 canales if(results.value==0x11||results.value==0x811)//Apagado { digitalWrite(10,HIGH); estadoA4 = 0; } if(results.value==0x10||results.value==0x810)//Encendido { digitalWrite(10,LOW); estadoA4 = 1; } irrecv.resume(); // Recibimos el siguiente valor del sensor } delay(100);//Retardo antirrebote para los pulsadores estadoBoton11 = digitalRead(botonPin11);//Leemos el pulsador para ver su estado estadoBoton12 = digitalRead(botonPin12);//Leemos el pulsador para ver su estado estadoBotonA5 = digitalRead(botonPinA5);//Leemos el pulsador para ver su estado estadoBotonA0 = digitalRead(botonPinA0);//Leemos el pulsador para ver su estado estadoBotonA1 = digitalRead(botonPinA1);//Leemos el pulsador para ver su estado estadoBotonA2 = digitalRead(botonPinA2);//Leemos el pulsador para ver su estado estadoBotonA3 = digitalRead(botonPinA3);//Leemos el pulsador para ver su estado estadoBotonA4 = digitalRead(botonPinA4);//Leemos el pulsador para ver su estado //Llama a una función if (estadoBoton11 == LOW) {//Si el pulsador está precionado se cumple esta condición luz11(); } //Llama a una función if (estadoBoton12 == LOW) {//Si el pulsador está precionado se cumple esta condición luz12(); } //Llama a una función if (estadoBotonA5 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA5(); } //Llama a una función if (estadoBotonA0 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA0(); } //Llama a una función if (estadoBotonA1 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA1(); } //Llama a una función if (estadoBotonA2 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA2(); } //Llama a una función if (estadoBotonA3 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA3(); } //Llama a una función if (estadoBotonA4 == LOW) {//Si el pulsador está precionado se cumple esta condición luzA4(); } } //Función para encender la luz con el botón void luz11(){ if(estado11 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(3, LOW);// Encendemos el relay estado11 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(3, HIGH);//Apagamos el relay estado11 = 0; } while(estadoBoton11 == LOW){ estadoBoton11 = digitalRead(11);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luz12(){ if(estado12 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(4, LOW);// Encendemos el relay estado12 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(4, HIGH);//Apagamos el relay estado12 = 0; } while(estadoBoton12 == LOW){ estadoBoton12 = digitalRead(12);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luzA5(){ if(estadoA5 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(5, LOW);// Encendemos el relay estadoA5 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(5, HIGH);//Apagamos el relay estadoA5 = 0; } while(estadoBotonA5 == LOW){ estadoBotonA5 = digitalRead(A5);//Se cumple esta condición mientras esté precionado el botón } } void luzA0(){ if(estadoA0 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(6, LOW);// Encendemos el relay estadoA0 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(6, HIGH);//Apagamos el relay estadoA0 = 0; } while(estadoBotonA0 == LOW){ estadoBotonA0 = digitalRead(A0);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luzA1(){ if(estadoA1 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(7, LOW);// Encendemos el relay estadoA1 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(7, HIGH);//Apagamos el relay estadoA1 = 0; } while(estadoBotonA1 == LOW){ estadoBotonA1 = digitalRead(A1);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luzA2(){ if(estadoA2 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(8, LOW);// Encendemos el relay estadoA2 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(8, HIGH);//Apagamos el relay estadoA2 = 0; } while(estadoBotonA2 == LOW){ estadoBotonA2 = digitalRead(A2);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luzA3(){ if(estadoA3 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(9, LOW);// Encendemos el relay estadoA3 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(9, HIGH);//Apagamos el relay estadoA3 = 0; } while(estadoBotonA3 == LOW){ estadoBotonA3 = digitalRead(A3);//Se cumple esta condición mientras esté precionado el botón } } //Función para encender la luz con el botón void luzA4(){ if(estadoA4 ==0){//Si la variable estado es igual a 0 se cumple esta condición digitalWrite(10, LOW);// Encendemos el relay estadoA4 = 1;//Asignamos el valor 1 a la variable "estado" } else{ digitalWrite(10, HIGH);//Apagamos el relay estadoA4 = 0; } while(estadoBotonA4 == LOW){ estadoBotonA4 = digitalRead(A4);//Se cumple esta condición mientras esté precionado el botón } } |
PROYECTO RECOMENDADO