bclose

Control de tu casa desde Internet

Controlando desde Internet hasta 10 pines digitales
tienda online prometec

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.


Version R3
Esta va a ser la primera vez que necesitamos un Arduino MEGA para una sesión
ProtoboardconexionesUna Protoboard más cables.
componenteUna resistencia de 330Ω.
componente 6 x LEDs
Shield Ethernet Un Shield Ethernet

 

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 Arduino, 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.
 

 

 

 

 

(84) Comments

    • Luis

    Buen día.

    Alguien me podría apoyar para hacer lo mismo pero con un modulo “Wifi Nodemcu Lua Esp8266 Arduino” lo he tratado pero no sé que estoy haciendo mal

  • Estimado. Sobre el sensor de temperatura, es mejor colocar un DHT11 (http://www.prometec.net/sensores-dht11/). Según el codigo al pin A1? El esquemático de conexión es el mismo de la página señalada()?.
    Saludos.

    • Hola Patricio. No hay problema en usar un DHT11. Y tampoco hay problema con que lo leas con el pin A1

    • 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.

    • Hola Jefferson! Perfecto, y si quieres puedes mandarnos tu proyecto para publicarlo en la página y que así pueda ser de utilidad a más gente, por supuesto respetando tu autoría. Un saludo, y estamos deseando verlo!

    • 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.

    • 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

        • 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??

        • 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?

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

        • En efecto, y para ello necesitas las claves de adminiistracion

  • 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.

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

    • 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

    • Jesus Pastor

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

    • 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

        • Jesús Pastor

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

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

    • 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

    • 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

  • Hola amigo admin he visto tu proyecto y me parece fabuloso al cual se le puede dar muchas utilidades pero me surge una idea a ver si es posible realizarla. Despues de lanzar el comando desde internet en cualqier punto del exterior seria posible que despues de conectarse el led o rele, el mismo arduino nos mandara un mensaje por ejemplo por email de confirmacion como que se ha activado el led o el rele.
    Tampoco tengo muy claro en cuanto al tema de seguridad de usa la VPN en el router de como se hace, me gustaria que me lo aclaras.
    Muchas gracias de antemano

    • 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

    • 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.

    • 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

    • Alexandro robusto

    yo leyendo el codigo y tratandolo de interpretar, logre hacer un boton, pero solo apaga el led si esta prendido por web, pero si esta apagado no lo prende…
    {
    outputStatus[0] = digitalRead(entrada7);
    if (outputStatus[0] == HIGH) {
    outp=1-outputStatus[0];
    }
    if(outp==1){
    digitalWrite(outputAddress[0], HIGH);
    }
    else {
    digitalWrite(outputAddress[0], LOW);
    }

    • Alexandro robusto

    se que esta publicación es muy vieja igual pregunto a ver si con su bondad usted o alguien de los que lee este foro me puede orientar. utilizo este sistema para prender un tablero electronico el cual me trabaja perfectamente, el problema es que quiero agregarle dos pulsadores fisicos para las primeras dos salidas. yo creo los dos botones con digitalread(entrada1) y digitalread(entrada2), lo que no se es hacer la instrucción para que cambie el estado de esas salidas 🙁 espero haberme explicado lo suficientemente bien y alguien pueda orientarme. seria de mucha ayuda para mi, gracias.

    • Hola Alex, lamento decirte que por mas que he intentado modificar el codigo de este ejemplo (Que no es nuestro) nunca mis escasos conocimientos de HTML5 y CSS han sido suficientes

  • Buen día, es posible cambiar los parametros, IP Gateway Subnet, Dns y Puerto desde una pagina web alojada en el mismo Arduino UNO.

    Saludos.

    • Uhhhm… Si. Seguro y parece un programa atractivo. Hacer una pagina que liste esos valores para poderlos cambiar desde una pagina web. Pero para ello habria que pactar una direccion estandard en la que ir a buscar la pagina, pero no deberia haber mayor problema

    • Juanjo García

    Hola, mi pregunta es como usar esas hojas de estilos para darle a nuestro servidor web una interfaz de ese tipo y si hay otras herramientas, si es por librerías o de otra forma, la verdad que en ese sentido ando algo más perdido. Muchas gracias de antemano

    • Hola Juanjo, me temo que mi especialidad no son las paginas web precisamente. Quizas algun otro lector este mejor posicionado que yo para responderte

    • Hola Juanjo.

      Tampoco es que yo sepa mucho de HTML, pero para realizar una página web a tu medida y guardarla en Arduino para que te la muestre cuando accedas a él, pues simplemente empieza por aprender algo básico de lenguaje HTML. Tutoriales en Internet hay a patadas. Con 10 instrucciones te puedes hacer una página muy curiosa, con botones, recuadros, displays, etc. Es ponerse un poco y practicar. Para páginas sencillas y sin muchos adornos, con poco que practiques te va a resultar fácil.

      Saludos.

  • algo similar a esto pero usando arduino uno, ademas que en el html se actualice de forma automatica el estado de la salida, si esta en ON o OFF, y que tambien se usen los interruptores normales de las viviendas….

    Saludos y agradecido de los post..

    • Lourdes

    Buenas tardes me podrían ayudar yo tengo un servidor en arduino y sólo puedo verlo localmente ya configure el router y use la ip pública pero no se carga que podría hacer lo hice con un virtual server

    • Hola Lourdes, si puedes ver tu servidor desde tu red local , pero no loves desde el exterior, es un problema de configuracion del router.

      Tiene que configurar en el router lo que se llama port mapping y la idea es que definas en el router una tabla donde dices que lo venga por el puerto 80 desde el exterior se redireccione a la ip de tu arduino en el interior

  • Hola ! Que tal ?, una consultilla… se pueden ingresar datos desde internet al arduino. Me refiero a datos como el poder cambiar de valor las variables que posee el codigo como: Temperatura minima, t maxima, cambiar hora, etc. Se puede realizar con el arduino mega y el ethernet shield ?, si es asi por donde parto para aprender como se hace ?. De ante mano muchas gracias y saludos !

    • Hola Samuel,

      Echa una ojeada a los tutos sobre el ethernet shield http://www.prometec.net/etherindex/

      Creo que encontraras mas de una idea, y el concepto podria ser que montes un servidor web en tu arduino y le envies ordenes como TMAX=30 de donde podrias sacar la orden y el valor y programar las acciones acordes

  • buena me podrias ayudar con la tarjeta de ethernet (Han Run HR911105A 12/23) sinceramente tengo problemas al configurarlo no encuentro la libreria y ademas tengo un Arduino MEGA 2560

    • Me temo, Geovanny que no conozco esa tarjeta

    • Diego

    porfavor ayudame a encender un led con un botón en esta misma programación y que simplemente me diga si esta encendido o no la web, lo he intentado y solo logro confundirme mas, gracias. y lo del sensor de temperatura no logre colocarlo… la temperatura parece aleatoria

    • Hola diego, exactamente este mismo programa te indica en la aplicaion de movil cuando un boton esta activado o no, y en cuanto al sensor de temperatura ¿Cual estas usando?

  • Buenos dias Admin. Estoy tratando de volcar el codigo que utilizan en este proyecto, a una placa NodeMCU ESP8266 V1 devkit, cuya programacion se ejecute con el IDE de arduino, por lo que muchas ordenes seran compatibles. el problema que he encontrado es con las librerias utilizadas y los comando que habilitan cada una de ellas, (ethernet.h). En el nodeMCU tengo para el IDE arduino las librerias y que tengo entendido me permiten hacer lo que hace pero con sus propios comandos.
    Por el numero de pines a utilizar no me preocupo ya que solo manejare 5 módulos con mi placa.

    ¿Sabes de alguna pagina que haga una comparativa de comandos entre librerías de arduino y del ESP8266 V1 devkit?

    La compatibilidad de la interfaz que logran en este proyecto es muy prolija tanto para PC como para teléfono. He utilizado otros ejemplos pero al utilizarlo desde la pantalla del teléfono son muy pequeños o no tienen las funciones que tiene este codigo.
    Lastimosamente mi manejo de HTML o CSS o lenguajes de programación es cero y lo que suelo hacer aprovechando la información que hay en internet es amoldar esta, a mis necesidades y observar que hace cierto codigo para adaptarlo a nuevas acciones, pero estos lenguajes son tan amplios que cualquier mínimo error no permite mostrar la información correctamente.

Give a Reply

WordPress Anti-Spam by WP-SpamShield