Capturando datos en MySQL usando Apache, php, Arduino + Ethernet Shield

Este artículo pretende ser un ejemplo de como utilizar la tarjeta Ethernet Shield para Arduino.

Como la mejor forma de aprender es haciendo las cosas, abordaremos un ejemplo que captura datos, en este caso temperatura y los envía a un servidor conectado a Internet (pero puede ser un servidor local si se desea) el cual tomará esos datos y los guardará en una base de datos.

Materiales

  • Arduino Uno Release 3
  • Ehternet Shield
  • Sensor LM35
  • Servidor web Apache
  • Lenguaje de programación php
  • Servidor de base de datos MySQL

1. Arduino y Ethernet Shield

En la primera parte de este proyecto nos concentraremos en hacer funcionar el Arduino con la Ethernet Shield, esta shield como su nombre lo dice es una interfaz ethernet que permite conectar el Arduino a nuestra red local o internet.

Antes de ensamblar la shield con el Arduino se debe anotar la dirección MAC que la mayoría de las veces está en un papel adherido a la parte inferior de la shield, esta dirección MAC es única para cada shield (y para cada tarjeta de red de cualquier dispositivo) y se usará después para programar la shield.

arduino_ethernet_shield_x_abajo

Con la shield ensamblada se conecta el Arduino con el cable usb al computador para programarlo.

Usaremos el siguiente sketch (Ver repositorio en GitHub)

// InternetDeLasCosas.cl
// Script que obtiene la temperatura desde un sensor LM35 
// y la envia a un servidor web
//
// Escrito por @joniuz

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

// Mac unica de cada EthernetShield (deben cambiarla)
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xD7 };

// Descomentar esta linea si se desea un IP fijo
//IPAddress ip(172,17,17,200);

// Descomentar esta linea para asignar un DNS fijo
//IPAddress myDns(172,17,17,1);

// Inicializa la instancia client
EthernetClient client;

// Direccion del servidor
char server[] = "www.iot.cl";

// Variable de tiempo de la ultima conexion en milisegundos
unsigned long ultimaConexion = 0;          
// Estado de la ultima conexion
boolean ultimoEstado = false;
// Intervalo en milisegundos entre conexiones
const unsigned long intervaloConexion = 10000;   

// Datos del sensor
float tempC; // Temperatura en celsius
int LM35 = 0; // Pin A0 del Arduino

void setup() {
  // Inicializa puerto serial
  Serial.begin(9600);
  Serial.println("#### Internetdelascosas.cl ####");
  Serial.println("Sensor de temperatura LM35/ web");
  // Espera 1 segundo para que se inicie la tarjeta Ethernet
  delay(1000);
  // Si deseas usar un ip fijo y un DNS fijo descomentar esta linea y comentar la linea 39
  // Ethernet.begin(mac, ip, myDns);
  // Inicializa la tarjeta ethernet mediante DHCP
  Ethernet.begin(mac);
  // Imprime la direccion IP de la tarjeta
  Serial.print("Direccion IP: ");
  Serial.println(Ethernet.localIP());
}
// Loop principal
void loop() {
  // Lee la temperatura desde el sensor
  tempC = analogRead(LM35);
  // Convierte el valor leido a temperatura
  tempC = (5.0 * tempC * 100.0)/1024.0; 
  
  // Si hay datos que llegan por la conexion los envia a la puerta serial
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // Si no hay conexion de red y se conecto correctamente la ultima vez
  // detiene el cliente Ehternet
  if (!client.connected() && ultimoEstado) {
    Serial.println();
    Serial.println("Desconectando...");
    client.stop();
  }

  // Si no esta conectado y han pasado X segundos (intervaloConexion) 
  // despues de la ultima conexion envia datos al servidor
  if(!client.connected() && (millis() - ultimaConexion > intervaloConexion)) {
    httpRequest();
  }
  // Actualiza la variable ultimoEstado 
  ultimoEstado = client.connected();
}
// Fin del loop principal

// Realiza la conexion http al servidor
void httpRequest() {
  // Se conecta al servidor en el puerto 80 (web)
  if (client.connect(server, 80)) {
    // Envia el dato al puerto serial 
    Serial.print("Sensor LM35: "); 
    Serial.print(tempC); 
    Serial.println(" grados Celsius");
    // Envia el requerimiento al servidor via GET
    Serial.println("Iniciando conexion...");
    client.print("GET /sensorarduino.php?id=joniuz&nombre=temperatura&valor=");
    client.print(tempC);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("User-Agent: Arduino-Ethernet");
    client.println("Connection: close");
    client.println();

    // Actualiza el tiempo en milisegundos de la ultima conexion
    ultimaConexion = millis();
  } 
  else {
    // Si la conexion fallo se desconecta
    Serial.println("Error al conectarse al servidor");
    Serial.println("Desconectando...");
    client.stop();
  }
}

Los puntos importantes donde hay que poner atención son:

byte mac[]: Dirección MAC de tu ethernet shield (la que anotamos anteriormente) esta es única para cada shield por lo que deben cambiarla.

char server[]: nombre del servidor web que recibirá los datos.

IPAddress ip(172,17,17,200);IPAddress myDns(172,17,17,1); : aunque estan comentadas se pueden des comentar y utilizar para asignar direcciones fijas al Arduino y al servidor DNS (normalmente el router que te da acceso a Internet). Poner atención en que las direcciones IP están separadas por comas «,» y no por puntos «.».

El servidor puede ser local (como en este caso) o directamente un servidor en Internet, el Arduino usará la red local para llegar al servidor Internet. Este sketch usa resolución de nombres accediendo al DNS que obtiene al solicitar IP en la red local utilizando el protocolo DHCP.

Si se usa un servidor local lo mas probable es que no tengas un nombre asignado a el por lo que debes descomentar las lineas IPAddres y colocar una IP fija al Arduino, tambien debes cambiar la llamada al inicializar la tarjeta etherne por…

La llamada al servidor web se realiza usando GET al script php «sensorarduino.php» (que se verá mas adelante) y pasando en la URL los valores de las variables:

id: identificador del Arduino (en este caso utilizo mi nick joniuz para saber que Arduino se esta conectando)

nombre: nombre de la variable (en este caso temperatura)

valor: valor de la variable, el que se obtienen concatenando el string con el valor interno de la variable.

Recordar que para realizar una llamada GET es necesario colocar las variables después del nombre del script utilizando el caracter «?», luego cada variable se separa por el caracter «&». No se permiten espacios en blanco.

La forma de conectar el sensor LM35 lo vimos en el artículo Midiendo temperatura con Arduino y LM35, se debe alimentar con +5V el Pin 1, el Pin 2 se debe conectar al la puerta analoga 0 del Arduino y el Pin 3 a Ground.

ArduinoLM35_bb

Para cargar el sketch, compilarlo y ejecutarlo en el Arduino pueden revisar el artículo Hola Mundo version Arduino donde explicamos el proceso con «pantallitas».

Para validar que esta funcionando, se puede monitorear la interfaz serial del Arduino y debería verse algo como esto:

 #### Internetdelascosas.cl ####
Sensor de temperatura LM35/ web
Direccion IP: 172.17.17.108
Sensor LM35: 18.55 grados Celsius
Iniciando conexion...
HTTP/1.1 200 OK
Date: Wed, 09 Jul 2014 12:47:13 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Con estos pasos ya deberíamos tener nuestro sensor funcionando y conectado a la red.

2. Servidor Apache – MySQL – PHP

Daremos por conocido que el servidor Apache – MySQL – PHP fue instalado y esta operando correctamente y que se dispone de una cuenta en MySQL con permisos de acceso para escritura. En Ubuntu es bien sencillo instalar todos estos paquetes utilizando Synaptic y esta bien documentado como hacerlo, solo deben buscar en Google.

Para guardar los datos enviados por el Arduino utilizaremos la tabla «variable» la cual se puede crear utilizando el siguiente script sql y algún administrador de base de datos o directamente sobre el interprete de comandos de MySQL (copiar y pegar).

CREATE TABLE IF NOT EXISTS `variable` (
  `fecha` datetime NOT NULL,
  `id` varchar(30) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `valor` float NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

El script php encargado de procesar las llamadas GET desde el arduino se llama «sensorarduino.php» y se debe colocar en la raiz de nuestro servidor web, en Ubuntu normalmente se ubica en /var/www, el código fuente es el siguiente.

<?php
// www.internetdelascosas.cl
//
// Script para recolectar datos enviados por arduinos conectados a la red
//
// contacto@internetdelascosas.cl
//

// Parametros de base de datos
$mysql_servidor = "localhost";
$mysql_base = "idlc";
$mysql_usuario = "idlc";
$mysql_clave = "contraseña_super_secreta";

$id  = htmlspecialchars($_GET["id"],ENT_QUOTES);
$nombre = htmlspecialchars($_GET["nombre"],ENT_QUOTES);
$valor = htmlspecialchars($_GET["valor"],ENT_QUOTES);

// Valida que esten presente todos los parametros
if (($id!="") and ($nombre!="") and ($valor!="")) {
	mysql_connect($mysql_servidor,$mysql_usuario,$mysql_clave) or die("Imposible conectarse al servidor.");
	mysql_select_db($mysql_base) or die("Imposible abrir Base de datos");
	$sql = "insert into variable (fecha, id, nombre, valor) values (NOW(),'$id','$nombre','$valor')";
	mysql_query($sql);

}
?>

Si realizan todos los pasos correctamente, la tabla variable debería comenzar a recibir registros cada 10 segundos. Si desean modificar este valor pueden hacerlo en la variable intervaloConexion, un valor recomendable es 300000 (5 minutos).

Pueden ver el log del servidor apache para validar que se esta llamando correctamente al script arduino.php

[root@idlc ~]# tail -f /var/log/httpd/internetdelascosas.cl-access_log
210.1.221.117 - - [09/Jul/2014:16:48:37 +0400] "GET /sensorarduino.php?id=joniuz&nombre=temperatura&valor=18.55 HTTP/1.1" 200 - "-" "Arduino-Ethernet"
210.1.221.117 - - [09/Jul/2014:16:48:47 +0400] "GET /sensorarduino.php?id=joniuz&nombre=temperatura&valor=18.55 HTTP/1.1" 200 - "-" "Arduino-Ethernet"
210.1.221.117 - - [09/Jul/2014:16:48:58 +0400] "GET /sensorarduino.php?id=joniuz&nombre=temperatura&valor=19.04 HTTP/1.1" 200 - "-" "Arduino-Ethernet"

Si tienen cualquier consulta, no duden en comentar o consultarnos a nuestro email.

También pueden revisar todo el código fuente disponible en nuestro repositorio en GitHub.

Author: José Zorrilla

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

237 thoughts

  1. Hola Joniuz, muchísimas gracias por compartir este post, es muy pero muy útil amigo. Yo estoy trabajando en un proyecto parecido con RFID, en cuanto lo tenga terminado lo compartiré en mi blog. Muchas gracias.

  2. Perdona, espero me pueda ayudar.
    Este campo $mysql_base = «idlc»;, ¿indica el nombre de la tabla?
    $mysql_usuario = «idlc»; ¿Este me imagino es nombre usuario BBDD.
    Gracias

    1. Manuel, la instrucción $mysql_base = «idlc» indica el nombre de la base de datos dentro de una instancia mysql.

      Un servidor MySQL puede tener multimples instancias y una instancia puede tener varias bases de datos.

      Efectivamente $mysql_usuario es el nombre del usuario de la base de datos que debe tener los privilegios para poder conectarse al servidor y a la base de datos.

      En este ejemplo el nombre de la tabla esta en la sentencia $sql = «insert into variable …» donde «variable» es el nombre de la tabla.
      .

      1. caballero necesito enviar el numero de serie del RFID a una web, y con el numero de serie hacer condicionales y consultas, y luego enviar un true o false nada mas

        1. Pablo, es simple, solo debes cambiar la linea donde esta el GET por la variable donde tienes el numero de serie RFID y luego en el servidor procesar este numero de serie y generar una respuesta en formato XML.
          Revisa este tutorial donde esta explicado como generar una respuesta para que el Arduino la procese y ejecute una accion, en este caso enceder leds

          http://www.internetdelascosas.cl/2014/07/14/estacion-mereorologica-capturando-temperatura-humedad-y-luminosidad-en-mysql-usando-apache-php-arduino-ethernet-shield/

          Saludos
          JZ

  3. Hola joniuz! muy buen post! tengo una duda, para hacerlo al revez, o sea enviar datos desde php al arduino y que este me devuelva su estado. Por ejemplo, llamo a una funcion en php que se llame «pedir_estado.php» y que esta le pida el estado al arduino, y luego mostrarlo en el navegador. Espero que me puedas ayudar.

    Saludos y gracias!

    1. German, para consultar el estado del arduino necesariamente debes utilizar un sketch que implementa un servidor que utiliza el protocolo http (me parece que dentro de los ejemplos viene uno). Luego desde el php en el servidor haces un “include” con la direccion http del arduino.

      Buen tema para un artículo, buscare mas información y publicaré un ejemplo.

      Saludos
      @joniuz

      1. claro pero si compro el ethernet shield? o solo funciona para el arduino uno?

        Saludos muy buena la pagina me la recomendo mi tio marcelo tapia nose si lo conoces.

        1. Sorry ahora entendi, el shield ethernet es para arduino uno.

          Tendre que comprar el arduino uno y el shield entonces.

          Saludos

  4. Hola. Muy Bueno.

    Estoy empezando a desarrollar un proyecto parecido.

    Se trata de leer datos de sensores de temperatura y lectura de caudal mediante generador de pulsos y guardarlos en un txt en la tarjeta SD incorporada en Arduino. Esto se hará cada x tiempo.

    Ahora lo que quiero es pasar estos datos a una tabla de bd mysql alojado en un servidor y realizarlo cada x tiempo, es decir sincronizar los datos.

    La idea de hacerlo así es para evitar la pérdida de datos de los sensores por no tener conexión por cualquier motivo.

    Si al arduino se le incorpora una batería no dejaría de almacenar lecturas independiente de lo que suceda en el exterior.

    Cuando se reestablezca la conexión se actualizaría los datos desde la tarjeta SD a la base de datos.

    Una vez explicado mi proyecto.
    ¿Podrías guiarme como proceder?
    Gracias y un saludo.

    1. Hola Jose,

      Suena interesante el proyecto, lo que no me queda claro es ¿los Arduinos están siempre en linea o con una conexión intermitente?, si es asi, lo mejor seria ir guardando los datos en una memoria Micro SD (la capa Ethernet tiene un slot para ese tipo de memoria) lo complejo será saber que dato enviaste y que dato no, por lo cual cada registro (o línea) debe ir con un correspondiente timestamp (marca de tiempo).

      Mi recomendación es siempre cablear, en la medida de lo posible, con sistemas inalambricos siempre hay problemas 🙂

      Saludos
      JZ

  5. Hola, excelente tutorial, sin embargo a la hora de compilar de el sketch en arduino IDE señala un error en

    client(server, 80);

    de que manera puedo corregirlo para que se refiera correctamente al computadora cliente?? de antemano muchas gracias

    1. Estimado,

      ¿Cual es el código exacto del error?

      A nosotros a veces nos marca error cuando intentamos compilar un sketch de Windows en Linux, muchas veces tenemos que cambiar las llamadas a las funciones de red.

      Cuéntanos para ver si podemos ayudarte.

      Saludos
      JZ

      1. Estimado joniuz ami igual me marcaba un error en la linea

        Client client(server, 80);

        Pero lo solucione de la siguiente forma
        primero edite la linea por esta

        EthernetClient client;

        Despues cambie la conexion al server por esta

        if (client.connect(server, 80)) { // Se conecta al servidor

        y asi compila sin ningun problema el sketch y funcionando con servidor remoto con base datos Mysql

        Saludos Gracias muy bueno el tutorial

        1. Perfecto!

          El codigo depende de la versión del compilador de Arduino que tengas, nosotros hemos tenido problema en compilar programas hechos en Linux cuando los exportamos a Windows.

          Y hemos logrado correrlos de la misma forma.

          Saludos

          1. Juniuz tengo una duda con respecto a la conexion con el servido el progamam lo ejecute en linux pero al momento de ver los resultados en consola me aparece que tubo un «Error al conectarse al servidor»
            estoy utilizando un servidor local en este caso apache al cual le eh asignado un una direccion al servidor (char server) y eh guardado el script de php en mi srrvidor local pero al momento de conectarme y mostrar los datos me aparece un error con el servidor y cuando accedo al php me carca errores en las 3 lineas donde ser reciben los valores

            $id = htmlspecialchars($_GET[«id»],ENT_QUOTES);
            $nombre = htmlspecialchars($_GET[«nombre»],ENT_QUOTES);
            $valor = htmlspecialchars($_GET[«valor»],ENT_QUOTES);

          2. Daniel, lamentablemente la descripcion de los errores es bastante vaga, puedes copiar exactamente el mensaje de error y describir cuando ocurre?

            Saludos
            JZ

    1. Jack, ¿sobre que sistema operativo lo estas usando? normalmente en sistemas Linux (o unix) los archivos del sitio web quedan en /var/www/

      Revisa la documentación de XAMP para ver donde esta la raíz del sitio web en el el sistema de archivos.

      Saludos
      JZ

  6. Arduino puede conectarse al servidor de IP que es IP pública estática, pero los datos transmitidos no aparece en la base de datos

    si alguno de los script php?

    por favor entrada

  7. Excelente post !!!! me quede con una duda que se convirtio en idea, dime se puede mandar datos por bluetooth a mysql !!!! seria el mismo procedimiento ????

  8. Hola, estoy pensando implementar esto de manera local y tengo ciertas preguntas.

    1. El Ethernet Shield a donde debe ir conectado, a un router?
    2. Se puede realizar esto usando Apache en localhost? (cuales son los datos de ip y server en el caso de localhost?)

    1. Ricardo, este ejemplo esta implementado en una red local.

      Respondo a tus preguntas:

      1.- Si, el puerto ethernet del ethernet shield lo debes conectar a la red local (a uno de los puertos ethernet del router) y obviamente el ethernet shield debe estar montado sobre un Arduino uno.

      2.- Si, este ejemplo utiliza apache. Ojo con localhost, este es el nombre que recibe la tarjeta de red local en un Linux y no significa que es una red local, lo que debes conocer es la ip que tiene Linux en la red, si te fijas en este ejemplo esa ip es 192.168.1.200. Para conocer esta ip puedes usar el comando ifconfig (debes ejecutarlo como root).

      Espero que te sirva.

      Saludos

  9. Hola, te felicito por tu tutorial.

    Quiero probar tu proyecto y soy novato en Arduino; tengo dos dudas:

    1) Como obtienes el valor de la mac { 0x90, 0xA2, 0xDA, 0x0D, 0x1F, 0x80 }; es decir como se cual sera el valor de la mac de mi Ethernet Shield?

    2) Por que cuando transmites los datos el client.print(«GET /arduino.php?id=joniuz&n=t&v=»); el valor v dice » no deberia decir v=celcius?

    Saludos.

    1. Hola Fernando! gracias por las felicitaciones.

      Respondo a tus preguntas
      1) La mac viene impresa en un sticker pegado bajo la tarjeta, agregue una imagen en el artículo para que veas a lo que me refiero.

      2) Hay dos funciones para imprimir:
      – print: imprime (en este caso envía la información por la conexión hacia el servidor web) pero no cambia de linea, dejando el cursor en la misma linea para escribir a continuación.

      – println: imprime y envía el caracter new line «\n» al final de la linea, esto para el servidor web es muy importante.

      ¿Donde esta el truco? En la siguiente linea esta escrito el valor con la instrucción «client.print(celsius);» pero no es hasta la siguiente instrucción «client.println(» HTTP/1.0″);» donde deja un espacio en blanco y le dice al servidor web que termino de enviar los datos con los caracteres «HTTP/1.0» y el fin de linea con println.

      Espero haberte aclarado las dudas y cuéntanos como te fue!

  10. Ok gracias por la aclaración.

    Lo único que me falta es el Sensor LM35, lo googleado y solo aparece un vendedor en Arica. Sabes donde conseguirlo en Stgo. O bien sera posible usar el Sensor de Temperatura One Wire DS18B20?, imagino que si pero como no soy electrónico si no que informático prefiero pregunatrte.

    1. Si ambos sirven, pero el LM35 es analogo y el DS18B20 es digital, por lo que van conectados a distintas entradas en el Arduino, atención con eso.

      Saludos

  11. Saludos desde Colombia, ha sido muy interesante tu aporte, estoy realizando mis primeros pines en arduino y este código me ha venido al pelo. Me surge una duda, puedo yo desde mi servidor web enviar variables al arduino como respuesta al dato enviado, por ejemplo;
    Sabemos que si al subir cierta temperatura podemos abrir un delay o relevo para encender un aire acondicionado, esto lo programariamos directamente desde el sketch de arduino, pero si quisiera mediante la web cambiar el valor almacenándolo en una tabla mysql y modificar el valor maximo de temperatura por ejemplo de 22 grados a 25, y que el arduino tomara este valor para validar su condición de prender o no el aire.
    Es posible?
    Me podrías dar una luz al respecto.

    1. Estimado

      La ayuda que pide alcanza para escribir un articulo completo, pero haré el esfuerzo respondiendo acá.

      Existen dos formas de atacar el problema de las variables. La primera es guardar las variables en un servidor externo.

      El Arduino es un microcontrolador que ejecutara un código en loop infinitamente, no tiene una memoria persistente, por lo que si se reinicia, vuelve a partir desde los valores iniciales. Esto le da mayor versatilidad y al mismo tiempo lo limita, por ejemplo, un Arduino no puede correr una base de datos MySQL.

      Si desea conservar una variable, necesariamente debe hacerlo en una memoria MicroSD o en un servidor externo.

      Para la segunda opcion, es necesario que cada vez que envie datos al servidor, este debe devolver variables, las cuales deben ser procesadas (parseadas en la jerga informatica) en el Arduino para ir actualizando los valores en tiempo de ejecucion.

      Busque la siguiente linea en el codigo que publicamos

      if (client.connected()) {}

      En esa linea se ve que no se ejecuta código cuando el Arduino se conecta al servidor (en este caso «nada» {}), ya que el Arduino envio solo envía los valores en la URL sin esperar respuesta.

      En esta linea deberia comenzar a procesar la respuesta del servidor. El problema es que no existe una funcion especifica para leer el «string» despuesta y se debe hacer caractera a caracter con una instruccion como la siguiente.

      char c = client.read();

      Al conectarse el Arduino con el servidor, este deberia enviar la o las variables como respuesta, las que seran parseadas por el Arduino localmente. Para ello deberia modificar el archivo PHP del servidor.

      Vea los ejemplos de clientes web en el menú de ejemplos del Arduino, esos le aclararan un poco mas la idea. Intentaremos sacar un ejemplo así dentro de poco.

      La segunda forma de atacar el problema es creando un servidor web que funcione localmente en el Arduino, para esto, el ejemplo de este artículo no sirve, ya que el Arduino opera como un cliente web. Revise los ejemplos que vienen con el software de instalacion, en ellos se ve como crear un servidor web en Arduino.

      Ha pensado en usar equipos mas inteligentes que el Arduino como Raspberry Pi o Beaglebone?

      Saludos desde Chile

  12. Hola,

    Mi consulta es si se puede hacer en sentido inverso. Quiero hacer una cnc, y guardar los trabajos en mysql para ejecutarlos conforme me vaya haciendo falta. Por ejemplo si guardo un proyecto llamado dinosaurio y tengo que volver a «imprimirlo» ¿puedo hacer que arranque el código desde mysql? ¿Podria enviarlo a arduino desde una Tablet encontrándose la base de datos en un servidor de red o internet?

    Por favor avisarme en email cuando respondáis. Gracias.

    1. Hola

      Si desea hacerlo en modo inverso, es decir tener localmente la base de datos MySQL, evalúe otro tipo de tarjetas con linux embebido como Raspberry Pi o Beaglebone

      El Arduino no está diseñado para que se le envíe código en cada arranque, todo lo contrario, fue pensado para ejecutar el mismo código infinitas veces reinicializando todas las variables cada vez que parte.

      Saludos

      1. Ante todo agradecerte tu atencion y consejo, me ha interesado el raspberry pi porque no solo ofrece lo que busco sino que también podría tener un media center.

        Hace unos minutos he visto otro proyecto que saldrá en septiembre, se llama UDOO, ¿me espero a que salga y podría usarlo como media center? mas que todo por si soy inacapaz de aprender a programar la cnc que comente anteriormente.

        Otra duda es si tendría que comprar un arduino para controlar los motores paso a paso a demas de los driver.

        No tengo ni idea de electrónica pero me gustaría introducirme sin tirar el dinero pudiendo dar otra utilidad si me aburriese.

        Al principio quería el arduino (16 euros), me aconsejaste el raspberry pi (38 euros) y ahora he conocido UDOO.

        De aburrirme podría usarlo como media center o como servidor web php-mysql.

        Un cordial saludo

        1. Antonio, el Raspberry Pi es mucho mas equipo que un Arduino, pero tiene una desventaja, no tiene puertas analogicas, por lo que si tu objetivo es conectar sensores analogicos tendras que usar un Arduino como interfaz.

          Saludos

  13. te cuento que tu ejemplo me servio para punta pies de lo que estoy desarrollando,tengo bastante experiencia programando pic,pero arduino nada
    asi que me dedique a estudiar un rato y me encontre con tu web y que mejor alguien chileno una maravilla.
    como no todo es gratis jajajja
    una consultilla:
    arduino puede tyrabajr tanto como servidor y cliente
    la idea es que acepte peticiones asi como las envia

    saludos

    alexander
    santiago de chile

    1. Alexander

      Efectivamente Arduino puede trabajar como servidor y como cliente, lo que debes tener en cuenta es que cuando opera como servidor no tiene mucho que servir ya que no tiene ningún dispositivo de almacenamiento en su versión básica, si deseas servir archivos debes usar una shield para micro SD.

      Dentro de los sketchs de ejemplos vienen varios servidores que permiten modificar el estado de las puertas de salida, con esto puedes prender leds o activar reles remotamente.

      Saludos

    2. Hola disculpa la molestia, una consulta: de donde saco el id: identificador del arduino ?, en el codigo dice un nick jonius.
      Muchas gracias por su amable respuesta

      1. Cesar

        Ese identificador simplemente es un nombre para reconocer el equipo en el caso de que tengas varios conectados. Puedes colocar el nombre que quieras. Yo ocupe mi cuenta twitter!

        Saludos
        JZ

  14. Excelente aporte joniuz..!! Muchas gracias por compartirlo.

    Una consulta, ya vi que envias datos por HTML al servidor web. Si queres enviar datos o consultas desde el servidor apache con PHP hacia la shield Arduino ethernet via TCP/IP usas el método POST?

    1. Hola

      Para la comunicación en sentido inverso, desde la red hacia el Arduino uso GET (es mas fácil de procesar las variables en el lado del Arduino)

      Saludos

    1. Este ejemplo te sirve, debes validar que tengas el lenguaje PHP en el servidor (que es lo mas probable), crear una base de datos MySQL y modificar las credenciales (servidor, usuario, contraseña) de acuerdo a las que definas en el proveedor de Hosting.

      Saludos

  15. hola joniuz, muy interesante tu publicación bueno quisiera que me orientes ,mi idea es desarrollar un invernaderos automatizado utilizando (php,mysql y arduino ethernet sin poe) ,donde pueda capturar los datos generados mediante sensores y a la vez también pueda manipular desde la pagina web al arduino de forma remota como encender o apagar ventiladores ,ha por cierto una pregunta mas se podrá realizar con asp

    estos son los que ya tengo comprado :
    http://www.5hz-electronica.com/arduinoethernet-1.aspx

    sensores
    bomba de agua
    relay shell
    y programare mediante conexión usb

    espero su respuesta gracias

    1. Hola Mario, los Arduino Ethernet que ya tienes están perfectos para lo que quieres realizar. Debes «inventar» un protocolo de comunicacion basado en peticiones GET o POST entre el servidor (que puede ser ASP, aunque no es de mi agrado, te recomiendo PHP) y los Arduino.

      Puedes enfrentar el problema de dos formas:
      1) Arduinos reportándose al servidor: El servidor simplemente escucha y los Arduinos se reportan al servidor con una frecuencia programable, en cada reporte reciben también instrucciones.

      2) El servidor se comunica periódicamente con cada Arduino: los Arduinos esperan la comunicación del servidor, reciben instrucciones y entregan sus variables de estado.

      La opción 1 cargara mas la red ethernet, pero si son pocos sensores (mucho serian unos 500 Arduinos) creo que es la mas simple.

      Espero que esta ayuda te sirva, nosotros estamos desarrollando un proyecto parecido, pero no con invernaderos…

    1. Si, es posible pero debes considerar que no existen (hasta donde nosotros sabemos) librerías en Arduino que te permitan procesar el xml que entrega un WebService por lo que debes realizar ese «parseo» a mano.

      Para evitar un excesivo procesamiento en el Arduino nosotros utilizamos scripts php que entregan valores simples de procesar, sin todo el protocolo y headers que normalmente entrega un WebService.

      Saludos

  16. Hola amigo, en primer lugar muy agradecidos todos poq tu post es referencia para todos, pero tengo un gran problema, hice todo el desarrollo en base a tu ejemplo, y tengo tablas en mi server para monitorear las temperaturas del proyecto, pero NO FUNCIONA! ?=(
    por lo que he podido ver, el arduino sólo ejecuta la consulta como cliente el GET al server en el void setup() pero no el el loop()
    lo que hace inviable estar actualizando de manera periódica la tabla mysql en el server en la red.
    Es bastante frustrante para mi encontrarme con esto luego que estaba seguro que se podía.
    que me puedes ayudar al respecto.
    Gracias de antemano

    1. El Arduino al momento de partir ejecuta el setup() y luego el loop() a menos que este corrupto el boot loader debería hacer eso.

      Revisaron que en el setup() no existe funciones o código que pueda detener la ejecución? probaron con otro Arduino?

      Saludos

  17. Hola Joniuz. Excelente trabajo y gracias por compartirlo con todos. Estoy trabajando en un proyecto similar pero mi base de datos tiene 6 variables dentro de una tabla. ¿ cual sería el codigo del arduino para «grabar» las 6 variables ?
    Me permito una segunda pregunta: ¿ ya has generado el blog para que el arduino pueda recibir datos desde la base de datos? Entiendo que para esto el arduino debe indicar que variable quiere leer y ponerse en modo de escucha para recibir el dato no?.

    Gracias por tu atención y respuesta si es posible.

    Saludos desde Barcelona

      1. Buenas una duda que tengo es que cuando intento correr el programa me visualiza Sensor: 45 grados Celsius
        Iniciando conexion…

        y se queda asi despues me vuelve a mostrar lo mismo, y en la BD no hace ningun registro, no se si alguna parte de lo que modifique este en conflicto, tampoco en la parte del server no se que ponerle usted tiene algo como http://www.ioa.com pero yo no se que ponerle.
        actialmente tengo.
        char server[] = «http://localhost/phpmyadmin»;
        agradeceria mucho la ayuda.

        1. Alejandro

          La direccion localhost es el alias que ocupa cada equipo conectado a internet (en especial servidores) para apuntarse a si mismo. Debes reemplazar localhost por la direccion IP de tu servidor.

          Saludos

  18. felicitaciones por el post muy buena informacion, sabes que yo lo probe pero no me funciona y no se comunica a mi server local y lo probe en un servidor en internet y no conecto , mi pregunta es que si usas la ip del servidor necesitas un servidor de dominio DNS para poder llagar al destino tanto en lan como en wan?

    1. Javier

      Cuando te refieres a servidor de dominio DNS, te refieres a un Domain Name Server o a un servidor de dominio de Micro$oft (Active Directory Server)?

      En este ejemplo usa un DNS para resolver el nombre del servidor, aunque también se puede colocar la ip directamente para no depender del servicio DNS. Con respecto al servidor DNS este es entregado cuando el Arduino solicita acceso a la red utilizando el protocolo DHCP. Si tu red utiliza ese protocolo (la mayoría lo hace incluso las redes de las casas que operan con un router wifi) no deberías tener problemas, pero si no funciona te recomiendo que coloques la IP directamente en el código.

      Saludos

  19. hola, como puedo hacer para conectar arduino al programa Logtemp y que pueda leer el sensor sd18b20, aclaro Arduino reconoce el sensor, pero logtemp no recibe los datos, saludos

  20. Hola Joniuz, muy buen aporte, quisiera preguntarte lo siguiente si decidiera recolectar la informacion de sensores en arduino almacenandola en la SD del ethernet shield como podria despues enviarla a una aplicacion java o applet para graficarla, te agradezco de antemano la respuesta
    un saludo

    1. Hola disculpa la molestia, una consulta: de donde saco el id: identificador del arduino ?, en el codigo dice un nick jonius.
      Muchas gracias por su amable respuesta

      1. Cesar

        El identificador permite reconocer que arduino se esta conectado en el caso de que tengas varios conectados, puedes usar cualquier nombre, en este ejemplo yo uso el nick de mi cuenta twitter.

        Saludos
        JZ

  21. esta perfecto, ando haciendo un proyecto parecido pero con sensor de movimiento y con wifi adaptado a un linksys me gustaria si me podrias ayudar gracias.

  22. Es sin duda alguna un buen proyecto, pero no me funciona, me muestra en el monitor serial del arduino que tengo conexión y las temperaturas, pero nada se refleja en mi base de datos.
    De verdad es URGENTE, espero alguien me pueda ayudar.

    1. Estimada,

      Específicamente que parte del proyecto presenta problemas? Nosotros lo hemos replicado en forma independiente sin problemas. Si nos entregas más detalles podemos reproducir el error.

  23. Hola tengo un problema con el codigo.
    Me manda un error en la linea de Client client(server, 80);
    En un video vi que sustituyeron esa linea por un EthernetClient client; y efectivamente el error desaparece pero me muestra un error en la linea de if (Client.connect()>0) {
    Si alguien fuera tan amable de decirme lo que pasa les estaria muy agradecido 🙂

    1. Roman

      Todo depende de la libreria que estes usando, cada libreria tiene distintas instrucciones, por lo mismo lo ideal es que revises en la documentacion de la libreria si las instrucciones son las mismas.

      A veces actualizaciones de librerias cambian las instrucciones por nuevas o con nuevos parametros.

      Saludos
      JZ

  24. Cordial saludo
    he seguido este tutorial y me ha ayudado mucho, cambie el sensor por un DHT11 para obtener datos de temperatura y humedad, sin embargo he tenido problemas con la segunda variable puesto q no se como en la siguiente linea puedo agregar la variable:

    solo necesito ayuda con el get, en el puerto serial de arduino ya me salen los resultados de ambas mas no puedo enviar sino el dato de temperatura a la base de datos de mysql como hago para cambiar el get para la variable de humedad’??

    client.print(«GET /arduino.php?id=joniuz&n=t&v=»);
    client.print(temperatura);

    1. David,

      Se debe agregar cada variable concatenada por &, tendrias que agregar estas lineas

      client.print(“GET /arduino.php?id=joniuz&n=t&v=”);
      client.print(temperatura);
      client.print(“&h=”);
      client.print(humedad);

      En todo caso, revisa nuestros ultimos tutoriales, porque en esos estamos usando el sensor DHT11.

      Saludos.

  25. Hola! Te escribo porque tengo una duda! Me hace todo bien pero no escribe en la base de datos? Alguna idea?

    Saludos!

    1. Vicente

      Lo primero que tienes que probar es justamente la escritura en la base de datos, para eso puedes usar cualquier computador dentro de tu red llamando directamente al servidor con la URL, deberia escribir en la base de datos.

      Si quieres nos puedes escribir a contacto@internetdelascosas.cl porque necesitamos ver el codigo para ayudarte.

      Saludos
      JZ

  26. Hola, muchas gracias por tu aporte de verdad me parece excelente.
    Quisiera saber si, existe una forma de mandar desde php una orden a arduino para que apague un bombillo y como lo hago. Te agradezco muchísimo que me colabores ya que lo necesito para un proyecto de aula semestral que necesito entregar pronto en la u.

    1. Samuel

      Efectivamente se puede realizar la conexion en forma inversa, que el arduino sea el servidor y un navegador internet el cliente.

      Revisa en los ejemplos que vienen en el IDE de arduino: Ethernet – WebServer, ese es un ejemplo como ver parametros que esta sensando el arduino.

      Saludos
      JZ

  27. Hola, gracias por responder mi interrogante. Ahora quisiera saber si esto puede ocurrrir al mismo tiempo es decir que yo mande datos del arduino a php y los guarde en un bd MySql y que a la vez, desde php mande datos al arduino para que haga alguna cosa que yo quiera como prender un foco o algo asi.

    1. Si, se puede, en el php debes enviar una salida que debe ser procesada por el Arduino y tomar una decisión dependiendo de lo que procese.

  28. Otra pregunta que quiero hacer es: el arduino.php tiene que estar donde, en una carpeta del servidor normal, para lo cual tendria que decir carpeta/arduino.php o tengo que meter el codigo de arduino en xampp/htdocs?

    1. Desconozco como funciona el xammp pero me parece que debes colocarlo en la carpeta htdocs. El script php debe quedar visible desde la red, debes poder acceder a el desde un navegador como Chrome o Firefox.

  29. Ignora las preguntas que te hice antes… mira me puedes regalar tu correo para mandarte una duda que tengo (que incluye pantallazos), resulta que he intentado hacer lo que tu pones aqui en este ejemplo y no me ha funcionado

  30. hola excelente tu poss, mira tengo que hace un proyecto de una banda transportadora, donde la banda va estar tranportando productos y tendra casi al final como una puertita que los va a parar y con un sensor y un servo va decidir si avienta al objeto a la derecha p izquierda, lo que queremos hacer es que en la base de datos tenga una tabla con los atributos o columnas que sean derecha e izquiera y que podamos manipular los valores de la base de datos y que el arduino capte la señal…por ejemplo en la columna derecha le pongo 5 y en la izquierda 3…pues quiero que me aviente primero 5 objetos que detecte a la derecha(que el servo gire a tal dirección) despues de eso 5 que los 3 objetos me los aviente a la izquierda(el servo gire a la dirección opuesta), y se vuelva repetir el ciclo, no se si me explique, si podrías hacerme el favor de ayudarme como hacerle

    1. Emanuel,
      No me queda claro el patron que usaras para seleccionar los productos, hablas de un sensor pero no dices que tipo de sensor es. Si utilizas una banda transportadora un parámetro muy importante a controlar es la velocidad de esta, al mismo tiempo el Arduino debe ser capaz de detenerla en caso de detectar alguna condición de error.

      El proyecto es completamente factible, pero te recomiendo que realices pruebas iniciales antes de largarte a programar el Arduino, hay varios parámetros que debes controlar y eso se logra solo con la experimentación.

      Saludos

  31. bueno mas bien de acuerdo al codig0 de webclient arduino como le hago para guardar el valor de las variables de el php por ejemplp tengo $re=5; y quiere que ese valor lo tome una variable arduino como le hago?

  32. Hola Excelente, me queria sacar una duda, resulta que tengo un desarrollo parecido ,pero la conexion no es demasiado estable ,de 10 intentos conecta 6 y que es muy lento la conexion al servidor osea cada vez que hace (client.connect(server,80)) se demora unos cuantos segundos., te pasa algo parecido o la respuesta de conexion es inmediata?.
    Saludos.

    1. En nuestro caso la conexión es inmediata y estamos utilizando un servidor que esta literalmente hablando al otro lado del mundo.

      Tu Arduino se conecta localmente? o utiliza un servidor en internet? Utiliza resolución por nombre o un IP?

      Muchas veces la resolución de nombres retrasa un poco la llamada GET.

  33. hola tengo un problema con un programa que realice con arduino shield Ethernet bastante parecido al tuyo yo envios letras por a través de Ethernet y estas son recividas y enviadas de vuelta al arduino como para comprobar que si llego la información el problema se produce es que después de estar conectado un par de horas o incluso a veces un par de días es super relativo se pierde la conexión y en el programa no visualizo nada aunque se que se están enviando ya que he realizado ping a la arduino y esta me contesta sin problemas tu me podrias guiar en donde podría estar alojándose el problema el programa de recepción de información a parte de guardar la letra que se envió se genera un archivo txt que va guardando toda la información entrante

    1. Roberto

      Te recomiendo utilizar la interfaz serial que tiene Arduino para realizar el debug a tu programa. Que el Arduino responda por ping no implica que este ejecutando correctamente el loop principal, solo indica que la tarjeta de red esta operativa.

      Te recomiendo revisar las variables, recuerda que Arduino tiene una memoria limitada, si usas muchas variables o tienes alguna que reciba un valor no esperado puedes provocar que el Arduino se bloquee y solo responda por ping. También debes tener cuidado con el archivo txt que generas, como controlas que no crezca hasta el infinito llenando todo el espacio disponible?

      Saludos

  34. Felcitaciones por el post quiera saber como podria hacer para enviar mensajes de sms desde php, con datos que estan en mysql usando arduino

    1. Jorge, no entiendo porque quieres agregar un Arduino si basta con Linux, MySQL, PHP, un celular compatible o Modem GSM y playSMS puedes enviar SMS sin necesidad de un Arduino. Si aun así quieres hacerlo con Arduino, tendrás que comprar una GSM Shield que es una de las mas caras y programar un cliente para el Arduino y un Servidor que entregue el SMS a enviar… Busca en Google mejor con las palabras que están mas arriba, Google todo lo sabe!

      Saludos

  35. felicitaciones por la excelente explicación…

    Estoy realizando el proyecto con un sensor DHT11 para enviar datos de temperatura y humedad…tu nos mostraste como enviar un dato el de temperatura…¿Como hago para enviar dos datos el de temperatura y el de humedada la vez desde el GET y que en ki base de datos queden guardados esos datos cada uno en su repestivo bloque de temperatursa y humedad…
    gracias…POr fa…URGENTE

  36. hola quisiera saber porque no me deja compilar el sketch en arduino dice» La clase Server a sido renombrada como EthernetServer » gracias por tu ayuda

    1. Julian,

      Eso pasa cuando la libreria Ethernet esta desactualizada, baja la ultima version del IDE para Arduino y utiliza el codigo que hemos actualizado, con esto deberia compilar sin problemas.

      Saludos

  37. Hola, muchas gracias por tu dedicación y responder nuestras dudas, excelente Trabajo. Da gusto tener un compatriota aportando sus conocimientos.
    Bueno, necesito hacer un proyecto para presentarlo en la universidad, el asunto es; necesito que se escriba una contraseña numérica en un «teclado matricial arduino» y que esta contraseña se envié por intermedio de ethernet shield a una aplicación «Java» la cual valide la contraseña y envié una respuesta al arduino por intermedio de la misma ethernet shield y active un relee arduino en caso de ser positiva la validación de la contraseña. Todo esto en una red interna.
    La razón de todo este proceso es que necesito generar roles para usuarios, los cuales se validaran con las contraseñas y ademas de llevar un registro de accesos positivos (relee activado), ejemplo: hora, fecha, nombre del usuario. en una base de datos MySql.
    La consulta es si todo este proceso se puede llegar hacer?, si el proyecto seria factible?, «arduino uno» no tendrá problemas en llevar a cuestas Ethernet Shield, 1 relee y un teclado matricial, al mismo tiempo?.
    Se agradece de antemanos tu respuesta.

    Saludos Cordiales.

    1. Pedro

      El proyecto es factible, Arduino esta preparado para trabajar con una Ethernet Shield un relay y un teclado. Que tipo de teclado es? has pensado en algo mas moderno como una tarjeta RFID para reemplazar al teclado? Arduino tiene una Shield que lee esas tarjetas.

      Lo que veo mas complicado de un proyecto así es la encriptación, el Arduino necesariamente tiene que encriptar a información que envía y recibe desde el servidor ya que este tipo de implementaciones para control de acceso son fáciles de atacar con la técnica «man in the middle». Encriptar en un Arduino puede ser complejo porque esta limitado por memoria. Creo que una buena opción seria una Raspberry Pi que es un pequeño computador que corre Linux capaz de manejar un teclado, pantalla y encriptar los datos antes de comunicarse con el servidor.

      Saludos

      1. Muchas gracias por tu respuesta, si es verdad que había pensado en utilizar el modulo de RFID en vez del Teclado Matricial Membrana 4×4, como idea inicial, pero no lo encuentro ni en M.Libre (1 usuario lo vende pero no es confiable). Y el Raspberry Pi es una gran herramienta, pero por presupuesto tendré que manejar el proyecto con arduino. La encriptación de datos es algo que tendré que estudiar con mas detalle es un problema.
        Se agradece su respuesta y gracias por las recomendaciones.

        Saludos.

  38. Hola Amigo, es muy interesante, creo que me puede servir en un proyecto que estoy haciendo, pero lo que hare es un poquito diferente, quiero mandar ordenes a un beaglebone black r3 conectando un modem (de teleonia celular), pero se me ha hecho un poco complicado investigar acerca de este asunto, me gustaria saber si puedes darme algun consejo o lo que requiero para hacer esto, ya que el problema de la telefonia movil es su ip, que es compartida por varios usuarios.

    gracias

  39. Ramon

    Todo depende del proveedor de telefonía celular que tengas, algunos usan un proxy de navegación lo que hace mas complicado enviarle ordenes o comandos al Beaglebone conectado detrás de un módem 3G, pero hay otros que usan un IP con direccionamiento real en Internet por lo que se hace mas fácil.

    Lo que nosotros hacemos es programar al Beaglebone para que revise constantemente una pagina en internet en donde colocamos los comandos que deseamos ejecutar, con esto no importa que ip tenga el Beaglebone y al mismo tiempo sabemos si esta conectado porque vemos cuando lo hace.

    Este tutorial te puede servir para conectar el Beaglebone con un dongle 3G

    http://www.internetdelascosas.cl/2012/06/21/conectando-el-beaglebone-a-internet-utilizando-un-modem-3g/

    Saludos!

  40. Buenas Noches, lo que pasa es que tengo dudas acerca de estas lineas de código ya que estoy trabajando con «Wampserver» y no sé como modificar esa parte:

    // Descomentar esta linea para asignar un DNS fijo
    //IPAddress myDns(172,17,17,1);

    // Inicializa la instancia client
    EthernetClient client;

    // Direccion del servidor
    char server[] = «www.iot.cl»;

    Gracias

  41. Alejandro

    Vemos en nuestro servidor que llegan conexiones desde tu IP (ya que coincide el IP de la pregunta con el registro de conexiones en el servidor web) lo unico que tienes que modificar para que te funcione en tu servidor es las siguientes lineas

    // Direccion del servidor
    char server[] = “www.iot.cl”;

    cambia http://www.iot.cl por la direccion IP de tu servidor local, ejemplo

    char server[] = «192.168.1.100»;

    Suponiendo que 192.168.1.100 es la ip que tiene tu servidor o computador donde tengas instalado WampServer.

    Saludos

    1. Lo que pasa es que no nos está funcionando…. otra duda es si el «Dns» es importante…

      1. ya le cambie esa dirección que me dijiste por mi «localhost», pero cuando le abro el monitor serial me aparece «dirección ip: 192.168.0.105» no sé que pasa… :/

        1. La direccion 192.168.0.105 es la direccion del Arduino en tu red local.

          Cual es la direccion del computador donde tienes instalado WampServer? deberia ser una direccion del tipo 192.168.0.X donde X es un numero entre 1 y 255. Es esa la que debes colocar, nunca «localhost», esa es una palabra clave que se usa para apuntar a si mismo cuando trabajas con servicios internet.

          1. la dirección de mí computador es : 192.168.0.104 (esa fue la que puse en el «char server»)… mira:
            byte mac[] = { 0xDE,0xAD,0xBE,0xEF,0xFE,0xED };

            // Descomentar esta linea si se desea un IP fijo
            IPAddress ip( 192, 168, 0, 4);

            // Descomentar esta linea para asignar un DNS fijo
            // IPAddress myDns(192, 168, 0, 4);

            // Inicializa la instancia client
            EthernetClient client;

            // Direccion del servidor
            char server[] = «192.168.0.104»;

            y esto es lo que me imprime:
            #### Internetdelascosas.cl ####
            Sensor de temperatura LM35/ web
            Direccion IP: 192.168.0.105

          2. Todo esta correcto, al indicarte

            Direccion IP: 192.168.0.105

            Significa que el Arduino esta conectado a la red, debes revisar ahora el servidor web, revisa si tiene algún tipo de registro de conexion.

            Saludos

      2. Alejandro, si esta funcionando, nosotros vemos como tu Arduino se conecta a «nuestro servidor» porque no cambiaste la direccion del servidor.

        El DNS es importante si es que trabajas con direcciones «humanas» como http://www.iot.cl, no cambies nada del dns porque ya vemos que funciona.

  42. Muy buen ejemplo Jonuiz pero me gustaría saber en la parte del arduino que librerías estas incluyendo

    1. Paulo, por alguna razon extraña el editor borro las librerias, en todo caso ya esta corregido, las librerias son

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

      Saludos

  43. Excelente ejemplo… me valio el codigo completo para mi proyecto.. mis problemas principales redicaron en:

    —Asignar correctamente los permisos al directorio raiz del codigo *.php… Apache me restringia la entrada a la carpeta…

    —Mi modulo ethernet …utiliza los conectores 1,2 del jack analogo (A0,A1) luego por ahi no podia entrar señal….esto ultimo me tuvo cabilando un rato…. de resto . full el codigo y las indicaciones.

    Saludos,

    1. Estimado, que bien que este funcionando el proyecto, gracias por el comentario, creo que debemos advertir eso, cada modulo ethernet usa sus propios pines en la placa Arduino por lo que se debe tener cuidado en eso. Saludos

  44. Me encanto tu proyecto
    Soy nuevo en arduino y estoy tratando de que el arduino se conecte al servidor via comunicacion serial y grabe los datos que se generen ahí en una base de datos
    Es factible?
    Se puede usar alguna parte de tu codigo?

    1. Hola, efectivamente el Arduino se puede comunicar con un servidor utilizando la interface serial, si te fijas en el código cada vez que ves la instruccion Serial.print(«…»); esta utilizando la interfaz serial. LO mas complicado es programar la interfaz serial en el servidor.

      Saludos

  45. disculpa este proyecto me sirve para la escuela puedo utilizar el modulo
    Ethernet Shield con Wiznet W5200 en lugar del que tienes en este proyeccto??

    1. Efectivamente puedes ocupar cualquier modulo compatible con Arduino, solo debes verificar que la libreria es la misma, en este caso usamos el modulo Wiznet W5100.
      Saludos

  46. Hola, muchas gracias por tu post. Solo una duda. ¿ por qué crees que me aparecen estos valores?

    Iniciando conexion…
    Sensor LM35: 406.25 grados Celsius

    Saludos,

    JAP

    1. Jose

      Revisa los valores que esta entregando el sensor, quiza tengas que modificar la funcion

      tempC = (5.0 * tempC * 100.0)/1024.0;

      Saludos

  47. Hola Joniuz. Primero agradecerte por tus post que me han servido mucho.

    Con respecto a es ejercicio, descubrí que tengo un problema que al parecer es muy típico según lo que he estado investigando en diversos foros:
    No logro conectar mi Ethernet Shield como cliente. (como servidor ningún problema) Ni siquiera en el ejemplo básico que trae la IDE de Arduino.

    El error: «Failed to configure Ethernet using DHCP»

    Antecedentes:

    1.- Placa Arduino UNO ( conectadpo vía USB al laptop)
    2.- Ethernet Shield ( montada directamente y conectada vía cable de red)
    3.- Tengo mi laptop conectado desde un router inalámbrico.
    4.- La Configuración IP de Windows es la siguiente:

    Nombre de host. . . . . . . . . : XXX-PC
    Sufijo DNS principal . . . . . :
    Tipo de nodo. . . . . . . . . . : híbrido
    Enrutamiento IP habilitado. . . : no
    Proxy WINS habilitado . . . . . : no

    Adaptador de LAN inalámbrica Conexión de red inalámbrica:
    Sufijo DNS específico para la conexión. . :
    Descripción . . . . . . . . . . . . . . . : Conexión de red Intel(R) PRO/Wireless 3945ABG
    Dirección física. . . . . . . . . . . . . : 00-1F-3C-DC-04-88
    DHCP habilitado . . . . . . . . . . . . . : sí
    Configuración automática habilitada . . . : sí
    Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.4(Preferido)
    Máscara de subred . . . . . . . . . . . . : 255.255.255.0
    Puerta de enlace predeterminada . . . . . : 192.168.1.1
    Servidor DHCP . . . . . . . . . . . . . . : 192.168.1.1
    Servidores DNS. . . . . . . . . . . . . . : 192.168.1.1
    NetBIOS sobre TCP/IP. . . . . . . . . . . : habilitado

    Adaptador de Ethernet Conexión de área local:
    Sufijo DNS específico para la conexión. . :
    Descripción . . . . . . . . . . . . . . . : Controladora Fast Ethernet PCI-E88E8042 Marvell Yukon
    Dirección física. . . . . . . . . . . . . : 00-25-B3-50-7E-52
    DHCP habilitado . . . . . . . . . . . . . : sí
    Configuración automática habilitada . . . : sí
    Dirección IPv4 de configuración automática: 169.254.184.33(Preferido)
    Máscara de subred . . . . . . . . . . . . : 255.255.0.0

    5.- En el ejemplo de este post, al utilizar char server[] = «www.mipagina.cl»; funciona solo el «Serial.print» otorgándome los datos en el monitor serial pero me arroja el error «Error al conectarse al servidor» .

    6.- Al utilizar IPs (obviamente comentado Ethernet.begin(mac); y habilitando Ethernet.begin(mac, ip, myDns); ) No logra conectarse. (Arroja el mismo error)

    7.- He probado con la IP y DNS que aparece en Ethernet Conexión, con una del mismo rango, con una distinta , con la que aparece en la LAN. con un rango de la ip del router, con la ip publica, etc etc he hecho muchas pruebas distintas pero nada. Busque un script en la página de Arduino para comprobar la IP de la placa y nada.

    8.- También Comprobé el script PHP en forma manual y funciona correctamente ingresando datos a la Base ( se que no tiene nada que ver pero igual hice la prueba)

    9, Hice las pruebas habilitando el DHCP desde el Router y las mismas pero con ips fijas en la IPv4 … nada

    Lo único claro es que es un problema con el DHCP

    Bueno disculpa por abusar de tu voluntad pero si me puedes ayudar este problema , también se puede ayudar a otros a resolverlo, ya que he estado varios días buscando y hay muchas preguntas sobre este error pero nada de respuestas ya que se debe tratar solo de un problema con la configuración de la red local y no de la placa.

    Saludos y desde ya muchas gracias

    Eduardo

    1. Eduardo, siempre recomendamos tener dos placas, al ser placas de prototipo muchas veces los procesadores «mueren» por conexiones equivocadas o de tanto probar.

      Saludos

  48. Hola buen dia,

    una pregunta como configuraste tu servidor para que pudiera recivir los datos que esta enviando ya que tu tienes conexion exitosa HTTP/1.1 200 OK y a mi me sale este
    HTTP/1.1 404 Not Found pudieras ayudarme orientandome para la configuracion.

    Gracias

    Saludos

  49. ME muestra un error en HTTP/111

    #### Internetdelascosas.cl ####
    Sensor de temperatura LM35/ web
    Direccion IP: 192.168.2.99
    Sensor LM35: 75.68 grados Celsius
    Iniciando conexion…
    HTTP/1.1 403 Forbidden
    Date: Fri, 24 Oct 2014 17:03:32 GMT
    Server: Apache/2.4.9 (Win64) PHP/5.5.12
    Content-Length: 312
    Connection: close
    Content-Type: text/html; charset=iso-8859-1

    403 Forbidden

    Forbidden
    You don’t have permission to access /sensor/sensorarduino.php
    on this server.

    Apache/2.4.9 (Win64) PHP/5.5.12 Server at 192.168.2.2 Port 80

  50. Hola amigo buenos dias, tardes o noches, tengo una duda quisiera implementarlo en un proyecto no eee manejado arduino, mi proyecto tiene que aser alguns ksas kmo las que hace tu codigo, medir temperatura y humedad esta tendra focos conectados de 5 volts, al pasar sierta temperatura deberan de apagar ls focos y prender un disipador, cuando se regule de nuevo la temperatura se apaga el disipador y se vuelve a prender el foco, y almasenara tdos sus datos en una base de datos podrias ayudarme

    1. Estimado, casi todo lo que necesitas esta en el codigo, pero debes considerar el uso de relays para prender los focos ya que no los puedes conectar directamente al Arduino.

      Saludos

  51. Hola, joniuz.

    Tengo una consulta lo que pasa es que soy novato en esto de Arduino y PHP y esas cosas, y tengo una dud inmensa sobre como puedo hacer por ejemplo.

    Mi proyecto es Telecontro de un Invernadero entonces ya tengo en Arduino el codigo para que lo haga automaticamente el proceso, pero la parte telematica que viene a ser controlar la activacion de salidas por medio de un servidor web alojado en una PC, como podria hacer eso, en mi caso tengo sensor de Temperatura, Humedad, Luminosidad y dependiendo de sus valores activo salidas como Calefaccion, Ventilacion, Valvulas para Riego y Encendido de Luz Artificial(Focos).

    Quisiera saber si me puedes ayudar, de que manera puedo yo por medio de mi pagina web que voy a crear al momento de pulsar un boton activar una respectiva salida y que me muestre el valor del sensor y el estado de la Salida(Calefaccion On por ejemplo).

    Y que los valores presentados de los sensores me los guarde en una base de datos para poder tener registros diarios de los sensores.

    Espero que me puedas ayudar de antemano muchas gracias.
    Saludos desde Ecuador.

    1. Jorge

      Uno de los principales objetivos de este sitio es motivar a las personas para que aprendan mas de programacion asi que estamos contentos de que como novato te intereses mas en estos temas.

      Gran parte de lo que necesitas esta en este tutorial que es un poco mas avanzado

      http://www.internetdelascosas.cl/2014/07/14/estacion-mereorologica-capturando-temperatura-humedad-y-luminosidad-en-mysql-usando-apache-php-arduino-ethernet-shield/

      Para controlar las salidas debes usar reles en el lugar de los diodos LED. El codigo guarda todos los datos en una base de datos asi que gran parte de lo que requieres esta en el tutorial.

      Saludos

  52. hola quiciera saber como hacer en la consulta GET si es qeu quiciera introducir 4 atributos en una base de datos,… digamos q quiera introducir un nombre apellido y un telefeno junto con la temperatura. (se q no tiene sentido pero es un supuesto)
    mi codigo:
    client.print(«GET http://localhost/conexion.php?Ci_Doctor=&Ci_Paciente=&Codigo_Arduino=&Temperatura=«); //php page invoking my web service
    client.print(Ci_Doctor);
    client.print(Ci_Paciente);
    client.print(codigoArduino);
    client.print(TempC);

    pero no funciona porque agrega todo al final en lugar de agregar en su posicion

    1. Alejandro, tienes que ir construyendo la URL de la forma conexion.php?variable1=valor1&variable2=valor2&variable3=valor3 un ejemplo en arduino

      client.print(«GET /sensorarduino.php?id=joniuz&temperatura=»);
      client.print(t);
      client.print(«&humedad=»);
      client.print(h);
      client.print(«&luminosidad=»);
      client.print(luminosidad);
      client.println(» HTTP/1.1″);

      Ve el siguiente tutorial donde enviamos 3 variables

      http://www.internetdelascosas.cl/2014/07/14/estacion-mereorologica-capturando-temperatura-humedad-y-luminosidad-en-mysql-usando-apache-php-arduino-ethernet-shield/

      Saludos

  53. Buenas tardes, tengo un problema al meter los datos del arduino a la base de datos, el problema creo que es que, tengo instalado el programa Easyphp con todo, apache, mysql, phpmyadmin etc… cuando me quiero conectar a la base de datos a traves del ordenador solo puede acceder a traves de la localhost(127.0.0.1), si pongo mi direccion IP del ordenador no conecta, entonces luego al pasar el programa desde arduino y meter mi direccion ip del servidor (192.168.1.40), no me hace nada.
    Gracias por su tiempo, un saludo.

    1. Cesar, prueba desde otro computador conectado en la misma red para ver si tienes acceso al ip del servidor, probablemente el servidor tenga un firewall que bloquea el puerto 80, debes permitir ese acceso desde cualquier ip de tu red.

      Saludos

  54. Saludos joniuz

    Te felicito por tu proyecto esta de pelos, y mas si lo compartes

    Quisiera que me ayudes con un proyecto que me estoy planteando

    quisiera mover 2 servos via web con un arduino mega 2560 conectado un shield ethernet, ,me explico:

    Primer paso:
    quiero tener conectado un arduino mega 2560 con un shield joystik a mi pc esta pc dentro de mi lan
    Segundo paso:
    quiero tener otro arduino mega 2560 conjuntamente con un shield ethernet y un par de servos tambien dentro de mi lan(ojo no conectado a la pc)
    Tercer paso:
    Enviar los valores analogicos que me entrega el joystik del primer arduino y enviarlos al segundo arduino el cual movera los servos, espero me entiendas

    tengo entendido que se puede hacer eso pero con un mismo arduino, y en ejemplos he visto solamente con botones, y no como pienso hacerlo, adjunto una imagen para explicarme mejor y espero me puedas ayudar con mi proyecto

    https://dl.dropboxusercontent.com/u/193085204/SHIELD.jpg

    Gracias

    1. Hola! Lo que propones se puede realizar, pero debes considerar varias cosas
      1) La aplicacion es en tiempo real? es decir los servos deben moverse inmediatamente o puede haber un retardo entre el movimiento del Joystick y en servo?
      2) Al enviar todo via ethernet solo agregas mas complejidad al proyecto y no ganas mucho. Has visto la opcion XBee y Arduino Esplora?

      http://www.arduino.cc/en/Main/ArduinoBoardEsplora

      Saludos!

  55. Hola Joniuz
    Soy aun novato en Arduino y hay untema que me esta volviendo loco:

    Arduino se conecta via ethernet a un servidor web (windows apache) y ejecuta un programa php.
    El programa php lee algunos valores y los envia con un ECHO «$A» por ejemplo.

    Hice mi propio sktech recibiendo siete valores en siete variables … pero funciona cada vez que le da la gana … supongo que algo me falta.
    Me copie este codigo …. y le modifique la linea que invoca al php … como resultado me trae la respuesta del servidor entre otra informacion que no me interesa, al final me trae los codigos que quiero.
    El problema es que no se como capturarlos ….. necesito capturar esos codigos para que arduino haga algo.
    te copio PARTE del codigo php primero:
    echo «$rs[0]»; // idsalida
    echo «$rs[1]»; // accion
    echo «$rs[2]»; // hora de inicio
    echo «$rs[3]»; // minuto de inicio
    echo «$rs[4]»; // tiempo en horas
    echo «$rs[5]»; // tiempo en minutos
    cuando lo ejecuto desde un navegador me muestra los datos uno al lado del otro.

    cuando lo ejecuto desde arduino, en el serial muestra lo siguiente:

    Starting ethernet…
    192.168.1.19
    Ready
    connecting…connected
    HTTP/1.1 200 OK
    Date: Thu, 30 Apr 2015 04:40:40 GMT
    Server: Apache/2.4.10 (Win64) PHP/5.6.2
    X-Powered-By: PHP/5.6.2
    Content-Length: 11
    Connection: close
    Content-Type: text/html; charset=UTF-8

    01i00590125 —–> este es el codigo que me interesa
    disconnecting.
    Pass 1

    Entonces, se que llega … pero llega con todo el relleno anterior:

    como puedo hacer para eliminar todo lo anterior y solo quedarme con el codigo concatenado como 11 caracteres. Este es el codigo (no es mio y la verdad que cada vez que lo trato de entender me vuelvo loco):

    #include
    #include

    // this must be unique
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

    IPAddress ip(192,168,1,19);
    IPAddress gateway(192, 168, 1, 50);
    IPAddress subnet(255, 255, 255, 0);
    IPAddress server(192,168,1,50); // Dell
    char serverName[] = «192.168.1.50»;
    int serverPort = 80;
    EthernetClient client;
    int totalCount = 0;
    char pageAdd[64];

    // set this to the number of milliseconds delay 30 seconds
    #define delayMillis 30000UL

    unsigned long thisMillis = 0;
    unsigned long lastMillis = 0;

    void setup() {
    Serial.begin(9600);

    // disable SD SPI
    pinMode(4,OUTPUT);
    digitalWrite(4,HIGH);

    // Start ethernet
    Serial.println(F(«Starting ethernet…»));
    Ethernet.begin(mac, ip, gateway, gateway, subnet);

    Serial.println(Ethernet.localIP());

    delay(2000);
    Serial.println(F(«Ready»));

    }

    void loop()
    {

    thisMillis = millis();

    if(thisMillis – lastMillis > delayMillis)
    {
    lastMillis = thisMillis;
    sprintf(pageAdd,»/dsriego.php?plc=1″,totalCount);
    if(!getPage(server,serverPort,pageAdd)) Serial.print(F(«Fail «));
    else Serial.print(F(«Pass «));
    totalCount++;
    Serial.println(totalCount,DEC);
    // Serial.println(«——-«);
    //Serial.println(Lectura[1]);
    delay(3000);
    }
    }

    byte getPage(IPAddress ipBuf,int thisPort, char *page)
    {
    int inChar;
    char outBuf[128];
    // Lectura[1]=»»;

    Serial.print(F(«connecting…»));

    if(client.connect(ipBuf,thisPort) == 1)
    {
    Serial.println(F(«connected»));

    sprintf(outBuf,»GET %s HTTP/1.1″,page);
    client.println(outBuf);
    sprintf(outBuf,»Host: %s»,serverName);
    client.println(outBuf);
    client.println(F(«Connection: close\r\n»));
    }
    else
    {
    Serial.println(F(«failed»));
    return 0;
    }

    // connectLoop controls the hardware fail timeout
    int connectLoop = 0;

    while(client.connected())
    {
    while(client.available())
    {
    inChar = client.read();
    Serial.write(inChar);
    // set connectLoop to zero if a packet arrives
    connectLoop = 0;
    }
    connectLoop++;
    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
    // then close the connection from this end.
    Serial.println();
    Serial.println(F(«Timeout»));
    client.stop();
    }

    // this is a delay for the connectLoop timing
    delay(1);

    }

    Serial.println();

    Serial.println(F(«disconnecting.»));
    client.stop();

    return 1;
    }

  56. Hola buen día, excelente proyecto y muy interesante, disculpa que te moleste, mi nombre es Christian Alatorre soy estudiante de la Universisad Tecnológica de Tijuana, estudio la carrera de TICS en el area de redes y telecomunicaciones, en este momento unos compañeros yo nos encontramos haciendo un proyecto para la universidad de domótica controlado desde la interfaz web utilizando: Raspberry pi2 como servidor web local, Arduino como actuador, reles, dispositivos (focos, ventiladores, persianas, una puerta de garage, etc.) y un circuito de regreso para conocer el estado del foco, el problema que tenemos es con el estado de los dispositivos, hasta ahora hemos hecho que desde la interfaz web del servidor apache de raspberry se enciendan y se apaguen los focos (o sea que el arduino si recibe la información que le enviamos) pero no hemos podido obtener datos del arduino para mandarlos a la web, mi pregunta es conoces algun método que nos pueda funcionar? Haz trabajado con algo como esto? te agrego un diagrama a bloques de lo que estamos haciendo y un enlace de descarga de un video de lo que llevamos, mis compañeros y yo somos de la idea del OPEN SOURCE así que cualquier descubrimiento o avances estaremos dispuestos a compartirlo con las demas personas que puedan ayudarnos ya que somos nuevos en esto y creemos que quiza nuestros problemas estan en nuestro poco conocimiento de programación, de antemano muchas gracias por tu tiempo.

    este es el enlace al video
    https://mega.co.nz/#!ZY8Q2ThC!UADlEEBmsGdosYpPTS-oIc8QdtH0UO5ttchknElpfS0

    aquí te dejo mi correo por si puedes responderme
    christianalatorre@outlook.es

    1. Hola Christian, Me parece bien interesante el proyecto, y es completamente factible de realizar. Al ver el video me surgen algunas dudas. Hablas de una Raspberry Pi2 que no veo por ningun lado pero que supongo que existe, Que lenguaje de programacion usas para el servidor web? La forma que veo en que comuniques la Raspberry Pi con el Arduino es via serial, puedes escribir un pequeño codigo en python que realice esa funcion, y de hecho puedes escribir todo el programa en python. Te enviare mi correo electronico para comunicarnos de forma mas directa.

      Saludos!

  57. Buenos dia, estoy intentando usar tu programa pero en mi caso estoy utilizando un servidor web, ya tengo configurado de manera correcta el script de php, e inclusive ya le di los parametros correctos al codigo de arduino, pero al ejecutar el codigo no me muestra nada registrado en la base de datos, esto es lo que logro ver al momento de ejecutar, esto es lo que me arroja:
    #### PROYECTO BD ####
    Sensor LM35: 33.20 grados Celsius
    Iniciando conexion…
    Bandera2
    Bandera
    HTTP/1.1 200 OK
    Date: Thu, 11 Jun 2015 05:56:10 GMT
    Server: Apache
    X-Powered-By: PleskLin
    Content-Length: 0
    Connection: close
    Content-Type: text/html

    Desconectando…

    1. Rogelio, por lo que ves en el monitor serial el Arduino se esta conectando al servidor, ahora hay que ver que pasa en el servidor. Puedes ver el registro log del servidor Apache? que servidor es? (windows o Linux?) en Linux normalmente el registro log esta en /var/log/httpd/ o en /var/log/apache2. Con estos datos te puedo indicar exactamente que pasa.
      Saludos

  58. Buenas Noches, gusto en saludarte joniuz, estoy desarrollando el proyecto usando el servidor local Xampp pero estoy teniendo problemas al configurarlo y no logro que se conecte, podrias echarme una manito?

    1. Hola!

      Lo primero que debe probar es que el servidor local funciona correctamente desde cualquier navegador, es asi? Luego debes probar la conectividad entre Arduino y el servidor Xampp.

      Saludos
      JZ

  59. cuando lo hago con un dallas
    se demora muchisimo poniendome los datos del server
    Date: Wed, 26 Aug 2015 01:19:35 GMT
    Server: Apache/2.2.16 (Debian)
    X-Powered-By: PHP/5.3.3-7+squeeze19
    Vary: Accept-Encoding
    Content-Length: 0
    Connection: close
    Content-Type: text/html

    a que se puede deber?

    1. Javi, exactamente esos no son los datos del server, es la respuesta que envia el servidor una vez que recibe la conexion. Si se demora es porque el acceso a la red esta lento. Es un servidor local? o un servidor en la nube? accedes directamente al IP? o mediante un registro DNS?

      Saludos

  60. Hola.
    Muy buena la ayuda, pero no puedo conseguir que el GET funcione.
    tengo:
    client.print(«GET /SSS/src/cron/ena.php?sensor1=»);
    client.print(sensor[0]);

    No recibo nada
    Tengo conexion al servidor, sera por la ruta?

    1. Javier, has visto el archivo log del servidor? si es por la ruta deberias ver un error 404. Tambien deberias ver el error en la puerta serial del Arduino.

      Saludos
      JZ

  61. Hola Joniuz
    tengo una consulta, la idea de proyecto es la siguiente:
    remotamente y conectado a un puerto GSM emiten datos varios (temp, pausas, reinicios, etc) con un peso de 100kb aprox por estacion.
    el problema es el siguiente:
    recibir la señal a una base de datos en internet (la opcion que manejo ahorita es una DB en una direccion web personal, si hay mejores opciones recibo propuesta), la funcion en esta web es almacenaje solamente, para luego ser leida en una interfaz cliente ya sea android o pc.
    la duda es ka siguiente:
    1- es factible?
    2-que lenguaje de programacion necesito, o recomiendas en general, para cada parte del proyecto o en general?
    3- propuestas de mejora,

    gracias

    1. Hola Joao
      El proyecto es completamente factible, solo cambiaria lo de la base de datos, en verdad lo que recibe la informacion es una aplicacion y esta es la que se encarga de escribir los datos en la base de datos.
      Lenguajes? Para las estaciones basta con un Arduino y un modulo GSM, para el servidor puedes usar PHP o Python.
      Saludos

  62. Estimado,
    Estoy armando una boya con sensores ambientales (viento, temperatura, etc) que toma datos a un par de km de la costa. En esa boya un arduino ProMini formatea los datos en un registro de 32 bytes cada 5 minutos y los envia a tierra via VHF. En tierra, un receptor VHF se los transfiere a otro Pro Mini y ahi, los datos se presentan en un LCD de 20×4 caracteres y ademas se almacenan en una memoria Flash de 8Mbytes.

    Hasta aqui todo bien.

    Ahora quiero enviar cada registro via Internet a un servidor ubicado en otra ciudad. Para ello compre la tarjeta WIZnet con el chip W5100 (yourduino.com) y la conecte a los pines SPI de mi Pro Mini y tambien a mi router usando el conector RJ45 . La felicidad llego hasta ahi.

    El Sketch de ejemplo no funciono y solo ejecuta hasta donde se muestra a continuacion

    #include
    #include

    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

    //// en mi PC con >ipconfig veo mi IP como 192.168.1.155
    IPAddress ip(192, 168, 1, 4);
    EthernetServer server(80);

    //_____________________
    ///////////////////////////
    void setup() {
    Serial.begin(9600);

    Serial.println(«Trying to get config info from DHCP server»);

    delay(1000);

    if ( Ethernet.begin(mac) ) Serial.println(» OK»);

    else Serial.println(» —- Not OK»);
    }

    He intentado muchas variantes de IP, pero solo recibo —- Not OK
    Mis conocimientos de electronica y programacion son bastantes buenos, sin embargo Internet, WEB, IP, DHCP, etc es similar al chino antiguo para mi.

    He descartado la tarjeta ya que compre dos y ambas presentan los mismos sintomas.
    Los LEDs de la tarjeta detectan 1) la presencia de un enlace al router, 2) una coneccion de 100Mb/s, 3) enlace Full duplex, 4) que no hay colision y el penultimo LED marcado Rx ocasionalmente se enciende. Finalmente el LED marcado Tx nunca se ha encendido.

    Alguna sugerencia ?

    Gracias de antemano.
    Slds
    Yanko

    1. Estimado Yanko, cada tarjeta viene con su libreria, esta instalada? al mismo tiempo vienen con codigos de ejemplo, funcionan? la red a la cual esta conectadon el equipo usa IP fijo o DHCP para asignar IPs dinamicos?
      Por ahi debes empezar, pero asi a la distancia es dificil diagnosticar un problema.
      Saludos

  63. Estimado, estoy tratando de entender la libreria ethernet pero aun tengo algunas dudas.
    Mi intencion es enviar una cantidad X de pulsos al arduino, que este los reciba y los guarde en un contador, luego discrimine que tipo de datos es en base a los pulsos, y luego los envie por medio de un httpRequest, y cuando reciba la respuesta del servidor se detenga la conexion hasta que exista un contador y tipo de dato a enviar, y volver a establecer conexion.. envio datos.. respuesta…

    mi codigo es el siguiente

    [Codigo editado…]

    El problema es que cuando ingresa el primer tren de pulsos, lo reconoce, lo analiza, lo envia, recibe la respuesta, la imprime…. pero al enviar el segundo tren de pulsos ya no se conecta al servidor..

    Me interesa tener como conocimiento:

    – Establecer la conexión, quizas por medio de un while hasta que se logre(que lo comprendo a medias)
    – Enviar el httpRequest (comprendido)
    – Esperar y recibir respuesta (No se como hacer esta parte del todo bien).*******
    – Cerrar conexión para no consumir recursos.

    Cualquier ayuda sera bienvenida

    1. Francisco, lamentablemente este sistema de comentarios de WordPress no permite ver bien el codigo, por lo que te recomiendo crearte una cuenta en GitHub o BitBucket para subir el codigo y compartirlo.

      Por lo que revise, tienes un «if» para validar si la conexion esta activa, pero que pasa si no lo esta? no hay codigo para ese estado, por eso solo funciona para el primer tren de pulsos, para el segundo la conexion se ha cerrado y no hay ninguna instruccion para re iniciarla.

      Saludos.
      JZ

  64. hola excelente post, disculpa tengo una duda, tengo un control de accesos mediante huella digital en arduino, lo que hago es guardar en una base de datos, quien ingreso y la hora en la que ingreso la persona, esto lo hago mediante un id que suelta el sensor, y lo envio al servidor para que lo lea, pero tambien quiero que a su vez el servidor le mande el nombre de la persona al arduino y este lo imprima en un lcd, como puedo hacerle para que el servidor mande este dato y arduino lo lea?

  65. Hola.
    He seguido este tutorial como guía, la verdad es me me ha ayudado a comprender algunos aspectos del sensor. Muchas gracias de ante mano.

    Estoy Intentando conectar un dht11 a mi arduino YUN . La conexión de este arduino funciona muy bien usando http Client y Bridge.

    Estoy usando un servidor con los archivos en php para la conexión a mysql y así almacenar los datos al mismo tiempo que los visualizo por pantalla. Uso Get porque quiero tomar las temperaturas/humedades cada hora por tanto no necesito manejar muchos datos.

    Lo que intento es que por un lado me de la lectura por pantalla de la temperatura y humedad algo que hace a la perfección. Por otro lado estoy encontrando problemas para que estos datos sean enviados correctamente a la base de datos, cada vez que envía los datos a mysql envía «0» tanto en temperatura como en humedad, a pesar que en pantalla me da correctamente las medidas en MySQL no se ingresa con el valor tomado.

    La forma de envío es así:
    client.get(«http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=t&humidity=h»);

    De esta manera en la base de datos ingresa «0» en temperatura y humedad

    Pero si sustituyo «t» y «h» por un entero, se ingresa correctamente estos dos datos, Por ejemplo

    client.get(«http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=5&humidity=6»);

    En este caso ingresa en temperatura «5» y en Humedad «6»

    Si alguien me pudiera ayudar se lo agradecería- Dejo aquí el código:

    #include
    #include
    #include
    #include
    #include

    #define DHTPIN 2 // pin de salida
    #define DHTTYPE DHT11 // DHT 11

    DHT dht(DHTPIN, DHTTYPE);

    void setup() {

    Bridge.begin();
    Serial.begin(9600);
    Serial.println(«DHT11 test!»);

    dht.begin();
    while(!Serial);

    }
    void loop() {
    // Initialize the client library
    HttpClient client;
    int h = dht.readHumidity();
    int t = dht.readTemperature();

    // Make a HTTP request:
    client.get(«http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=t&humidity=h»);

    if (isnan(t) || isnan(h)) {
    Serial.println(«Failed to read from DHT»);
    } else {
    Serial.print(«Humidity: «);
    Serial.print(h);
    Serial.print(» %\t»);
    Serial.print(«Temperature: «);
    Serial.print(t);
    Serial.println(» *C»);
    }
    delay(10000);
    Serial.flush();
    }

    ______________
    Un saludo
    Óscar

    1. Oscar, el error sucede porque el lenguaje de Arduino no reemplaza la variable, simplemente la toma como un string. Lo que debes hacer es concatenar la variable construyendo la llamada GET por partes.

      Basate en el ejemplo original, revisa el codigo en nuestro repositorio GitHub, desde la linea 170 a la 175 esta la forma de concatenar el string del GET con las variables

      https://github.com/internetdelascosas/estacion-meteorologica-arduino/blob/master/arduino/SensorDHTxxWeb.ino

      Saludos
      JZ

  66. Hola JZ

    He quitado aquellas instrucciones que tienen que ver con los lets y con ETherNet pues trabajo con Yun.
    El depurador me dice que la libreria «clase» HttpClient no tiene el objeto «connect » en la instrucción:
    if (client.connect(server, 80))

    Como podría sustituirlo por otra instrucción que funcione? Creo que la estructura es para Ethernet.h y yo estoy usando «Yun» con la libreria y

    También he sustituido el IP address por char server[] con el nombre del servidor.

    ( Código editado…)

    Muchas gracias de ante mano por tu ayuda.
    Óscar

    1. Oscar

      Arduino Yun trabaja con otras librerias, te recomiendo editar tu codigo inicial (el que funcionaba en Arduino Yun) cambiando la linea

      client.get(“http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=t&humidity=h");

      Por


      String get_str = "";
      get_str = “http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=" + t + "&humidity=" + h;
      client.get(get_str);

      Saludos
      JZ

  67. Muchas gracias por tu atenta respuesta.

    ¿qué siginifica «stray ‘\’ in program» ?
    Me da en «get_str = “http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=» + t + «&humidity=» + h;»

    Óscar

    1. Orcar, debe haber un caracter extraño en el codigo, trata de escribir o pegar primero en un editor de texto, las paginas web siempre agregan caracteres de escape o control.
      Saludos
      JZ

  68. Hola JZ

    Es cierto, sustituía las comillas iniciales por «â€» pero en transparente, no se veía. Ahora ya lo he modificado, tal como recomiendas, pero sigue dando la línea error.

    sketch_dec14a.ino: In function ‘void loop()’:
    sketch_dec14a.ino:32:77: error: invalid operands of types ‘const char*’ and ‘const char [11]’ to binary ‘operator+’
    invalid operands of types ‘const char*’ and ‘const char [11]’ to binary ‘operator+’

    Me señala el error en la línea con descripción:
    get_str = «http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=» + t + «&humidity=» + h;

    Saludos
    Óscar

    1. Oscar
      Eso pasa porque es un entero y lo estamos convirtiendo a char o string, sorry pero no tengo el compilador de Arduino aqui, pero la solucion deberia ser algo como esto (agregando String entre parentesis antes de cada variable para convertirla antes de usarla)

      get_str = "http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=" + (String) t + "&humidity=" + (String) h;

      Saludos
      JZ

  69. Hola JZ
    Me han recomendado usar la siguiente instrucción, con esta funciona correctamente pues trata la información como «char» ;

    char buffer[90];//no se, no he contado

    sprintf (buffer, «http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=%d&humidity=%d», t,h);

    client.get(buffer);

    Muchas gracias por tu ayuda. Un Forum genial, felicidades.
    Un saludo
    Óscar

  70. Hola Jz
    Perdona, Pongo a continuación al siguiente manera de hacerlo que también funciona y que es la que tu propones con «String» por si es de interés para alguien:

    client.get(String(«http://wi-sen.esy.es/dht11/sensorarduino.php?temperature=») + t + String(«&humidity=») + h);

    Nota: «String» la primera con mayúsculas

    Un saludo
    óscar

    1. Oscar, se puede realizar de multiples formas. Lo que siempre se debe tener presente es que la funcion client.get() recibe como parametro un string que corresponde a la URL que el servidor procesara via GET.

      Saludos
      JZ

  71. Que tal Joniuz, saludos desde Perú. Ando en la misma carrera de IoT que Uds. Me guié mucho de tus tutoriales pero ha sucedido lo siguiente: Ya tengo todo montado (arduino, ethernet, programacion arduino, servidor, php, mysql, etc.) hace 2 semanas funcionaba TODO OK, mi arduino leia este php (http://www.miprofe.org/iot/dameobjetos.php) perfectamente y podria procesarlo sin ningún problema.

    Hace 3 días, DEJO DE FUNCIONAR…!!!!

    Depurando revisé mi codigo arduino y a pesar de que se envia la petición GET, el client.available() no me devuelve bytes, es decir, bytes=0. NO OBTENGO RESPUESTA del php. Ojo que si logro conectarme con el client.connect(server,80), etc… recalco que hace 2 semanas funcionaba TODO OK, y ahora no.

    HEEEEELLLPPPPP!!! que puedo hacer???? Mil gracias.

    1. Jesus, revisa los archivos logs del servidor web y ve que peticion esta llegando desde el Arduino. Es lo primero que debes revisar.

      Saludos
      JZ

  72. Hola, el sensor Lm35 tiene alguna librería?
    así como el sensor DHT (#include «DHT.h»)
    o como reconoce el arduino al sensor?

    1. Fernando, el LM35 es un sensor analogo y entrega un valor entre 0V y 5V por lo cual se puede conectar directamente a una entrada analoga del Arduino, no requiere libreria.

      Saludos

  73. Podrías hacer un vídeo y subirlo a you tube de como hacer todo el procedimiento paso a paso, y que nos compartas el link, si no seria mucha molestia.
    🙂

  74. Hola de nuevo!
    Ya logre implementar el proyecto en centos 7 y funciono perfectamente, pero quisiera saber como le hago para mandar un correo electronico a mi cuenta de gmail cuando la temperatura se eleve, seria como una especie de alerta.
    Espero me puedas ayudar
    Saludos

    1. Anita, investiga sobre la funcion php mail(), con esa funcion mas un if validando la temperatura puedes enviar el email desde el servidor.

      Saludos

  75. hola buen dia, vi tu post y esta muy bueno y me ha sido de mucha ayuda, pero tengo una pregunta ya que he intentado y no lo he logrado, es acceder a mi servidor arduino desde otra conexcion a internet, x ejemplo el arduino esta en mi casa y desde el internet de mi vecino nos conectamos para controlar el apagado y encendido de un led y no podemos acceder, como podemos lograr esto?, de antemano muchas gracias!! saludos!!

    te paso mi codigo:
    (Codigo borrado)

    1. Oliver, para acceder desde internet al Servidor (supongo que estara dentro de tu casa) debes abrir puertos en el modem o firewall que te da el acceso a internet. Debes tener el usuario de administracion y conectarte al equipo para permitir acceso desde internet al IP del servidor local, normalmente el puerto a abrir es el 80 (servidor web). Como las direcciones IP en internet son controladas y cambiadas por el proveedor es necesario que instales un programa como No-IP (www.noip.com) para que en caso de cambiar la direccion IP no te quedes sin conexion a la casa.

      Saludos

  76. Hola, tengo el siguiente dilema.
    Elaboré un programa en arduino que detecta movimiento. ya está el código así como los archivos php, mi duda es cómo puedo subir mis archivos php a wamp que es un servidor apache

    Nota: Son 6 archivos php, el index, 2 comandos y otros 3 archivos

    1. Estimado Adan, todo depende donde esta el servidor, a veces puedes instalar el servidor en tu propio computador portatil y es solo copiar los archivos a la carpeta del sitio web. Cuando es un servidor remoto, normalmente se suben via FTP o SFTP.

      Si nos indicas donde esta el servidor te puedo ayudar mas.

      Saludos

  77. no hay forma de que pueda ingresar datos a la base de datos desde arduino, manualmente lo puedo hacer.
    pero creo q l problema esta aca pues arduino en l ejemplo clienteweb se concta bien a google.com, de alguna forma esoty indicando mal la ruta.

    IPAddress server(192,168,0,26);

    client.print(«GET prueba/lentes.php?valor=»);
    manualmente en la misma dirección 192,168,0,26/ prueba/lentes.php?valor=xxx ingresa muy bien.

    saludos

    1. Hola Rony, al parecer falta un / despues del GET, con eso le indicas al servidor que la ruta del script comienza desde la raiz del servidor. Lo otro que puedes revisar son los archivos logs del servidor web y ver que error aparece ahi.
      Saludos

  78. hola he probado tu aporte y a mi me sale en el monitor serial Dirección ip : 0.0.0.0 e iniciar sesión pero no me sale que le envía al servidor .. otra pregunta en el código de arduino donde escribes char server[] que es el que tiene nombre del servidor si mi servidor es local cómo escribo ? estoy utilizando el xampp y mis páginas de php los cargo en el www pero ahí en el nombre no sé como colocarle … espero me puedas ayudar gracias de antemano 🙂

    1. Hola Fran, lo primero que te recomiendo es que busques informacion de como configurar tu red local, si por ejemplo usas la red de tu casa, debes tener un dispositivo que se llama router-modem o «cosa» que te conecta a internet, este dispositivo se encarga de asignar las direcciones IP a los equipos que desean conectarse a la red, si recibes 0.0.0.0 en el Arduino quiere decir que este dispositivo o no te asigno direccion IP, o simplemente debes asignarla a mano.
      Con respecto a la direccion IP de tu servidor local, todos los servidores o computadores conectados a una red IP deben tener una direccion que les permite comunicarse con los otros, sabes cual es la que tiene tu computador? es esa direccionla que deves colocar en server[]. Espero que te sirva esta informacion, pero debes leer un poco mas de redes IP.
      Saludos

  79. Buenas esto se puede hacer teniendo un hosting gratis?, estoy intentando pero nada no me inserta los valores en la base de datos, en el arduino en el monitor serial me manda todo lo que pusiste pero no se que pasa, ya verifique todo, lo de usuario y contraseña, pero aun no me envia a mi pagina

    1. Hola Jose, se puede hacer en un hosting gratis, pero como es gratis no te daran acceso a los archivos logs del servidor web que justamente son los que tienes que revisar para ver donde esta la falla.
      Por que no instalas un servidor en tu mismo computador? Hay soluciones empaquetadas para Windows que instalan todo. Si usas Linux, probablemente tengas el servidor instalado.
      Saludos

  80. Hola, lei el tutorial y me parecio excelente, tengo una pregunta, es posible adaptar todo para utilizar el modulo GSM900 en vez del modulo Ethernet de Arduino? Podrias indicarme como?

    Saludos.

    1. Raimundo, si, es posible usar el modulo GSM900 pero hay que cambiar el codigo y eso da para otro tutorial. Puedes ver los ejemplos que vienen con el modulo GSM900 y utilizar los que consultan a webservices cambiando el servidor de destino y a URL de consulta.
      Saludos.
      JZ

  81. Hola joniuz, gusto en saludarte. Aprovecho de dar las gracias por compartir tus conocimientos y experiencias. Necesito consultarte lo sgte. Necesito guardar la información consultada por un lector RFID a una Pulsera RFID , y almacenarla en una base de datos en SQL SERVER. Estoy empezando recién con el RFID y no tengo muy claro como podría lograrlo y/o que elementos de hardware podría ocupar; así como también en que lenguaje me recomiendas desarrollar en caso de ser necesario.

    desde ya muchas gracias y espero puedas tenderme una mano.
    un abrazo

    1. Claudio, nosotros desarrollamos ese mismo proyecto con Raspberry Pi + Modulo RFID-RC522, la base de datos es MySQL y programamos en Python.
      Saludos
      JZ

  82. Hola, amigo tengo duda sobre a que te refieres con nombre del servidor web que recibirá los datos, ya coloqué mi IP de mi computadora y la IP del servidor local web de localhost y me aparece todo el msj por el puerto serial que debe aparecer pero enseguida me arroja etiquetas html con 403 Forbidden y que no puedo accesar a /sensorarduino.php.

    Con respecto al proyecto que estoy desarrollando, es sobre sensar la temperatura mediante Arduino e insertar esos datos mediante php a una base de datos en mysql pero tengo problemás básicos con el montado en la shield y estoy usando un router tplink, no sé si debe revisar las configuraciones DHCP de mi router o moverle algo.

    1. Raul, el servidor es el computador que recibira los datos, para recibirlos debe tener un servidor web corriendo y los scripts necesarios (archivos php) para que pueda tomar esos datos y insertarlos en la base de datos. Localhost es un alias que usan los computadores para referirse a si mismos (interfaz loop back), no confundas esto con la direccion IP del servidor.
      Saludos
      JZ

  83. Hola! Quiero hacer un proyecto en el cual guarde datos en algun servidor de geolocalización de vehiculos. ¿como puedo hacer eso usando arduino? ¿tendria que tener arduino y un modulo gsm-gprs? la pregunta mas importante ¿como hago para que mi placa se conecte a internet y mande datos al servidor en cuestion via tcp/ip? muchas gracias!

    1. Hola Agustin, lo primero que te preguntare es ¿este proyecto es para aprender o para desarrollar un producto? si es para aprender estas en lo correcto, debes tener un Arduino, de preferencia el Arduino Uno, una Shield GPRS y un modulo GPS. La programación de la Shield GPRS para que se conecte a Internet dependerá del modelo que uses.
      Si deseas hacer un producto, créeme que te saldrá mas caro hacerlo con Arduino, actualmente en el mercado hay varios dispositivos Tracker GPS para vehículos que son económicos y de buenas prestaciones.
      Saludos
      JZ

  84. Hola buenas noches, quisiera saber si me puedes ayudar con un ejemplo en donde se pueda enviar un dato generado por un sensor DHT11 conectado en una placa Arduino Leonardo cada vez que suceda un evento (leer un sensor IR) al puerto serial y escribir esos datos en una base de datos MySQL que ya tiene configurada una tabla en donde se almacenan tres campos ID autonumerico, el dasto de temperatura y un timestamp para almacenar la fecha y la hora.

    Los datos del servidor son:
    WampServer Version 3.0.6 64bit
    Apache 2.4.23 – PHP 5.6.25 – MySQL 5.7.14
    PHP 5.6.25 for CLI (Command-Line Interface)

    Agradezco inmensamente la ayuda con el tema, es importante solucionar este tema para un proyecto de estudio. Muchas gracias.

    1. Cabe resaltar que no utilizo un ethernet shield, el tema seria capturar el valor del puerto serial directamernte a la base de datos, gracias

    2. Hola Johnny, basicamente todo lo que necesitas para escribir los datos en la base de datos MySQL esta en este mismo post.
      Lo que falta es la lectura del sensor, porque usas un sensor IR? que modelo usas?
      Saludos
      JZ

  85. me podrías ayudar con este error

    Dirección IP: 192.168.1.100
    Sensor LM35: 30.76 grados Celsius
    Iniciando conexión…
    HTTP/1.1 400 Bad Request
    Date: Mon, 07 Aug 2017 02:43:06 GMT
    Server: Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/5.6.30
    Vary: accept-language,accept-charset
    Accept-Ranges: bytes
    Connection: close
    Content-Type: text/html; charset=utf-8
    Content-Language: en

  86. Hola,

    Como puedo hacer los mismo pero no con el shield de internet, sino con el ENC28J60, me puedes ayudar porfa….

    Saludos,

  87. Hola amigo, te cuento q soy nuevo en esto pero viejo en el sentido de que hace rato q vengo tratando de ver completos estos temas, pero tengo un problema en tu ejemplo, conecto, me dice iniciando sensor dht11 y despues me aparece el mensaje de falla leyendo sensor dht11???
    por q sera esto, hay alguna trampa?
    Saludos

    1. Martin,
      No hay trampas, si no responde el sensor o esta malo, o los cables estan fallando. Lamentablemente la unica forma de probar es cambiar el sensor o cambiar el Arduino.
      Saludos
      JZ

  88. #### Internetdelascosas.cl ####
    Sensor de temperatura LM35/ web
    Direccion IP: 10.0.10.110
    Sensor LM35: 29.79 grados Celsius
    Iniciando conexion…
    HTTP/1.1 404 Not Found
    Server: nginx/1.10.2
    Date: Mon, 13 Nov 2017 13:33:08 GMT
    Content-Type: text/html
    Content-Length: 169
    Connection: close

    404 Not Found

    404 Not Found
    nginx/1.10.2

    Desconectando…

    1. Hola Martin

      Creaste el archivo sensorarduino.php? esta en la raiz de tu servidor? Si estas usando XAAMP debes ver donde esta la raiz de tu servidor y rear el archivo en esa ubicacion.

      El error 404 indica que el archivo no esta donde deberia estar.

      Saludos
      JZ

  89. Ayuda la base de datos no se actualiza solamnete si pongo en el navegador el link que me arroja la consola

    Sensor LM35: 12.00 grados Celsius
    Iniciando conexion…
    HTTP/1.1 302 Moved Temporarily
    Server: nginx
    Date: Sun, 28 Jan 2018 04:02:04 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked
    Connection: close
    Location: http://proyectoterminal.webcindario.com/prueba.php?id=joniuz&nombre=temperatura&valor=12.00
    X-Powered-By: Webcindario Hosting Service

    1. Hola Alexis, veo que estas obteniendo un error 302, revisa el servidor, probablemente no esta el archivo prueba.php donde debe estar (en la raiz del sitio).
      Saludos
      JZ

  90. Hola José, gracias por difundir este entretenido tema.
    Te cuento que estoy usando un servidor en la nube y puedo actualizar la base de datos con el programa php desde el browser e incluso desde una placa WiFi (NodeMCU LOLin), pero desde el Arduino con Ethernet Shield no me resulta. He cambiado la dirección MAC y la IP, pero no funciona. Sí llega a la instrucción «client.connect(server, 80)» y manda el mensaje de «Iniciando conexión..» por la puerta serial, pero no recibe la respuesta «client.available()» y no se actualiza la base de datos. Con qué más podría probar? Será un problema del firewall del proveedor de hosting?

    1. Hola Arturo, lo que describes indica que el Arduino no se esta conectando a la red, sabes que IP toma? has probado haciendole un ping a ese IP? has probado usando un servidor local primero?
      Saludos

  91. Hola, mi proble consiste en que el Monitor serial de arduio recibe la respuesta de la peticion a mi servidor local, con las etiquetas html y el valor que mando por GET, pero en mi pagina desde el navegador no las imprimee….

    1. Hola Gilbert, el alcance de este tutorial es obtener los datos desde el Arduino, no contempla imprimirlas en una pagina web para que las veas desde un navegador. Si tu implementaste esa función, tendríamos que ver el código para poder ayudarte.
      Saludos.

  92. felicitaciones por este gran espacio, tengo un problema con arduino y ethernet shield, tengo montado una base de datos mysql montado con xampp y desde el arduino envio el estado de dos pines digitales y muestra la informacion al mismo tiempo en una lcd 20×4 i2c, todo va de maravilla mientras halla conexion de red pero si se cae la red o se desconecta el cable el arduino nunca mas vuelve a contar los pulsos de los pines digitales. Como puedo solucionar este error? . mil gracias por tu atencion

    1. Hola Andres, El error que mencionas es porque Arduino no vuelve a renovar la conexion si es que la pierde, una forma de solucionarlo seria ejecutar un whatchdog que reinicie la conexión cada cierto tiempo, busca en google: arduino watchdog timer
      Saludos

  93. Estupendo tutorial, Joniuz.
    La verdad es que me ha resultado bastante útil para otros proyectos más. Ciertamente no tiene desperdicio alguno y abre muchas puertas para hacer proyectos Arduino+PHP en conjunto.

    Eso sí, conviene destacar la gran paciencia y generosidad que tienes para atender toda suerte de consultas (algunas surrealistas 🙂 y que muy, muy pocos te lo agradezcan.
    Se ve el bajo nivel de gratitud que existe en el mundo y el escaso interés en escribir bien (¿Es que casi nadie se acuerda de que existen los signos de puntuación?).

    En fin, muchas gracias por tu tiempo e interés en compartir.

  94. Hola amigo, muy bueno tu post, estoy tratando de hacer algo parecido usando tu post como demo para luego modificar a mis necesidades, la cuestión es que estoy usando un servidor en Internet gratuito y cuando trato de subir los datos me arroja este mensaje que necesito javascript, cosa que no hace si publico directamente los datos por navegador usando el link y me los guarda en la base de datos.

    Pero cuando lo hago con el arduino manda el mensaje a continuación y no guarda en la base de datos los valores.
    Puede ser que el servicio gratuito que estoy usando no lo permita??? usando el arduino.

    This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support

    1. Hola Yamir, no uses servidores gratuitos, estos colocan publicidad y normalmente requieren de JavaScript para hacerlo, por eso la exigencia de tener JavaScript habilitado, y Arduino no usa JavaScript.
      Create una cuenta en Amazon Web Services, puedes tener un servidor virtual gratuito por un año.
      Saludos
      JZ

  95. Hola joniuz excelente aporte, muchas gracias por compartir tu experiencia y conocimientos.
    Yo estoy iniciando en el mundo de arduino y necesito hacer un proyecto donde múltiples sensores HC-SR04 me envíen datos y poder almacenarlos en MySQL mariaDB, el tema es que algunos sensores están fuera de alcance a conexión inalambrica (WiFi) entre 100mst (2 sensores con Arduino) y 600mts (1 sensor con Arduino), con la conexión a energía 220V/5V no hay problema.
    Había pensado enviar los datos de los sensores con módulos NRF24L01 con antena (alcance de 1Km) y que estos sean recepcionados por un tercer Arduino que también tiene un módulo NRF24L01, de tal manera que este último por intermedio de conexión Serial envíe los datos a una Raspberry Pi 3 con LAMP y sean guardados en la base de datos para despues procesarlos.
    EL Arduino-1 tiene cargado y funcionando perfectamente el Sketch para un sensor HC-SR04 y se encuentra a 600mst de Arduino-3.
    El Arduino-2 tiene cargado y funcionando perfectamente el Sketch para dos sensores HC-SR04 y se encuentra a 100mst de Arduino-3.
    Los Arduino 1 y 2 deben transmitir esos datos al Arduino-3 que también tiene su módulo NRF24L01 para que los datos sean descargados a la Raspberry vía Serial.
    Al ver tu tutorial he decidido prescindir de la conexión Serial por que se me esta complicando demasiado el manejo de tipos de datos por ese medio, y optar por la Ethernet Shield y subir directamente los datos recibidos a la BBDD.
    Te escribo esto para que tengas una idea más clara de lo tengo y que puedo hacer.
    Tengo problemas con la transmisión y la recepción de los NRF24L01, se me esta complicando la cosa aquí, por más que he visto tutoriales al respecto no logro resolver el problema, de repente con tu experiencia y conocimiento me podrías tirar un salvavidas de como usar adecuadamente los NRF24L01 o al menos decirme donde puedo sacar información al respecto para poder concretar satisfactoriamente mi proyecto y no quede como una frustración en mi camino.
    Agradezco tu tiempo y paciencia y quedo a la espera de tus comentarios.
    Saludos.

    1. Hola Gustavo
      El proyecto que estas realizando es muy interesante, básicamente estas haciendo una «wireless sensor network» y creo que ya te has dado cuenta de los problemas, la tarjeta NRF24L01 es económica pero muy inestable, yo estuve trabajando con esta tarjeta y obtuve el mismo resultado, sensores que se desconectaban, problemas de comunicación, limitación en el tipo de datos. Puntos importantes que debes considerar, configurar la red en modo mesh, es decir, los nodos deben comunicarse entre si de tal forma que si uno no alcanza al nodo receptor, pueda enviar el mensaje a un nodo vecino.
      El proyecto lo dejé disponible en GitHUb en este repositorio https://github.com/internetdelascosas/Arduino-NRF24L01-DHTxx
      Finalmente debido a todos los problemas que presentó la tarjeta NRF24L01, decidí cambiar la capa de comunicaciones por módulos XBee creando una red mesh que hasta el momento han sido estables y confiables.
      Ahora estoy probando el controlador ESP8266 que permite conexiones Wi-Fi y tambien tiene un modo mesh, revisa nuestros últimos artículos.
      Saludos
      JZ

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *