bclose

Control de tu casa desde Internet

Controlando desde Internet hasta 10 pines digitales

Objetivos

 

 
    • Montar un circuito con un 6 LEDs y un Shield Ethernet.
    • Crear un servidor Web.
    • Presentar un programa de Internet, ideal para monitorizar y controlar remotamente tu casa.
    • Ver como configurar y adaptar este programa a nuestras necesidades.
 

Material requerido.

 

  Tienda España Tienda Mexico
Vista lateral  Arduino MEGA Arduino UNO R3
Vista principal Un Ethernet shield R3 Un Ethernet shield R3
rojo verde amarillo Unos LEDs Unos LEDs
placa de pruebas Una protoboard Una protoboard
male to male Unos cables macho-macho Unos cables macho-macho

 

Un caso práctico

 

En las últimas sesiones, hemos ido viendo los conceptos básicos de las Redes Ethernet y del protocolo TCPIP. También hemos probado un esquema básico de programa que podemos usar como esqueleto para nuestros propios proyectos.

Hemos intentado mantener los Sketches de Arduino y los snippets de código y los programas de gestión, a un mínimo de complicación, para facilitar la comprensión de los ejemplos y animaros a que los uséis como base para vuestros desarrollos.

En esta sesión, nos vamos a olvidar por un momento de la sencillez obligada para presentaros un proyecto que hace tiempo tenía ganas de traer a estas páginas, pero que requería antes de una cierta base al respecto, y que además confió en que os sea útil en algún momento.

Es un proyecto que vi en Instructables (página que por cierto os recomiendo, si leéis en inglés) y que me impresionó. Básicamente es un sistema de gestión desde internet o la red local de las salidas digitales de Arduino, con un interface gráfico espectacular, desarrollado directamente en HTML5 y CSS.

Comprender el código no es sencillo porque implica conocimiento importante de HTML y CSS, pero en realidad tampoco es demasiado importante, porque basta con utilizar la parte HTML como armazón y modificar, si lo necesitamos, la parte de Arduino.

EL proyecto original del autor Claudio Vella, consistía en desarrollar un servidor web sobre Arduino que le permitiera controlar de una forma elegante los pines digitales y gobernar diferentes controles de su casa, desde la calefacción al riego, o diferentes luces de casa, sin levantarse del sillón. Después algunos otros han construido sobre el programa original y el resultado creo que hablara por sí mismo.

Pero debéis saber que las mejoras graficas conllevan un coste, el programa no puede cargarse en un Arduino UNO por falta de memoria y este va a ser el primer ejemplo en Prometec en que vamos a utilizar un MEGA.

Creo que la dificultad del programa HTML (Que insisto puede ignorarse y utilizarlo como una librería) y la necesidad de usar un MEGA compensan el resultado.

Además, al utilizar código HTML5 para dibujar los controles, nos permite acceder desde el navegador del móvil y efectuar el control, tanto desde casa como desde el exterior, si previamente configuramos el Port Forwarding en el Router.

Debo añadir además, que no pretendo atribuirnos ningún mérito en el desarrollo de este programa, y que nuestra única función es la de presentároslo, pero todo el mérito corresponde a los autores y no a Pormetec.net

En cualquier caso, vosotros juzgareis si el esfuerzo ha merecido la pena.

 

Diagrama de conexión

 

Vamos a montar un circuito muy sencillo con múltiples LEDs, 6 en mi caso, pero el programa permite gobernar hasta 10 pines digitales.

 
  • Hay una razón técnica profunda, para elegir exactamente 6 LEDS: No tengo más, pero el programa acepta hasta 10 entradas.
 

Haremos un montaje con una única resistencia de 330Ω entre GND y el negativo de todos los LEDs y conectaremos los positivos de los LEDS a pines digitales.

El diagrama incluye el Arduino MEGA y encima de el está un Shield Ethernet.

Esquema de protoboard

 

El programa de control

 

El objetivo del programa es montar un servidor web en el Arduino Mega, que nos presente esta pantalla, preferiblemente en nuestro teléfono móvil (Aunque naturalmente, también funciona con el navegador):

Control remoto de Arduino por ethernet

Cuando tocas cualquiera de los botones la luz correspondiente se enciende e el display y levanta el pin correspondiente de Arduino, y puede apagarse con el botón de OFF.

El sistema gestiona correctamente la gestión de los múltiples  pines y hasta guarda en la EEPROM, por si se va la luz, es capaz de recordar que controles tenia activados.

Por supuesto, Podéis cambiar todas la etiquetas de nombres y adaptarlas a vuestras necesidades.

Podéis encontrar el proyecto original aquí :  Ethernet Switching – with Arduino . Pero os pongo aquí un enlace para descargar el programa directamente: WebServerSwitching V04.06

La última versión disponible es la 4.06, que incorpora unas cuantas mejoras muy interesantes:

 
  • Fijar un refresco de datos.
  • Encender o apagar las salidas en el arranque, sin intervención manual.
  • Leer la temperatura y mostrarla.
  • Guardar y recuperar datos de la EEPROM. 

 

No tendría mucho sentido reproducir  aquí, el programa completo, dada su complejidad. Pero si me parece interesante comentar algunas líneas.

Lo primero es que carga las librerías SPI y Ethernet para el Shield y además la librería EEPROM

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

Después configura manualmente el TCPIP (No nos interesa el DHCP para saber a ciencia cierta que IP se nos asigna)

byte ip[] = {   192, 168, 1, 217 }; 
byte gateway[] = {   192, 168, 1, 254 }; 
byte subnet[] = {   255, 255, 255, 0 };

Si vais a acceder desde internet, lo lógico sería establecer una VPN. Si no sabéis lo que es, no tiene mayor importancia ahora mismo, pero sí que es imprescindible que cambies la dirección IP, a una diferente, para no dar demasiadas facilidades al enemigo (Si, los administradores de red tendemos a ser paranoicos).

Vamos con otro tema importante. Dependiendo del modelo que vayáis a usar, conviene definir un array con los pines que os interesa controlar.

int outputAddress[10] = { 3,5,6,7,8,9,14,15,16,17};
 
  • Recordad que el MEGA usa los pines 10, 50, 51, 52 y 53 para el Shield Ethernet y por tanto, no se pueden usar. Dependiendo del modelo que uséis, tenéis que comprobar que pines están disponibles.
  • El pin 4 se usa para leer la tarjeta microSD y es mejor que no lo utilicéis, o veréis cosas raras.
  • El pin 2 se usa para interrupciones, así que mejor ni tocar.
 

Otra línea importante. Escribid los rótulos que queréis mostrar en el display:

String buttonText[10] = {  "01. Right Lamp","02. Left Lamp","03. Bedroom","04.  Kitchen",
"05. Water Heater","06. Gate","07. Toilet","08. Main Heater","09. Roof Light","10. Basement"};

Mas configuraciones, Indica en que pines quieres retener la configuración si la luz se va, o sea que los vuelves a dejar en el estado previo al corte:

int retainOutputStatus[10] = {1,0,0,0,1,1,1,1,1,1};
 
  • 1- Conservat status.
  • 0 – Ir a OFF al reiniciar.
 

Echadle una ojeada al programa. Es largo, pero no hay nada que no podáis entender, excepto, quizás el código HTML que imprime con client.print, lo mismo que hemos visto en las sesiones previas.

Aquí os pongo un mini video del proceso:

 

Mejorando el proyecto

 

En el video anterior hemos visto el aspecto del programa y como manejaba una colección de LEDs en una protoboard. Naturalmente, confío en que encontrareis aplicaciones más útiles para este programa que encender luces. Y para ello vamos a necesitar algo que gobierne cargas de corriente superiores.

Para ello bastaría con conectar un Shield de Relés adicional o una línea externa de relés, del tipo que os muestro en las imágenes anexas.

SHield de reles Arduino
Tira de 8 reles

Tanto el Shield con 4 Relés, como la barra con 8 relés, son relativamente fáciles de encontrar, y te permiten conmutar,por muy poco dinero,  hasta 250V con 10Amperios, lo que no está mal y es más que suficiente para conmutar casi lo que se os ocurra a nivel doméstico.

En el caso del Shield de 4 reles no necesitaria, ni siquiera una protoboard o circuito impreso adicional, ya que se puede montar encima del MEGA y del Ethernet Shield, aunque habria que comprobar que no se maten entre ellos por cuestion de pines.

Si fuera asi, existem tiras de reles, de 2, 4, y 8 unidades, lo que os permitirían configurar bastante bien casi cualquier necesidad.

 

Resumen de la sesión

 

 

    • Hemos presentado el proyecto Ethernet switching, que es excepcional para domotizar vuestra casa.
    • Utiliza un programa basado en HTML5 y una hoja de estilos, para presentar unos controlos, estéticamente agradables.
    • Veréis que es muy sencillo de configurar con nuestras preferencias y nos va a permitir gobernar controles y equipos domesticos desde el exterior.
    • Recordad, que si queremos entrar desde el exterior, tenemos que configurar el port Forwarding.
 

 

 

 

 

All-foam mattresses are usually the lightest queen size models, weighing in around 60-80 pounds. The WinkBed’s price-points put the mattresses on par with the average hybrid model. The foam is less dense than traditional memory foam and quick to disperse body heat mattressella. Sleep accessories must be added to the same transaction as the qualifying mattress purchase.

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(99) Comments

  • Avatar for Charly
    • Jefferson

    Hola admin. E implementado el sistema domotico en mi casa y funciona de maravilla ya lo tengo usando 5 meses y todo va a la pefeccion. Le e implentado algunas protecciones. A lo que tenga un poco mas de tiempo les subire un video de como quedo y funciona.

  • Avatar for Charly
    • Jesús Pastor

    Gracias, perdón por tardar en contestar, pero he estado desconectado una temporada.

  • Avatar for Charly
    • Admin

    Hola Pablo, siempre tienes que configurar el port forwarding en el router de acceso a tu casa, porque es el que recibira la peticion desde internet ¿Vale?

  • Avatar for Charly
    • Admin

    En efecto, y para ello necesitas las claves de adminiistracion

  • Avatar for Charly

    Muchas Gracias!! debo configurar en el router-modem en mi router inalambrico?

  • Avatar for Charly
    • Pablo

    Muchas Gracias por la respuesta! deberas entendi, vamos a hacerlo a la practica a ver que tal nos va… tambien queria preguntarte, que si el port Forwarding se configura en el modem-router o en mi router inalambrico??

  • Avatar for Charly
    • Admin

    Hola Pablo,

    Aunque programar un port forwarding es muy sencillo la forma concreta de hacerlo depende del modelo de router que tengas y en muchas ocasiones ni siquiera tienes acceso de administrador al mismo por lo que no es posible dar mas que una norma general.

    La idea basica es que tu puedes tener internamente en tu red wifi o ethernet digamos 5 equipos, cada uno con su direccion IP unica. Desde dentro de la red basta con que pongas la direccion IP que corresponde para buscar el servidor web interno. Hasta aqui todo bien, ¿pero que ocurre cuando vienes desde internet de fuera de tu red interna?

    La primera idea seria identificar tu ip publica en internet y llamar a esa direccion que tus 5 equipos comparten, esto es facil. El problema es que cuando tu router oye la llamada no sabe a cual de los 5 pcs internos debe dirigir la llamada.

    Para saber a cual de ellos debe redirigir ese trafico que viene de internet debes informarle de que lo venga por un puerto dado(el 80 si es un server web) debe ser redirigido a tal direccion IP interna . Es el puerto por el que llama lo que identifica el router a donde lo mandas internamente y por eso se llama port forwarding (Reenvio de puerto)

    En cada router se llama de un modo que puede ser port forwarding o NAT (Aunque esto es otra cosa)o de otraas mil maneras pero siempre es una tabla que dice tal numero de puerto (80) va a tal IP interna (En la que tienes montado tu server web)

    Espero que te sirva

  • Avatar for Charly
    • Pablo Sulecio

    Hola Admin, en tu log en la parte de resumen , dices esto: «»Recordad, que si queremos entrar desde el exterior, tenemos que configurar el port Forwarding»»

    He logrado correr el programa del arduino pero entrando desde adentro; pero estoy frustrado al no poder entrar desde afuera, soy bastante ignorante en tema de redes y configuracion de routers etc etc… Agradeceria montones si nos pudieras instruir paso a paso como lograr esto, tengo un moden-router al cual le entra la senhal de telefono y de ahi agarro para conectarlo a un router inalambrico. ?que debo configurar? el moden o rl router inalambrico, y uqe debo hacer…
    Muchas gracias de antemano.

  • Avatar for Charly
    • Admin

    Caramba si que es un problema extraño. A mi me cargo sin problemas

    Podria ocurrir que a medida que cambia la version del IDE puede ocurrir que cargue mas y por eso haya problemas con el codigo. Prueba a instalar un ide mas antiguo a ver que pasa

  • Avatar for Charly
    • Ivan

    Hola Pedro, ¿es posible que tengas seleccionada la placa Arduino UNO en el IDE en vez de la MEGA? Un saludo.

  • Avatar for Charly

    Hola Admin, he intentado cargar el programa en mi MEGA2560 y me aparece un error de falta de memoria, a que puede ser debido?

    Sketch uses 24.450 bytes (75%) of program storage space. Maximum is 32.256 bytes.
    Global variables use 5.039 bytes (246%) of dynamic memory, leaving -2.991 bytes for local variables. Maximum is 2.048 bytes.
    processing.app.debug.RunnerException: No hay suficiente memoria, ver http://www.arduino.cc/en/Guide/Troubleshooting#size para obtener consejos sobre cómo reducir su huella.
    at processing.app.debug.Compiler.size(Compiler.java:329)
    at processing.app.debug.Compiler.build(Compiler.java:117)
    at processing.app.Sketch.build(Sketch.java:1169)
    at processing.app.Sketch.exportApplet(Sketch.java:1187)
    at processing.app.Sketch.exportApplet(Sketch.java:1173)
    at processing.app.Editor$DefaultExportHandler.run(Editor.java:2466)
    at java.lang.Thread.run(Thread.java:745)
    No hay suficiente memoria, ver http://www.arduino.cc/en/Guide/Troubleshooting#size para obtener consejos sobre cómo reducir su huella.

  • Avatar for Charly
    • Admin

    Hola Jesus,

    Como eres nuevo el sistema pone tus comentarios en moderacion y te los tengo que aprobar. COnfio en que en el futuro te los acepte sin mas

  • Avatar for Charly
    • Jesus Pastor

    Hola, ¿alguien lee esto? he posteado pero no veo mi mensaje

  • Avatar for Charly
    • Jesús Pastor

    Buenas noches a todos! Por fín me ha llegado mi Mega y estoy trasteando, pero, no consigo adaptar el circuito a un sensol de temperatura LM35. En ejercicios anteriores he conseguido que me marque temperaturas correctas, pero en este, no consigo dar con las variables que he de modificar. ¿Alguien puede arrojarme algo de luz?

    Supongo que la cosa ha de estar entre estas lineas… pero noconsigo dar con el qué…

    //Read Temperature Sensor
    tempInValue = analogRead(tempInPin);

    // Connecting a 10K3 Thermistor to the Arduino Input
    // +5V �—————————[10Kohms]—————————[Thermistor]——� 0V
    // To Arduino IP �———————————|
    tempScaleOutValue = map(tempInValue, 0, 1023, 1023, 0); //Arduino value and NTC of the 10K3 Thermistor
    tempOutValue = map(tempScaleOutValue, 130, 870, -170, 730); //range of Arduino Value compared with Temperature
    tempOutValue = tempOutValue -45; //Adjustments
    tempOutDeg = tempOutValue / 10.0;

  • Avatar for Charly
    • Admin

    Hola Marco el programa se carga en el arduino Mega, ya que el shield es un añadido que se maneja desde el propio mega

  • Avatar for Charly
    • Marco

    Hola amigo quería saber cual programa se CARGA al Arduino MEGA 2560 y cual se carga al Arduino Ethernet Shield
    por favor ya que soy principiante agradecería mucho tu colaboración

  • Avatar for Charly
    • Claudio Aguilera

    Hola RJ. Mira el link de ipify.org y ahí tienes como acceder con distintos lenguajes. Yo he realizado una librerìa, pero debo pulirla para que sea fiable.
    Cualquier duda mail: aguilera@plantel.com.ar.

    Saludos
    Claduio

  • Avatar for Charly
    • Chujalt

    Saludos…. el código sale mal y le faltan trozos…. se ve que habrá algún filtro anti scripting y no muestra el código de manera correcta. si te interesa ya buscaremos el modo de que lo puedas visualizar bien.

    saludos

  • Avatar for Charly
    • Chujalt

    Saludos.

    No hace falta que te envíe un e-mail, la página web te puede decir si el led, o relé, está encendido o apagado.

    Partimos de la base de que Arduino tiene que «fabricar» una página web, entonces hay dos maneras de hacerlo.

    Si lo que visualizas en el navegador es la página web fabricada por Arduino, en el código de ésta deberás poner un condicional, por ejemplo

    if (digitalRead(ledPin) == HIGH) {
    Aquí código html que informa que el led está encendido
    }
    else {
    Aquí código html que informa que el led está apagado
    }

    Si la página web que ves está en tu servidor, en la página web de Arduino deberás poner un tag html de un div con una id, por ejemplo id=»led» y dentro de este div el valor del pin (si está HIGH o LOW) . En la página web del servidor te hará falta un poco de php

    loadHtml($contenidos);
    $contenido = explode(«\n», trim($doc->getElementById(‘led’)->nodeValue))[0];
    if ($contenido == HIGH)
    {
    Aquí código a mostrar que el led está encendido
    }
    else
    {
    Aquí código a mostrar que el led está apagado
    }
    ?>

    También al principio de la página deberás poner un header para que la página se refresque cada 5 segundos (o el tiempo que tu quieras)

    Espero que te sirva de ayuda, saludos.

  • Avatar for Charly
    • Admin

    Hola Verde,

    Me alegro que te guste este ejemplo. Lamento decirte que este ejemplo lo sacamos de internet (EN la pagina hay una referencia al lugar original) y lnosotros no estamos demasiado fuertes en HTML5 por lo que no hemos tenido mucho exito modificandolo, y solo pretendiamos mostrar un ejemplo de lo que se puede hacer. En esa pagina llevan un tiempo hablando de como securizar el accesso y de algunas otras modificacones iteresantes

    Arduino no se lleva muy bien con el email porque suele suponer una carga mayor de lo que puede soportar, aunque hace tiempo que no reviso el tema en internet

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login