Sunteți pe pagina 1din 34

WebClient Arduino y Servidor PHP en Hosting Gratuito

enero 8, 2016enero 9, 2016 Gustavo Circelli Arduino, Electrnica,


Programacin, Proyectos con Arduino
(Visto 297 veces, 4 visitas hoy)
La idea del proyecto es modificar el estado de salidas digitales desde cualquier
dispositivo mvil, a travs de internet , desde cualquier lugar, utilizando el
shield de Ethernet W5100 sobre Arduino Uno corriendo en modo WebCliente
contra un servidor de Hosting gratuito .
No se trata de un acceso via LAN, sino via WAN, es decir con conectividad a
Internet desde cualquier dispositivo movil. Un usuario utilizar su navegador
preferido y se conectar a un sitio que aloja una WebPage donde efectuar las
modificaciones de 4 salidas. Nuestro WebClient Arduino se conectar tambin a
dicho sitio a intervalos regulares de tiempo y solicitar por medio de consulta
GET el estado de las salidas las cuales sern modificadas en el sitio remoto y
confirmadas al sitio. De esta manera el usuario al actualizar la pgina sabr si
dichas modificaciones efectivamente se han realizado.
Conceptos Bsicos WebClient

Concepto WebClient y Servidor PHP


En la figura se muestra un WebClient, que en nuestro caso ser Arduino Uno
con el Shield Wiznet5100, el cual genera peticiones PHP al Servidor alojado en
un Hosting gratuito, en mi caso utilic Hostinger , el cual responder a nuestro
WebClient con un cdigo HTML donde ir incrustada la respuesta. La
siguiente figura muestra la intervencin del usuario

WebCl
ient-PHP-User
Problemas que vamos a evitar en modo Cliente
La aplicacin sobre Arduino ser del tipo WebClient y no Server, dado que en
modo WebClient no vamos a depender de las direcciones IP pblicas que se
modifican cada determinado tiempo si tuvisemos el modo Server en Arduino.
En modo Servidor, nuestro Router le asigna una direccin IP a Arduino para
poder distinguirlo dentro de nuestra red local . El Router le asigna una direccin
de IP de manera dinmica por medio del servicio de DHCP, esto quiere decir
que la IP de Arduino se va a modificar cada determinado tiempo, por lo que
ser necesario decirle al Router que dicha IP se mantenga fija ya que en
nuestro sketch de arduino debemos indicarla. DHCP asigna la IP de acuerdo a la
direccin fsica MAC de la placa que suele venir identificada sobre la W5100,
caso contrario se puede usar cualquiera. Se puede tambin asignar a nuestro
arduino un IP fija pero como los dems dispositivos conectados al Router en
una red local (celulares, Pcs, etc) son de IP dinmica, pueden colisionar en
algn momento con otras IP dejar de funcionar. Dependiendo del Router, se
puede configurar que DHCP siempre asigne la misma IP a una direccin MAC
determinada y aunque no es el objetivo en este trabajo, generalmente es la
opcin DHCP Settings y MAC assignment. Hasta aqu podremos usar siempre
nuestro sistema pero de forma local, es decir va LAN, si queremos acceder a
nuestro sistema desde fuera como internet WAN habr que abrir un puerto
adicional en el Router para redireccionar el trfico de datos desde internet

hacia la IP de Arduino. Esta funcin depende tambin del router y


generalmente est en Port Forwarding. Tipicamente son el puerto 80 y otro
tambin como el 5400. El otro problema ahora a resolver es que para acceder
desde fuera necesitamos la IP pblica del router, y esta es dinmica. Las
opciones que disponemos son contratar una IP fija lo cual es muy costoso, o
utilizar un servicio pago de servidor DNS, esto es asignar un mismo nombre por
ejemplo www.misistema.com a la IP pblica del router cambie o no. Este
servicio siempre linquea la IP modificada o no, con el nombre DNS.
Mi Alternativa
Para evitar todos los problemas anteriores utilizamos el modo Cliente, o
WebClient donde la W5100 siempre se conectar contra un servidor o Hosting
gratuito cuya direccin nunca cambia.
Nuestro Hosting ser nuestro Server
quien responder a los requerimientos de Arduino. Nuestro Server debe alojar
una pgina Php o HTML, dependiendo de la aplicacin. Html es esttica, es
decir que el contenido no se modifica. Php es dinmico y permite mostrar
contenidos que se modifican en nuestro sitio y procesar con cdigo Php dichos
contenidos. Por ejemplo una pgina Html puede contener un formulario para
ingresos de datos y una vez ingresados el procesamiento ser va un servidor
Php como por ejemplo Apache. Toda peticin a un servidor se internet, siempre
es respondida en lenguaje Html que es el lenguaje de internet para poder
ejecutarse desde nuestro navegador. Entonces la idea es que un usuario
ingrese al sitio o hosting gratuito donde se le presentar un contenido Php, en
este caso, dado que la informacin que se presenta no es siempre la misma, se
muestra la informacin actualizada de las salidas y esto es cambiante. All el
usuario puede modificar el estado de las salidas, las cuales se graban de
manera permanente en un archivo de texto, que aloja en una cadena, el
estado de las mismas (activada, desactivada) con una indicacin adicional de
NO REALIZADO. Esto no significa que inmediatamente dicha modificacin se
realice en el WebClient, nuestro Arduino.El cliente se conectar al sitio cada
determinado intervalo de tiempo y enviar una solicitud del tipo GET donde
requiere el estado de las salidas. Dicha peticin se procesa va Php leyendo el
archivo y devolviendo una cadena de texto de las salidas hacia el Cliente junto
con la indicacin. El cliente al recibir la cadena del estado de salidas y la
indicacin de NO REALIZADO asumir que habr que modificar las salidas en
su sistema de actuador ( reles, leds, etc). Una vez realizado se vuelve a
conectar con otra peticin GET a modo de confirmacin fsico de dicho cambio.
La pgina Php al recibir esta nueva peticin modificar el archivo de salidas
con la indicacin REALIZADO Fecha-hora-da. Cuando el usuario ingrese
ms tarde a la pgina podr observar si su cambio de salidas esta realizado o
no realizado an. De esta manera tenemos un sistema no-sincronizado pero
til.
Cadenas de texto recibidas por el WebClient

La cadena guardada en el archivo del sitio .txt ser de la forma:


(a) sal1=1sal2=1sal3=1sal4=0NO REALIZADO Cada vez que el usuario
efecte un cambio
(b) sal1=0sal2=1sal3=1sal4=0REALIZADO-2016-01-07 | 02:4:21 |Cada vez que
el cliente realice el cambio
El Webclient, nuestro Arduino al leer la cadena entonces sabe lo que debe
hacer , o no hacer que es el caso de la cadena (b), o debe modificar y notificar
el cambio realizado en el caso de la cadena (a).
Implementacin de Pginas en el Hosting
A continuacin se colocan las pginas en PHP que se van a utilizar en el
proyecto y como se van llamando desde nuestro navegador al Hosting.
El hosting creado fue en http://www.hostinger.com.ar/ y el sitio
www.guscir.hol.es . No entraremos en detalle de cmo generarse un sitio
gratuito ya que hay excelentes tutoriales en internet y realmente es muy fcil.
Lo importante es que gratuitamente tenemos casi todo para administrar un
sitio, incluido servidores Php como Apache y MySql para crear nuestras bases
de datos en el sitio, adems de otros servicios como cuentas de Mail. No es el
objetivo ensear Php , para aquel que no lo conoce existen muchos tutoriales
en la red, pero debo incluir las pginas para aquel que conoce de Php y pginas
dinmicas y desea modificar, o implementar sus propios diseos.
Salidas.php
Pgina principal del sitio donde va a acceder el usuario desde cualquier
dispositivo, mediante http://www.guscir.hol.es/salidas.php. All se puede ver
una interface come esta:

P
agina Hosting que ve usuario , no el WebClient

P
agina Hosting Usuario
La esttica la dejo para otro momento ya que no es importante colocar
maquetado, estilos, colores, etc. No obstante he agregado un archivo estilo.css
para dar algo de color a la tabla de estas 4 salidas.
PHP
<html>
// Con Hostinger acceder como
<head>

<html>

2
3

// Con Hostinger acceder como http://www.guscir.hol.es/salidas.php

<head>

<link rel=stylesheet type="text/css" href=estilo.css>

</head>

<body>

<?php

$ar=fopen("archivocontrol.txt","r") or

10

die("No se pudo abrir el archivo");

11

//$linea=""; Otra manera

12

while (!feof($ar))

13

14
15

// $linea=$linea.fgets($ar)."<br>"; // va concatenando linea a linea y


agrega un salto a cada linea
//echo $linea;

16

$linea=fgets($ar);

17

//echo $linea;

18
19
20
21

}
fclose($ar);
// En $linea tengo el estado de las salidas en una cadena debo
procesarla

22

$estado1= substr($linea,5,1);

23

//echo $estado1;

24

$estado2= substr($linea,11,1);

25

//echo $estado2;

26

$estado3= substr($linea,17,1);

27

//echo $estado3;

28

$estado4= substr($linea,23,1);

29

//echo $estado4;

30

$idcambio=0;

31

$cambio="No realizado";

32

$cantidad= strlen($linea);

33

//echo $cantidad;

34
35

if($cantidad>24) // hay datos de confirmacion

36

37

$confirma=substr($linea,24,1);

38

//echo $confirma;

39

if($confirma=="R") // Cambio realizado actualizado por el cliente

40

{$cambio="Cambio realizado";

41

$idcambio=1;

42
43

$fecha= substr($linea,34); // capta la fecha y hora del cambio


efectuado por el cliente
}

44

45
46
47
48
49

?>
<p><h3>CONTROL DE SALIDAS</h3></p>
<form name="salidas" method="post" action="ArchivoControl.php">
<table border=1 bordercolor=blue >
<tr>

50

<?php if ($estado1==1)

51

52
53

echo "<td class=col><h4>SALIDA_1</h4><input type=\"checkbox\"


name=\"sal1\" value=\"1\" checked ></td>";

54

55

else{

56
57

echo "<td class=col><h4>SALIDA_1</h4><input type=\"checkbox\"


name=\"sal1\" value=\"1\" ></td>";

58

}
if ($estado2==1)

59
60
61
62

{
echo "<td class=col><h4>SALIDA_2</h4><input type=\"checkbox\"
name=\"sal2\" value=\"1\" checked ></td>";

63

64

else{

65

echo "<td class=col><h4>SALIDA_2</h4><input type=\"checkbox\"


name=\"sal2\" value=\"1\" ></td>";

66
67
68

}
if ($estado3==1)
{

69
70

echo "<td class=col><h4>SALIDA_3</h4><input type=\"checkbox\"


name=\"sal3\" value=\"1\" checked ></td>";

71

72

else{

73
74

echo "<td class=col><h4>SALIDA_3</h4><input type=\"checkbox\"


name=\"sal3\" value=\"1\" ></td>";

75

76

if ($estado4==1)
{

77
78
79
80
81

echo "<td class=col><h4>SALIDA-4</h4><input type=\"checkbox\"


name=\"sal4\" value=\"1\" checked ></td>";
}
else{

82

echo "<td class=col><h4>SALIDA_4</h4><input type=\"checkbox\"


name=\"sal4\" value=\"1\" ></td>";

83

84

?>

85
86

</tr>

87

<tr></tr><tr></tr>

88

</table>

89

<br>

90

<?php

91
92

if($idcambio==0)
{

93

echo $cambio;

94

95

else{

96

echo $cambio." ".$fecha;

97

98

?>

99

<br>

10
0

<br>

10
1

<input type="submit" name="botonModificar" value="Aceptar">


<br><br>
</form>
<form name="estadoActual" method="post"
action="LecturaArchivo.php">
<input type="submit" name="botonLeer" value="LeerEstado">
</form>
</body>
</html>

Principio del formulario


Final del formulario
Principio del formulario
Final del formulario

Lo que hace este cdigo Php es leer el archivocontrol.txt (como ya hemos


mencionado) donde se aloja la cadena y en funcin de esta, va a mostrar los
checkboxs tildados o no, de acuerdo a lo que dicte la cadena. Esta es la razn
de ser una pgina Php y no HTML, ya que su contenido cambia segn la cadena
de texto del archivo. Esto permite que los cambios realizados sean reflejados
en la misma pgina. Tambin analiza si en la cadena aparece el No realizado
o el Realizado concatenado con la fecha y hora. Se pueden modificar los
CheckBox de cada salida y luego clickear en el botn Aceptar. Al hacer esto
como toda esta tabla est insertada dentro de una estructura <Form> llama a
la pgina ArchivoControl.php y le pasar los nuevos estados de las salidas
medante el mtodo POST.
<form name=salidas method=post action=ArchivoControl.php>
.. Cdigo
</form>
ArchivoControl.php
PHP
ArchivoControl.php
<html>
<head>

ArchivoControl.php

2
3

<html>

<head>

</head>

<body>

<?php

$estado1=0;

$estado2=0;

1
0

$estado3=0;
$estado4=0;

1
1
1
2

if (isset($_REQUEST['sal1']))
{
$estado1=$_REQUEST['sal1'];

1
3

1
4

1
5
1
6
1
7
1
8
1
9
2
0

if (isset($_REQUEST['sal2']))

$estado2=$_REQUEST['sal2'];
}
if (isset($_REQUEST['sal3']))
{
$estado3=$_REQUEST['sal3'];
}
if (isset($_REQUEST['sal4']))
{
$estado4=$_REQUEST['sal4'];
}

2
1

$cadena="sal1=".$estado1."sal2=".$estado2."sal3=".$estado3."sal4=".
$estado4."NO REALIZADO";

2
2

// El servidor adjunta NO REALIZADO para que el cliente sepa que es una


nueva modificacion en las salidas

2
3
2
4
2
5
2
6
2

//echo $cadena;

$ar=fopen("archivocontrol.txt","w") or
die("Problemas en la creacion");
fputs($ar,$cadena);
//fputs($ar,"br");
fclose($ar);

7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4

echo "
";
echo "
";
echo "Los datos se cargaron correctamente.";
echo "
";
echo "
";
?>

<a href="salidas.php">Volver</a>

3
4
4
4
5
4
6
4
7
4
8
Esta pgina ArchivosControl.php simplemente detecta las variables pasadas
por mtodo POST desde la pgina anterior y saber cules salidas se han
tildado, o destildado y de esta manera rescribir el archivocontrol.txt , para
actualizar la cadena nueva concatenado ahora con NO REALIZADO ya que la
cadena ha cambiado y el Webclient (Arduino), debe saber de esta manera, al
hacer su consulta, que debe efectuar sus modificaciones.
El botn LeerEstado es redundante y no hara falta pero lo que hace es llamar a
otra pgina LecturaArchivo.php
<form name=estadoActual method=post action=LecturaArchivo.php>
<input type=submit name=botonLeer value=LeerEstado>
</form>

LecturaArchivo.php
Esta pgina lo que hace ( ya dije que redundante) es leer el archivo y presentar
en otro formato la informacin de las salidas.

Vista Salidas
PHP
LecturaArchivo.php
<html>
<head>
</head>

LecturaArchivo.php

<html>

<head>

</head>

<body>

<?php

$ar=fopen("archivocontrol.txt","r") or

die("No se pudo abrir el archivo");

while (!feof($ar))

10

11
12

$linea=fgets($ar);

13
14

15

fclose($ar);

16

//echo $linea;

17

echo '';

18

echo '';

19

$estado1= substr($linea,5,1);

20

//echo $estado1;

21

$estado2= substr($linea,11,1);

22

//echo $estado2;

23

$estado3= substr($linea,17,1);

24

//echo $estado3;

25

$estado4= substr($linea,23,1);

26

//echo $estado4;

27

$est1="Desactivada";

28

$est2="Desactivada";

29

$est3="Desactivada";

30

$est4="Desactivada";

31

if($estado1==1)

32

{$est1="Activada";}

33

if($estado2==1)

34

{$est2="Activada";}

35

if($estado3==1)

36

{$est3="Activada";}

37

if($estado4==1)

38

{$est4="Activada";}

39

?>

requerimiento.php
Esta pgina no est accesible al usuario y es la pgina que va a consultar el
WebClient (Arduino) mediante peticiones del tipo GET.

PHP
</head>
<body>
<?php

</head>

<body>

<?php

4
5
6

// http://www.guscir.hol.es/requerimiento.php?consulta=2 se llama de
esta manera

// No necesariamente habra que pedir con una variable, puede que solo el
servidor responda sin necesidad de pasarle una variable, segn sea la
necesidad

// http://www.guscir.hol.es/requerimiento.php

1
0

$ar=fopen("archivocontrol.txt","r") or

1
1
1
2
1
3
1
4
1
5

die("No se pudo abrir el archivo");


while (!feof($ar))
{
$linea=fgets($ar);

}
fclose($ar);
if(!empty($_GET['consulta']) && $_GET['consulta']==1) // El cliente pide
consulta de las salidas, su estado

1
6

1
7

echo $linea;

if(!empty($_GET['consulta']) && $_GET['consulta']==2) // El cliente

1
8

quiere logear algo o confirmar algo en el server, en este caso validar el


cambio de las salidas

1
9

// en el cliente de acuerdo al nuevo estado de las salidas. Aqui podemos


mandar un Mail o actualizar un objeto o elemento en la pagina

2
0

// para que al entrar nuevamente el usuario se de cuenta que su cambio


se realiz, en este caso el cliente reflejo el cambio de las salidas

2
1
2
2

{
$linea=substr($linea,0,24); // Captura el estado de las salidas para
filtrar el NO REALIZADO
$ar=fopen("archivocontrol.txt","w") or

2
3

die("Problemas en la creacion");

2
4

date_default_timezone_set('America/Argentina/Cordoba'); // Actualiza a
zona horaria America ya que sino devuelve hora Espaa

2
5

$time = date("Y-m-d | h:N:s |", time() ) ;

2
6

fputs($ar,$linea."REALIZADO"."-".$time); // Reescribe archivo con la


indicacin de realizado
//fputs($ar,"br");

2
7
2
8
2
9
3
0
3
1
3
2
3
3
3

fclose($ar);
echo "okey";
}
?>

4
3
5
3
6
3
7
Peticiones WebClient
El cliente acceder a esta pgina mediante:
http://www.guscir.hol.es/requerimiento.php?consulta=1
Si observamos bien, el parmetro que pasa el WebClient a la pgina es
consulta con un valor de 1, en este caso.Consulta=1, le indicar a la pgina
Php que solo debe leer el archivo archivocontrol.txt para extraer la cadena de
salida.
if(!empty($_GET['consulta']) &&
{
echo $linea; // RENVIA LA CA
}

1 if(!empty($_GET['consulta']) && $_GET['consulta']==1) // El cliente pide


consulta de las salidas, su estado
2
{
3
echo $linea; // RENVIA LA CADENA COMO RESPUESTA
4
}
La cadena de respuesta puede ser del tipo (a) o (b) como ya vimos. La pgina
enva la cadena como respuesta mediante el comando echo. En el caso de
recibir la (a), de NO REALIZADO, el Cliente procesa la cadena y acta sobre sus
pines de salida y luego confirma con:
http://www.guscir.hol.es/requerimiento.php?consulta=2
es decir coloca el valor 2 en consulta. Con esto la pgina Php lo que hace es
modificar la cadena del archivo archivocontrol.txt para concatenarle el
REALIZADO ms la fecha y hora. Y devuelve un okey al Cliente. De esta
manera cuando el cliente vuelva a consultar con consulta=1 y la cadena de
respuesta sea:

sal1=1sal2=1sal3=0sal4=0REALIZADO-2016-01-07 | 05:4:21 | tipo (b)


El Webclient sabr que el cambio ya fue realizado y no tendr que modificar
las salidas.
(Porcin de cdigo de requerimiento.php ya publicado)
PHP
if(!empty($_GET['consulta']) &&
// en el cliente de acuerdo al nu
// para que al entrar nuevamen
{ $linea=substr($linea,0,24);

1
2
3
4
5
6
7

if(!empty($_GET['consulta']) && $_GET['consulta']==2) // El cliente quiere


logear algo o confirmar algo en el server, en este caso validar el cambio
de las salidas
// en el cliente de acuerdo al nuevo estado de las salidas. Aqui podemos
mandar un Mail o actualizar un objeto o elemento en la pagina
// para que al entrar nuevamente el usuario se de cuenta que su cambio
se realiz, en este caso el cliente reflejo el cambio de las salidas
{ $linea=substr($linea,0,24); // Captura el estado de las salidas para
filtrar el NO REALIZADO

$ar=fopen("archivocontrol.txt","w") or

die("Problemas en la creacion");

1
0
1
1
1
2

date_default_timezone_set('America/Argentina/Cordoba'); // Actualiza a
zona horaria America ya que sino devuelve hora Espaa $time = date("Ym-d | h:N:s |", time() ) ;
fputs($ar,$linea."REALIZADO"."-".$time); // Reescribe archivo con la
indicacin de realizado
//fputs($ar,"br");
fclose($ar);
echo "okey";
}

Cdigo Arduino con Shield Wiznet W5100

A los efectos de simplicidad, se mostrarn por el puerto serial las cadenas


recibidas desde el servidor, como filtrar las subcadenas de cada salida para
despus aplicarlas a los pines que desea el usuario. Hay que tener en cuenta
que la placa Wiznet 5100 utiliza los pines 4,10,11,12 y 13 para comunicarse
con ARDUINO 1, por lo que debe evitarse su uso para nuestras aplicaciones. El
4 Se utiliza para la SD card del shield, si es que se usa.
10 Habilitacin ETCH de la placa Ethernet
11,12,y 13 son comunicacin SPI con la placa ( Mosi, Miso,Clk).
El cdigo est muy bien documentado y he optado por simular las salidas
digitales, es decir que el estado de las salidas saldr impreso por la terminal de
consola de Arduino y las cadenas de respuesta debidamente filtradas. En la
consola de Arduino se vern no solo las respuestas completas del servidor, sino
tambin los inicios de conexin, los intentos fallidos, las cadenas filtradas de
respuesta y tambin la simulacin de cada salida.
C
/*
Web client
Peticiones GET a Hosting gratu
Modifica el estado de 4 salidas

/*

Web client

Peticiones GET a Hosting gratuito

Modifica el estado de 4 salidas digitales en forma diferida

*/

6
7

#include <SPI.h>

#include <Ethernet.h>

9
10

// Enter a MAC address for your controller below.

11

// Newer Ethernet shields have a MAC address printed on a sticker on the


shield

12

13
14

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

15

char server[] ="www.guscir.hol.es";

16

// Set the static IP address to use if the DHCP fails to assign

17

IPAddress Myip(192, 168, 1, 177);

18
19

// Initialize the Ethernet client library

20

// with the IP address and port of the server

21

// that you want to connect to (port 80 is default for HTTP):

22

EthernetClient client;

23
24

unsigned long start=millis();

25

unsigned long periodoConexion=30000; // 30 segundos cada 1/2 minuto


el Cliente llama al server

26
27

boolean flagCon=0; // Flag de conexin de conexin vlida servidor

28

boolean flagMod=0; // Flag de modificacin de salidas digitales


realizadas

29

String cadConsulta= "GET /requerimiento.php?consulta=1 HTTP/1.1";

30

String cadRespuesta="GET /requerimiento.php?consulta=2 HTTP/1.1";

31

String cadena="";

32

boolean httpRequest (String cad ); // Funcin que se encarga de


conectar al servidor Hosting y devuelve true o false si se conecto o no

33
34
35

void respuesta(); // Funcion de esperar la respuesta y recibir la cadena


HTML completa que responde el servidor

36

void modificarSalida(String cade); // funcion que procesa el estado de las


salidas, las separa y actua sobre las salidas

37

void setup() {

38

// Open serial communications and wait for port to open:

39

Serial.begin(9600);

40
41
42

// start the Ethernet connection: Primero intentamos por DCHP sino


vamos con Myip que es fija
if (Ethernet.begin(mac) == 0) {

43

Serial.println("Failed to configure Ethernet using DHCP");

44

// no point in carrying on, so do nothing forevermore:

45

// try to congifure using IP address instead of DHCP:

46

Ethernet.begin(mac, Myip);

47
}

48

// give the Ethernet shield a second to initialize:

49

delay(1000);

50

cadena = cadConsulta;

51
52

}// setup

53
54
55
56
57
58
59
60
61
62

void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if(millis()-start>=periodoConexion)
{
start=millis();
if(flagMod==1) // hay que enviar un GET consulta=2 para notificar
que se hizo el cambio
{ cadena = cadRespuesta;

63

Serial.println("Enviando confirmacin cambio realizado");

64

Serial.println(cadena);

65
66
67

flagMod=0; // Se pone a 0 para que no vuelva a notificar y de


ahora en mas solo enve GET con consulta=1
} // El proximo Get notificar al servidor la modificacin a la pgina
y el usuario asi podr saber

68

else {

69

cadena = cadConsulta;

70

Serial.println("Enviando connsulta");

71

Serial.println(cadena);

72

73

if(httpRequest(cadena)==1)

74

75

respuesta();

76

77
78

}// millis

79

80
81

boolean httpRequest(String cad)

82

83

flagCon=0; // lo ponemos por default a 0=false

84

Serial.println("connecting...");

85

// if you get a connection, report back via serial:

86

if (client.connect(server, 80)) { // CONECTAMOS AL SERVER

87

Serial.println("connected");

88

flagCon=1;

89

// Make a HTTP request:

90

//client.println("GET /requerimiento.php?consulta=1 HTTP/1.1"); Es de

91

esta forma

92

client.println(cad);

93

//client.println("GET /search?q=arduino HTTP/1.1");

94

//client.println("Host: www.google.com");

95

client.println("Host: www.guscir.hol.es");

96
97

client.println("Connection: close"); // este es como un fin de consulta


de GET
client.println();

98
}

99

else {

10
0

// kf you didn't get a connection to the server:

10
1

Serial.println("connection failed");
Serial.println("desconectando");

10
2

client.stop();
flagCon=0;

10
3
10
4
10
5
10
6
10
7
10
8
10
9
11

}
delay(2000); // damos tiempo
return flagCon;
}

void respuesta() // lee la respuesta del servidor que lo recibimos igual


que la funcin serial
{ char c;
String rx ; // Cadena de datos recibidos
String subx ; // subcadena filtrada
// Leemos la respuesta html del servidor, aca viene todo
while (client.available()>0)

11
1

c = client.read();

11
2
11
3
11
4
11
5
11
6
11
7
11
8
11
9
12
0
12
1
12
2
12
3
12
4
12
5
12
6

rx+=c; // Concatenamos
Serial.print(c);// A su vez vamos viendo en el monitor todo lo que
recibimos caracter por vez

} // while
client.stop(); // Detenemos el cliente , es decir cerramos la conexin del
cliente cuando termina la respuesta
// Si no se hace esto y se vuelve a intentar conectar da FALLA
// ANALIZAMOS LA CADENA DE RESPUESTA
//**********************************
//int longitud= rx.length(); // tomamos longitud de la cadena
int pos; // Posicin de inicio de subcadena sal1= , por GET consulta=1
int posok; // Posicion de inicio de subcadena okey por GET consulta=2
pos=rx.indexOf("sal1="); // Tomo la posicin del inicio de la subcadena
posok=rx.indexOf("okey");
//Serial.print("posicion de sal :");
//Serial.println(pos);
// Lo que me interesa son los 24 caracteres a partir de la posicin
detectada que incluye la N de no realizado y la R de realizado
if(pos!=-1) // indica que encontro subcadena sal1=
{
subx=rx.substring(pos,pos+25); // el parametro TO es no inclusivo,
por eso es 25 y no pos+24
Serial.print("La subcadena filtrada de interes es :");

12
7
12
8

Serial.println(subx);

if (subx.charAt(24)=='R') //NO Hay que modificar las salidas ya que


es la R de realizado

12
9

{
Serial.println("NO HAY QUE MODIFICAR NADA !!!!!!!");

13
0

flagMod=0;

13
1
13
2
13
3
13
4
13
5

}
if (subx.charAt(24)=='N') // Hay que modificar las salidas ya que es
la N de no realizado
{
Serial.println("HAY QUE MODIFICAR lAS SALIDAS DIGITALES");
modificarSalida(subx); // funcion que procesa el estado de las
salidas, las separa
}

13
6
13
7

}// pos
if(posok!=-1) // indica que encontro subcadena okey en respuesta de
consulta=2
{

13
8

Serial.println ("EL SERVIDOR ACUSO RECIBO DEL CAMBIO");

13
9
14
0
14
1

}
}

void modificarSalida(String cade)


{

14
2

/* En esta funcin debemos obtener los valores de las 4 salidas, 0 o 1

14

y luego de acuerdo a dicho estado modificar los pines digitales en

nuestra aplicacin

14
4

que se han obviado y solo se realizar el procesamiento dejando a su


elleccin la aplicacin

14
5

*/
int salida1,salida2,salida3,salida4;

14
6

salida1=cade.charAt(5)-'0';

14
7

salida2=cade.charAt(11)-'0';

14
8

salida4=cade.charAt(23)-'0';

salida3=cade.charAt(17)-'0';

Serial.print("SALIDA 1: ");

14
9

Serial.println(salida1);

15
0

Serial.print("SALIDA 2: ");
Serial.println(salida2);

15
1

Serial.print("SALIDA 3: ");
Serial.println(salida3);

15
2

Serial.print("SALIDA 4: ");

15
3

Serial.println(salida4);
flagMod=1;

15
4
15
5
15
6
15
7
15
8
15

9
16
0
16
1
16
2
16
3
16
4
16
5
16
6
16
7
16
8
16
9
17
0
17
1
17
2
17
3
Caracteristicas del Software
boolean httpRequest (String cad ) Es una funcin que se encarga de realizar la
conexin al servidor y realizar las consultas GET que pueden ser, como vimos ,
de dos tipos:

String cadConsulta= GET /requerimiento.php?consulta=1 HTTP/1.1; De


consulta
String cadRespuesta=GET /requerimiento.php?consulta=2 HTTP/1.1; De
confirmacin
Estas cadenas sern pasadas como argumento de la funcin httpRequest(). La
funcin devuelve True(1) o false(0) de acuerdo a si se pudo conectar al servidor
o no.
void respuesta() Es una funcin encargada de recibir las respuestas des
servidor, analizar si las respuestas son las cadenas de salida o los acuses de
recibo sobre el servidor de los cambios realizados por elWebClient. Filtra la
cadena total de respuesta que es html y extrae las subcadenas tiles para la
aplicacin, como son las de tipo (a), (b) o el okey de acuse de recibo en el
Cliente.
void modificarSalida(String cade) Esta funcin filtra an mas la Subcadena til
y extrae el 1 o el 0 de cada salida, y en este caso, saca por consola el estado
de cada salida.
Simplificando el funcionamiento se vera de la siguiente manera:

Es
quema Aplicacion WebClient
Capturas en el Monitor serie de Arduino WebClient
Consulta WebClient, donde No hay Modificaciones

Consulta
Peticin con valor=1
Consulta WebClient, donde hay Modificaciones que realizar

Consulta con
Valor=1 y cadena modificada por Usuario
Consulta WebClient de Confirmacin y acuse de recibo

Consulta=2 acuse recibo


Espero que les sea de utilidad, Los cdigos de expusieron para su anlisis. En
particular el cdigo Arduino presenta en su monitor serial toda la informacin
para el Debugger del mismo. Es de notar que si el Arduino se apaga por alguna
razn y luego emite su consulta va a recibir que ya esta Realizado y no
modificar el Estado de sus salidas. Esto se puede solucionar de varias
maneras, incluso el Arduino puede no basarse en el resultado de
REALIZADO/NO REALIZADO para actuar sobre las salidas, es decir puede actuar
siempre independiente de este estado, es decir cada vez que recibe la cadena
de salidas puede llamar a la funcin de modificarSalidas() y refrescarlas. La
idea fue hacer este proyecto para ver las mltiples aplicaciones que puede
tener. Si bien se guard la informacin en el sitio en un archivo de texto, nada
impide armar una Base de Datos en MySql y registrar cada cambio del usuario
que realiza en las salidas y obtener la cadena directamente de un registro de
dicha base. Las pginas estn montadas en el servidor gratuito , por lo tanto
solo tienen que bajarle el software al Arduino y disponer de una placa Ethernet
Shield o ArduinonEthernet para probar esta aplicacin.

S-ar putea să vă placă și