Normalmente cuando queremos generar algún aviso con Arduino podemos emplear avisos luminosos o sonoros mediante leds o buzzers, sin embargo si no estamos en la misma estancia no nos enteraremos.
Para solventar este problema y con ayuda de un servidor web podemos hacer que Arduino nos envié correos electrónicos para avisarnos de lo que queramos, estemos donde estemos!
Para ello es necesario un Arduino con conexión a internet, como con una shield ethernet, WiFi o GSM, y también de un servidor web que permita la ejecución de código PHP y que permita usar la función mail(), ademas claro de que cuente de servicio de correo para que pueda enviar nuestros correos.
Código servidor
El siguiente código en PHP es un fichero que deberemos de subir a nuestro servidor, de pago o gratuito, y hacer que sea accesible desde internet. Si podemos acceder a él desde nuestro navegador entonces el Arduino también podrá.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php /** * URL: http://giltesa.com/?p=16650 * License: (CC) BY-NC-SA * * Example URL: * http://domain.com/mail.php?key=s7x45IUFBrHHDTw&name=Arduino&from=arduino@domain.com&to=youremail@domain.com&subject=Hello&message=This email was sent from Arduino! * * http://domain.com/mail.php * ?key=s7x45IUFBrHHDTw * &name=Arduino * &from=arduino@domain.com * &to=youremail@domain.com * &subject=Hello * &message=This email was sent from Arduino! */ // Authentication key, required to use this service: define("KEY", "s7x45IUFBrHHDTw"); // Possible output responses: define("OK", "1"); define("ERROR_AUTENTICATION", "2"); define("ERROR_PARAMETERS", "3"); define("ERROR_SEND_MAIL", "4"); // Parameters sent from the Arduino: $key = $_GET['key']; $name = $_GET['name']; $from = $_GET['from']; $to = $_GET['to']; $subject = $_GET['subject']; $message = $_GET['message']; if( !isset($key) || $key !== KEY ) { echo ERROR_AUTENTICATION; } else if( !isset($name) || !isset($from) || !isset($to) || !isset($subject) || !isset($message) ) { echo ERROR_PARAMETERS; } else { echo mail( $to, $subject, $message, "From: $name<$from>\r\nReturn-path: $from" ) ? OK : ERROR_SEND_MAIL; } ?> |
El fichero nos hará de WebService, y para funcionar necesita que le pasemos ciertos parámetros, todos ellos obligatorios.
El primero de ellos y el más importante es una contraseña sin la cual no podremos usar el servicio, así solo quién conozca la clave podrá enviar correos, nuestro Arduino!
El resto de parámetros son los relacionados con el envió del correo: Nombre del remitente, correo del remitente, correo del destinatario, asunto, y el mensaje.
Tras la ejecución del servicio recibiremos un número que nos indica el resultado de la ejecución:
- Email enviado con éxito.
- Error de autenticación.
- Faltan parámetros.
- Error al enviar el correo.
Código cliente
También necesitamos el código para el Arduino. Dependiendo de la tarjeta que usemos para conectarnos a internet el código puede variar, tanto la forma en la que se envía la información como la forma en la que se recibe, aunque la información en sí debería de ser la misma. Por ello el siguiente código solo es orientativo y puede necesitar algunos ajustes para funcionar a la perfección.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/** * URL: http://giltesa.com/?p=16650 * License: (CC) BY-NC-SA */ #include <SoftwareSerial.h> SoftwareSerial wifi(2, 3); // RX | TX #define KEY_EMAIL "s7x45IUFBrHHDTw" #define NAME "Arduino" #define FROM "arduino@domain.com" #define TO "youremail@domain.com" #define SUBJECT "Hello" #define MESSAGE "This email was sent from Arduino!" void setup() { Serial.begin(9600); while(!Serial); wifi.begin(9600); delay(5); } void loop() { // Send an email every 30 seconds: if( millis()%30000 == 0 ) { wifi.print("GET /mail.php"); wifi.print("?key="); wifi.print(KEY_EMAIL); wifi.print("&name="); wifi.print(NAME); wifi.print("&from="); wifi.print(FROM); wifi.print("&to="); wifi.print(TO); wifi.print("&subject="); wifi.print(SUBJECT); wifi.print("&message="); wifi.print(MESSAGE); wifi.print(" HTTP/1.1\r\n"); wifi.print("Host: domain.com\r\n"); wifi.print("Connection: close\r\n"); wifi.println(); delay(100); if( wifi.available() > 0 ) { switch( wifi.parseInt() ) { case 1: Serial.println("The mail was sent successfully."); break; case 2: Serial.println("Authentication failure"); break; case 3: Serial.println("Parameters not found"); break; case 4: Serial.println("The server could not send the email."); break; default: Serial.println("The server returned an unexpected response."); break; } while( wifi.available() > 0 && wifi.read() != -1 ); } } } |
Con esos dos códigos tan sencillos ya tendremos lo necesario para enviar correos desde el Arduino!
Es posible enviar un archivo adjunto? por ejemplo un txt que guardaba los datos de sensores se adjunte en el correo :).. sera esto posible giltesa?
Es posible pero necesitarás hacerlo enviando los datos por POST en vez de GET, así podrás enviar datos adjuntandolos a la cabecera de la llamada.
También puedes enviar los datos del fichero por GET concatenandolos en la URL pero tienes que tener cuidado con los caracteres especiales como los saltos de línea o de no sobrepasar la longitud máxima de caracteres en la URL.
Saludos.
hola! una duda, como envias el correo si en tu codigo no estas entrando al servidor del correo?
La función mail de php lo envía sin firmar/autenticar haciendo uso de servicio de correo del servidor, si lo tienes parado o mal configurado no enviará los correos.
Saludos.
Para enviar datos geográficos desde el arduino a un servidor como seria?
Seria exactamente igual, recoges los datos desde el módulo GPS y los enviás de la misma forma que se hace para enviar el asunto, mensaje, etc.
Gracias!
Disculpa, en esta seccion del codigo de arduino wifi.print(«Host: domain.com\r\n»); iria la url de mi servidor online?
Exacto, ahí debes colocar el dominio terminado en .com, o .es, o .net , o lo que tengas. El resto de dirección va en otra de las líneas que tiene el código.
Saludos
buen dia. el mismo metodo seria si uso el ejemplo de webclient.?
por decir en esta linea seria asi? wifi.print(«GET /mail.php?para=micorreo@gmailcom»); y en esta linea wifi.print(«Host: domain.com\r\n») solo iria mi servidor online come me dices. otra pregunta en esta linea wifi.print(» HTTP/1.1\r\n»); se queda igual o hay que editarla.
tambien me gustaria saber si al principio puedo agregarle que al presionar un push se realice el codigo por medio de la condicion if? esque el push es la simulacion de una alarma de contactos secos.
Se ha de cambiar la linea 32 y 40 para que quede con tu dirección y directorio que contiene el fichero PHP, por ejemplo:
En cualquier caso el código aquí publicado es orientativo y variara dependiendo del modulo con el que te conectes a internet.
Si quieres que el correo se envié cuando salte la alarma solo tienes que incluir la condición de la alarma dentro del if de la linea 30 en vez del código actual.
Saludos.
Muchas gracias por responder hare los cambios que me comentas.
como podríamos cambiar la configuración del código para que solo nos mandase un email cuando saltase una alarma(hecha con arduino ethernet y un sensor de proximidad)
disculpa es posible hacer el envio de email tomando a arduino como un servidor, esque al tomarlo como cleinte no me hace el envio por la configuracion proxy de la red a a que estoy conectado
Realmente el código de ejemplo es eso, un ejemplo de como se enviar los datos pero no se muestra cómo configurar el modulo de internet ethernet/wifi/GSM, deberás de configurarlo como indique su librería o necesites en tu caso y luego añadir este código para enviar los emails a tu servidor php.
Saludos.
gracias por s respuesta, si logre hacer el envio con el arduino como cliene, como me mencionas tuve qe hacer ciertas modificaiones extras para poder conectarla al proxy de a red de la compañia, y eso fue en la linea donde se ocupa la condicion if para coectarse al servidor y al puerto 80, e mi caso encontre que ahi se debe de agregar la direccion prox, gracias por tu apoyo
disculpa podrias ayudarme a configura un servidor local para enviar correo con la funcion mail de php, instale el servidor iis de windows server 2008 r2 pero no he podido implementarle un servidor smtp para ue funcione el envio de email con php.
¿si el arduino está conectado con el cable usb a un ordenador, sería necesario tener el modulo de comunicación wifi?
Gracias
Miguel
Hola,
Si lo tienes conectado por USB, lo tienes conectado al PC, no a Internet.
Así que con ese montaje necesitarias programar una aplicación de Windows que leyera los datos del USB y los enviará a un servidor de correo para que pudiera a su vez enviar el correo.
Saludos
Hola, me gustaría saber sobre algún ejemplo de servidor que sirva para este ejemplo o en donde obtenerlo.
Hola Daniela,
Si prestas atención al contenido de esta misma página verás que el primer bloque de código es el ejemplo para el servidor y el segundo bloque para el Arduino.
Saludos.
Este ejemplo me podría servir a mi para que al activarse el pin 13 de mi arduino yun,este me enviara un mail diciendo que el pin 13 esta activo?
Gracias Giltesa .
Hola Monikax,
Si que te puede servir, tendrás que cambiar la condición del primer if para que en vez de comprobar tiempos compruebe si estas pulsando el botón conectado al pin 13.
En ese caso se ejecuta el código del if y se envía el correo. (añade una pausa para que no intente enviar varios correos a la vez)
También tendrás que ajustar el código pues como digo en la entrada es un código genérico de muestra y hay que adaptarlo a cada tarjeta wifi, en tu caso el yun.
Saludos.
Hola. Tengo en mi auto un datalogger almacenando info en una sd. Me interesaría enviar ese csv por mail como adjunto. Algun ejemplo?
Hola Emerson,
Con la función mail() de PHP no me suena, aquí indican que puede hacerse usando una librería de PHP:
https://stackoverflow.com/questions/12301358/send-attachments-with-php-mail
En cuanto a enviar esos datos del Arduino al servidor, tendrías que cambiar la llamada GET por una POST y enviar los datos del fichero en el cuerpo del mensaje en vez de la cabecera.
No te he encontrado ningún ejemplo, pero puedes empezar por aquí:
https://www.google.com/search?client=firefox-b-ab&ei=v8e_WtKOJsiGU5eJj9gE&q=Arduino+POST+send+image&oq=Arduino+POST+send+image
Saludos,