Introduccion

Actualmente el Iot(internet of thing) es una tendencia en el mundo que va creciendo cada dias mas, sin duda comenzar a experimentar con pequeños proyectos nos brinda la oportunidad de conocer  lo importante y critico que resulta el desarrollo de aplicaciones que controlen aparatos electricos.

Desarrollo

Voy a mostrar en este tutorial como encender o apagar un foco de forma remota a-traves  de una aplicacion web, usando un servicion Rest de por medio.

Materiales

Arduino yun

Sensor de corriente para arduino con una corriente maxima de 5A

Rele para arduino con un soporte de hasta 220v

Foco o lampara.

Conocimientos Previos

Se necesita conocimientos previos en C++

Servicio Rest

Rest deriva de “Representational State Transfer”  es un estilo de  arquitectura  software  para desarrollar servicios. Los servicios web que siguen este estilo deben cumplir con las siguientes premisas.

Cliente y Servidor .- Definen un interface de comunicación entre ambos separando completamente las responsabilidades entre ambas partes

imagen_cliente_servidor

Sin Estado .- Son servicios web que no mantienen  estado asociado al cliente.Cada petición que se realiza a ellos es completamente independiente de la siguiente . Todas las llamadas al mismo servicio serán idénticas.

imagen_sin_estado

Cache : El contenido de los servicios web REST se pueden cachear de tal forma que una vez realizada la primera petición al servicio el resto puedan apoyarse en la cache si fuera necesario.

imagen_cache

Servicios Uniformes :Todos lo servicios REST compartirán una forma de invocación y métodos uniforme utilizando los metodos GET,POST,PUT ,DELETE.

Arquitectura en Capas: Todos los servicios REST estan orientados hacia la escalabilidad y un cliente REST no será capaz de distinguir entre si esta realizando una petición directamente al servidor , o se lo esta devolviendo un sistema de caches intermedio o por ejemplo existe un balanceador que se encarga de redirigirlo a otro servidor.

imagen_arquitectura_capas

 

Pero una particular de un servicio rest es que sufre “amnecia completa” es decir si un cliente realiza una peticion a un servidor, la proxima vez que el  cliente realice la misma peticion el servidor no recordara quien ese cliente y tambien si ese paquete es el mismo.

Afortunadamente Arduino yun tiene ya implementado las dos capas de redes de datos dentro de su infraestructura(Capa de red y de la Capa de enlace de datos), ademas contiene librerias para realizar el levantamiento del servicio.

Configuracion del Arduino Yun

1.- Conectar el arduino Yun a la computadora

2.- Se necesita resetear el wifi del arduino Yun. Nos ubicamos en el boton de reset del arduino Yun.

arduino-yun1-imagenconfiguracion

 

Dejamos presionado el boton de reset de wifi durante 30 segundos. Esto provocara que se reinicie las configuraciones por defecto del Yun.

Debemos tomar en cuenta que el Arduno Yún tiene un comportamiento similar al de un router WIFI, por lo que cuando lo conectemos no tendremos el WIFI disponible de inmediato, sino que será necesario esperar al menos un minuto hasta que se habilite la red inalámbrica.

Una vez se haya habilitado la red inalámbrica, nos vamos las redes inalámbricas de Windows, donde veremos disponible una red llamada ArduinoYún-XXXXXXXXXXX.

Nos conectamos a la red del arduino y en un navegador escribimos arduino.local.

Si al escribir arduino.local te sale un mensaje de error, entonces busca a que ip esta asociada la red del arduino y pegala en el browser y da enter!.

Inmediantamente se te aparecera una pantalla solicitando que ingreses una contraseña para entrar a la pantalla de configuraciones(por defecto es “arduino”).

Si no logras entrar con esa contraseña adjunto un programa que deberan cargarlo en el IDE de arduino,ejecutarlo y posteriormente abrir un terminal y debera mostrarse una interfaz como esta.

pantalla_arduino_yun

A continuacion digita el comando passwd e ingresamos una nueva contraseña.
Posteriormente ingresamos nuevamente a la pagina web de configuracion del arduino yun, ingresando la nueva contraseña que hemos reseteado.
Dos puntos claves de este tutorial es configurar la zona horaria, el router que queremos conectarnos y habilitar el servicio rest.
pantalla_configuracion_servicio_rest_arduino_yun
En la  casilla de wireless parameter, los parametros ha recordar son la contraseña y el nombre de la red(wireless name),en la opcion de rest api access debemos seleccionar la casilla Open
Posteriormente debemos dar click en configure and restart.
Construccion del Hardware
Conectamos el pin de salida de 5v de cada modulo al proto (signo +) .
Conectamos el pin de 5v del arduino yun al proto.
Las tierras de cada modulo lo conectamos a las tierras del arduino Yun.
La senal del rele lo conectamos al pin 8 del arduino Yun.
El sensor de corriente tiene una salida analoga, de modo que lo conectamos al Pin A0 del arduino Yun
Procedemos a conectar las patas del enchufle al proyecto, una pata ira al sensor de corriente y la otra pata al rele.
De igual manera hacemos para el foco.
NOTA El cable que representa la parte negativa va conectado al sensor de corriente y el que representa la parte positiva va conectado al rele.
Codificacion en el IDE de Arduino
#include <Bridge.h>
#include <Process.h>
#include <BridgeServer.h>
#include <BridgeClient.h>
void setup() {
Bridge.begin();
time = millis();
// For debugging, wait until the serial console is connected
while(!Serial);
Serial.begin(9600);
if (!date.running()){
date.begin(“date”);
date.addParameter(“+%T”);
date.run();
}
pinMode(RELAY_PIN,OUTPUT);
server.listenOnLocalhost();
server.begin();
}

void loop() {

BridgeClient client = server.accept();
if (client) {
// Process request
process(client);

// Close connection and free resources.
client.stop();
}

}
void process(BridgeClient client) {
// read the command
String command = client.readStringUntil(‘/’);

// is “digital” command?
if (command == “digital”) {
digitalCommand(client);
}

// is “analog” command?
if (command == “analog”) {
analogCommand(client);
}

// is “mode” command?
if (command == “mode”) {
modeCommand(client);
}
}

void digitalCommand(BridgeClient client) {
int pin, value;

// Read pin number
pin = client.parseInt();

// If the next character is a ‘/’ it means we have an URL
// with a value like: “/digital/13/1”
if (client.read() == ‘/’) {
value = client.parseInt();
digitalWrite(pin, value);
}
else {
value = digitalRead(pin);
}

// Send feedback to client
client.print(F(“Pin D”));
client.print(pin);
client.print(F(” set to “));
client.println(value);

// Update datastore key with the current pin value
String key = “D”;
key += pin;
Bridge.put(key, String(value));
}

void analogCommand(BridgeClient client) {
int pin, value;

// Read pin number
pin = client.parseInt();

// If the next character is a ‘/’ it means we have an URL
// with a value like: “/analog/5/120”
if (client.read() == ‘/’) {
// Read value and execute command
value = client.parseInt();
analogWrite(pin, value);

// Send feedback to client
client.print(F(“Pin D”));
client.print(pin);
client.print(F(” set to analog “));
client.println(value);

// Update datastore key with the current pin value
String key = “D”;
key += pin;
Bridge.put(key, String(value));
}
else {
// Read analog pin
value = analogRead(pin);

// Send feedback to client
client.print(F(“Pin A”));
client.print(pin);
client.print(F(” reads analog “));
client.println(value);

// Update datastore key with the current pin value
String key = “A”;
key += pin;
Bridge.put(key, String(value));
}
return ;
}

void modeCommand(BridgeClient client) {
int pin;

// Read pin number
pin = client.parseInt();

// If the next character is not a ‘/’ we have a malformed URL
if (client.read() != ‘/’) {
client.println(F(“error”));
return;
}

String mode = client.readStringUntil(‘\r’);

if (mode == “input”) {
pinMode(pin, INPUT);
// Send feedback to client
client.print(F(“Pin D”));
client.print(pin);
client.print(F(” configured as INPUT!”));
return;
}

if (mode == “output”) {
pinMode(pin, OUTPUT);
// Send feedback to client
client.print(F(“Pin D”));
client.print(pin);
client.print(F(” configured as OUTPUT!”));
return;
}

client.print(F(“error: invalid mode “));
client.print(mode);
}

Desarrollo de una pagina Web
Pagina Html
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<script type=”text/javascript” src=”script-arduino.js”></script>
<script type=”text/javascript” src=”jquery-3.1.1.min.js”></script>
<link rel=”stylesheet” type=”text/css” href=”style.css”>
<title>Control_Remoto-Luz</title>
</head>
<body>
<h1>
Control Remoto de Luz
</h1>
<form  id=”relay” method=”GET” accept-charset=”utf-8″>
<input type=”button” name=”” value=”On” id=”on” class=”commandButton” onclick=”relayOn()” />
<input type=”button” name=”” value=”Off” id=”off” class=”commandButton” onclick=”relayOff()” />
</form>

</body>

</html>

Scrip_arduino.js
function relayOn() {
$.get(“update_state.php”,{command:1});
}

function relayOff(){
$.get(“update_state.php”,{command:0});

}

Update_state.php
<?php

// Create cURL call, make sure to change it with your Yun name
$service_url = ‘http://kevinleonelgrupo1.local/arduino/digital/8/’ . $_GET[“command”];
$curl = curl_init($service_url);

// Send cURL to Yun board
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
$curl_response = curl_exec($curl);
curl_close($curl);

?>

Nota la aplicacion web debe ejecutarse en un servidor !!!
aplicacion_control_remoto_arduino
encendido_de_luz