Los objetivos de esta práctica es manejar una luz, para luego ampliarla a otras cargas, desde un módulo WIFI esp8266 y arduino
Para ello vamos a empezar paso a paso desde el control del puerto serie de arduino, etiquetas AT del módulo, la programación y la puesta en servicio del módulo como servidor web, para activar-desactivar cargas desde Internet
Antes de empezar, tenemos que tener en cuenta los objetivos de esta práctica, que no son otros que introducirnos en el Internet de las cosas, ( IOT), donde la tendencia es a tener cada vez mas máquinas y componentes conectados a Internet. Es un trabajo de desarrollo, por tanto, NO ES UNA PRÁCTICA CERRADA y la mantendremos como un punto de partida para que, entre todos, desarrollemos mas este apasionante campo de las tecnologías de redes.
Como el enfoque es al nuestro ciclo de grado medio del IES Mare nostrum, iremos explicando algunas otras cosas que, sin ser propias del curriculum del módulo, son necesarias para implementar todo el sistema. Manos a la obra
1º Puerto serie de arduino.
En la primera imagen, tenemos representado un viejo conector serie RS232, que contiene los dos terminales de datos Rx y Tx. En nuestro arduino tambien disponemos de esos dos puntos mostrados como terminal 0 y 1 ( ver placa ).
Lo primero que vamos a hacer es instalar un programa en arduino para que, según la tecla pulsada, se encienda el led 13.
Las instrucciones que se usan para el puerto son:
-begin(velocidad) Se abre el puerto y establece la velocidad al valor marcado entre paréntesis .Varia entre 9600bps a 115000bps. Para el Uno, mejor 9600.
-available() Comprobamos el estado del buffer para ver si hay datos.
-read() Lee un solo carácter (byte) del buffer.
-write() Escribe tantos caracteres como quieras en el buffer.
-print() Imprime los datos al puerto serie como texto ASCII.
-println() Imprime los datos al puerto serie como print como texto ASCII con retorno de carro
-flush() Vacía el buffer de entrada de datos.
-end() Para la comunicación serie. Al terminar, los pines 0(RX) y 1 (TX) pueden ser usados por arduino como entradas o salidas digitales.
int lectura;
int led = 13;
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
//Comprobamos si existe datos disponibles y los leemos
if (Serial.available()>0){//leemos la opcion enviada
lectura=Serial.read();
if(lectura==’1′) {
digitalWrite(led, LOW);
Serial.println(«Led apagado»);
delay (500);
}
if(lectura==’2′) {
digitalWrite(led, HIGH);
Serial.println(«Led Encendido»);
delay (500);
}}}
Biblioteca -> Documentos -> arduino -> libraries
#include <ESP8266.h>#include <SoftwareSerial.h>const char* SSIDE = «Celi»;
const char* PASSWORD = «contraseña de la red Celi»;
const char* HOST_NAME = «www.marenostrum.esy.es»;// Página web
const int HOST_PORT = 80; // puerto de conexión . Para web es el 80
SoftwareSerial softSerial(2, 3); // Pongo puertos 2 y 3 para RX, TX
ESP8266 wifi(softSerial); // Comunicacion para el módulo esp8266
void setup(void)
{Serial.begin(9600); // Ponemos la velocidad del puerto a 9600 baudios
pinMode(13, OUTPUT); // nuestro pin 13 a salida/* Ahora veremos si establecemos comunicación con el módulo esp 8266 . Si tenemos exito, imprimimos el texto to station + softap ok y si no tenemos exito, se muestra el texto to station + softap err. Vemos que aparece \r\n y esto es para indicar que se termina y se salta de linea */if (wifi.setOprToStationSoftAP()) {
Serial.print(«to station + softap ok\r\n»);
}
else {
Serial.print(«to station + softap err\r\n»);
}
Un poco mas abajo tenemos otra comprobación de wifi.disableMUX. Esto, segun la documentación del módulo, dada en http://docs.iteadstudio.com/ITEADLIB_Arduino_WeeESP8266/class_e_s_p8266.html no indica que
Disable IP MUX(single connection mode).
In single connection mode, only one TCP or UDP communication can be builded.
if (wifi.joinAP(SSIDE, PASSWORD)) {
Serial.print(«Hemos conectado con la red WIFI\r\n»);
Serial.print(«IP:»);
Serial.println(wifi.getLocalIP().c_str());
}
else {
Serial.print(«Uff, algo pasa. No tenemos conexión\r\n»);
}
if (wifi.disableMUX()) { // si tenemos única comunicación , se muestra OK
Serial.print(«single ok\r\n»);
}
else {
Serial.print(«single err\r\n»); // no se logra ünica TCP ( esta en multi TCP )
}
Serial.print(«setup end\r\n»); // fin del setup
}
void loop(void)
{
uint8_t buffer[800] = { 0 }; // establecemos el buffer de datos inicial a 0if (wifi.createTCP(HOST_NAME, HOST_PORT)) { // si tenemos conexión TCP a la web y en el puerto 80
Serial.print(«Conexión TCP ok\r\n»); // se imprime Conexión TCP ok
}
else { // en caso contrario
Serial.print(«mostramos error en la conexión tcp\r\n»); // mostramos error en la conexión tcp
}/* Ahora se crea una variable , llamada request, que posteriormente vamos a entrar al módulo para obtener la lectura de la página. La variación que hemos añadido es despues del GET/ que nos indica que no vamos a leer la página principal, sino otra de la que hablaremos, que se llama resultado.php. En esta página vamos a guardar toda la información que vamos a necesitar */
char *request = «GET /resultado.php HTTP/1.1\r\nHost: marenostrum.esy.es\r\nConnection: close\r\n\r\n»;
wifi.send((const uint8_t*)request, strlen(request)); // mandamos la solicitud a la página
uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); / tomamos la longitud del buffer recibido
if (len > 0) // si hay lectura, ( buffer con datos )
{
Serial.print(«Datos recibidos de la web:\r\n»); // Mostramos Datos recibidos de la web/* Aunque no es necesario, vamos a explicar que es eso de uint32_t , o uint8_t*. Este viene a decir cómo se deben tratar los datos que se reciben.
- La U vienen de tipo unsigned, o sea, no está definido
- lo siguiente ( int ) nos indica que es un valor entero
- El numero que lo acompaña, 8, 16, 32, etc, hace referencia a los bits utilizados
- Por último, _t nos dice que el tamaño es estandar para todas las plataformas
*/
for (uint32_t i = 0; i < len; i++)
{
char c = (char)buffer[i];/* Para leer una parte concreta de la información que nos llega, hemos añadido el gusanillo como comodín de entrada, de forma que si llegamos a encontrar ese valor, empezamos a crear un array con todo el texto que haya entre el gusalillo de entrada y salida */
if (c == ‘~’)
{
for (uint32_t j = i + 1; j < len; j++)/*
aquí, el valor de partida del contador j es el siguiente al valor detectado en el gusalillo, o sea, que si en el anterior de i, vemos que el gusanillo tiene la posición 45, el valor de j, será 46 y a partir de ese valor, se irán tomando datos */
{
c = (char)buffer[j];
if (c == ‘1’) // Si detectamos que hay un 1, damos orden de encender el LED 13
{ digitalWrite (13, HIGH);}
if (c == ‘0’) // Si aparece el 0, apagamos el LED 13
{ digitalWrite (13, LOW);}
// else { digitalWrite (13, LOW);}
if (c == ‘~’) break; // si se detecta el gusanillo, cerramos el array en imprimimos c
Serial.print(c);
}
break;
}}
Serial.print(«\r\n»); // imprimimos salto de carro
}//while (1) delay(1000); // esto lo hemos quitado
delay(1000); // esperamos un segundo para tomar la siguiente lectura.- Por si la cosa ha cambiado
}
- index.php . Esta página contiene los formularios de actuación. En nuestro caso empezamos con un encender apagar de led. Lo podemos ver en http://marenostrum.esy.es/
- led.php Esta página toma las variables enviadas por index.php para hacer una grabación de datos en la base de datos
- db.php . En este archivo se tenemos la configuración de la base de datos ( datos y claves )
- resultado.php. Esta página, cada vez que la llamamos, hace una petición sql a la base de datos, para mostrar las variables que necesita arduino para encender o apagar el led
Todas ellas, las podemos bajar en el ENLACE WEB
- Donde está. En este caso, viene como Host Mysql, y nos dice que la base está alojada en mysql.hostinger.es. Otras veces suele poner localhost
- Cómo se llama la base de datos.
- Cómo se llama el usuario de la base de datos
- La contraseña de ese usuario
Con esos 4 datos, no podemos conectar a la base de datos y, esos datos tienen que estar guardados en el archivo db.php
- CREATE TABLE IF NOT EXISTS `datos` (
`id` int(11) NOT NULL,
`led` tinyint(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; - INSERT INTO `datos` (`id`, `led`) VALUES
(1, 0);
8 Archivo de grabar los datos ( led.php )
Si lo abrimos, tenemos el código por excelencia utilizado en el mundo web, el PHP . pasamos a comentar algunas cosillas.
Lo promero , se abre con las etiquetas <?php, luego decimos que inicie una sesión «session_start();», lo cual no es obligatorio, pero necesario en nuestro caso para pasa crear variables de sesión, luego incluimos el archivo db.php con los datos de conexión y después una serie de lineas para saber si hemos tenido éxito en la conexión.
En la linea if, vemos si del formulario de contacto, recibimos la variable $_POST[‘encender’], que tendrá el valor encender si alguien en el formulario ha pinchado en ese botón ( luego lo veremos ).
En caso afirmativo, se graba el dato en la base de datos «resultado.php » utilizando laa lineas
1º $sql = «UPDATE datos SET led=1 WHERE id = 1 «;
2º mysqli_query($link, $sql);
La 1º se crea la variable de texto $sql con el valor que se muestra, diciendo que se actualice la tabla datos poniendo (SET) el registro led a 1, donde( WHERE ) el id es 1
La 2º linea nos dice que conectemos a la base de datos y volquemos ese texto $sql
Ademas , aparece $_SESSION[«led»]=1. Esto no dice se crea una variable , llamada $_SESSION[«led»], que va a ser siempre 1, independientemente de qué pagina de nuestro proyecto estemos. Ese valor será recogido luego por la página del formulario para mostrarlo en pantalla.
Lo mismo podemos decir para el resto del programa. La última linea de header nos manda a la pagina principal, pasado dos segundos
<?php
session_start();
include(«db.php»);$link = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
// mysqli_set_charset($link,’utf8′);
mysqli_set_charset($link,’iso-8859-1′);
/* verificar la conexión */
if (mysqli_connect_errno()) {
printf(«Conexión fallida: %s\n», mysqli_connect_error());
exit();
}
if ($_POST[‘encender’] ==»encender»)
{
$sql = «UPDATE datos SET led=1 WHERE id = 1 «;mysqli_query($link, $sql);
echo «Encendemos el LED»;
$_SESSION[«led»]=1;
}if ($_POST[‘apagar’] ==»apagar»)
{
$sql = «UPDATE datos SET led=0 WHERE id = 1 «;mysqli_query($link, $sql);
echo «Apagamos el LED»;
$_SESSION[«led»]=0;
}header( «refresh:2; url=http://marenostrum.esy.es/» );
?>