Beruflich Dokumente
Kultur Dokumente
Curso 2017-2018
Internet de las cosas. Sistema electrónico de control basado en Arduino
2
Resumen
Con estos elementos creamos una estructura autosuficiente que nos permitirá
desde cualquier lugar ver el estado del hogar e interactuar con él en tiempo real
gracias a las soluciones implementadas.
3
Internet de las cosas. Sistema electrónico de control basado en Arduino
Abstract
With all these elements we create a self-working structure that allows us to see
which the situation of our home in real time is even if we are not at home. All of
this is possible thanks to the information proportioned by implemented solutions.
4
Tabla de contenidos
1. Introducción ....................................................................................................8
2. Tecnologías .................................................................................................... 10
2.1 NodeMCU (ESP8266-12) ........................................................................... 10
2.2 Sensores y actuadores ................................................................................ 12
2.2.1 Módulo de temperatura y humedad (DHT 11) ................................... 12
2.2.2 Módulo con fotorresistencia (KY-018) .............................................. 13
2.2.3 Led + Botón ........................................................................................ 14
2.3 Raspberry Pi ................................................................................................ 15
2.3.1 Base de Datos ......................................................................................... 17
2.3.1.1 phpMyAdmin .................................................................................... 17
2.3.2 Servidor Apache ..................................................................................... 18
2.4 Android ....................................................................................................... 19
2.5 Comunicación .............................................................................................20
2.5.1 Servicio DNS No-IP ................................................................................20
2.5.2 PHP y HTTP ...........................................................................................20
2.6 Herramientas de ayuda al desarrollo ........................................................ 22
3. Desarrollo (implementación) ........................................................................ 23
3.1 Estudio del proyecto .................................................................................... 23
3.2 Implementación .......................................................................................... 24
3.2.1 Electrónica ........................................................................................... 24
3.2.1.1 Modulo DHT11 .............................................................................. 25
3.2.1.2 Modulo KY-018 ............................................................................ 27
3.2.1.3 Led y Botón ................................................................................... 29
3.2.1.4 Comunicación Wifi ....................................................................... 31
3.2.2 Servidor ............................................................................................... 36
3.2.2.1 Configurar NO-IP ......................................................................... 36
3.2.2.2 Configurar LAMP ......................................................................... 37
3.2.2.3 Creación Base de Datos................................................................ 39
3.2.3 Dispositivos ......................................................................................... 41
5
Internet de las cosas. Sistema electrónico de control basado en Arduino
6
7
Internet de las cosas. Sistema electrónico de control basado en Arduino
1. Introducción
El proyecto que nos ocupa se centrará en crear todos los componentes que
forman un sistema domótico. Los diferentes campos del proyecto se pueden
dividir en cuatro grandes grupos: electrónica, servidor, comunicación y
dispositivos.
8
luminosidad y actuadores para obtener el estado de la vivienda y hacer alguna
modificación, por ejemplo, encender luces. Con la placa NodeMCU
gestionamos los sensores y manejamos los actuadores. Y usaremos esta placa
para enviar esta información a la base de datos.
9
Internet de las cosas. Sistema electrónico de control basado en Arduino
2. Tecnologías
En este apartado analizamos las tecnologías y componentes de las que
haremos uso en nuestro proyecto.
10
La razón de usar NodeMCU en vez de un ESP8266 simple ha sido la facilidad
de conexión con el ordenador y la alimentación, siendo con el ESP8266
necesaria para su programación usar comandos AT o usar un conector FTDI
para poder conectarlo y subir programas mediante el IDE de Arduino.
Otras opciones para el desarrollo del proyecto eran usar una placa Arduino
Mega y usar el ESP8266 como esclavo, algo que al final fue descartado porque
el chip wifi es capaz de hacer él las tareas de Arduino y acababa siendo
innecesario.
11
Internet de las cosas. Sistema electrónico de control basado en Arduino
Se compone de 3 pines: VCC (5V), GND y datos y para tratar los datos
recibidos en Arduino haremos uso de la librería “DHT sensor library” que nos
permitirá tratar los datos de forma sencilla.
12
2.2.2 Módulo con fotorresistencia (KY-018)
Se compone de 3 pines: VCC (5V), GND, datos que envía una señal analógica
que es un numero entero que indica la intensidad de la luz.
13
Internet de las cosas. Sistema electrónico de control basado en Arduino
Con estos dos elementos vamos a crear un montaje que nos permitirá
encender y apagar un led manualmente (simulando con esto el funcionamiento
de un interruptor de una luz de la vivienda). Esto se verá representado en el
sistema domótico y podremos modificarlo también remotamente, ejemplificando
así el control dual (remoto y presencial) de un elemento de un sistema
domótico.
14
2.3 Raspberry Pi
Hay otras alternativas en el mercado como Orange Pi, muy parecida y que
puede usar hasta las mismas imágenes oficiales de Raspberry y otras más
potentes como ODROID-XU4 con procesador de 8 núcleos y 2 GB de RAM,
aunque su precio también es bastante mayor llegando a los 125€.
15
Internet de las cosas. Sistema electrónico de control basado en Arduino
Como el servidor estará alojado dentro de una red privada tendremos que
hacer uso del servicio DNS No-IP para poder redireccionar las peticiones a
nuestro servidor.
Ilustración 7: Raspberry Pi 3 B
Especificaciones técnicas:
16
2.3.1 Base de Datos
2.3.1.1 phpMyAdmin
17
Internet de las cosas. Sistema electrónico de control basado en Arduino
crear y eliminar bases de datos, crear, eliminar y alterar tablas, borrar, editar y
añadir campos, ejecutar cualquier sentencia SQL, administrar claves en
campos, administrar privilegios, exportar datos en varios formatos y está
disponible en 72 idiomas. Se encuentra disponible bajo la licencia GPL Versión
2.
18
2.4 Android
Vamos a diseñar una aplicación Android en la que poder mostrar todos los
datos provenientes del funcionamiento del sistema domótico y donde podamos
interactuar con él. Podremos apagar una luz, mostrar temperatura, etc. Para su
desarrollo usaremos el IDE de AndroidStudio que nos facilitara su
programación.
19
Internet de las cosas. Sistema electrónico de control basado en Arduino
2.5 Comunicación
No-IP es una compañía que ofrece un servicio de DNS dinámica para servicios
de pago y gratuitos. La función más usada del sistema de nombres de dominio
(DNS) es la de relacionar una dirección IP a un nombre, por ejemplo,
216.58.210.163 al nombre de www.google.es.
20
2.5.2 PHP y HTTP
El envío de datos entre los diferentes nodos del sistema (Raspberry, Web,
NodeMCU) se realizará utilizando HTTP y PHP.
Lo que distingue a PHP de algo del lado del cliente como JavaScript es que el
código es ejecutado en el servidor, generando HTML y enviándolo al cliente. El
cliente recibirá el resultado de ejecutar el script, aunque no se sabrá el código
subyacente que era.
21
Internet de las cosas. Sistema electrónico de control basado en Arduino
// Instalación
En los ordenadores con Windows para llevar a cabo la conexión SSH hemos
hecho uso de la herramienta MobaXterm que nos permite abrir varias sesiones
y otras utilidades. También tendrás que introducir nombre, contraseña y
dirección.
22
3. Desarrollo (implementación)
3.1 Estudio del proyecto
APP PÁGINA
ANDROID WEB
BASE DE DATOS
(SERVIDOR)
NODEMCU 1 NODEMCU 2
23
Internet de las cosas. Sistema electrónico de control basado en Arduino
Tenemos un servidor que hace de nodo central que funciona de puente entre
los dos lados. No hay comunicación directa entre las placas y los sensores y la
aplicación Android ni la página web. Esta independencia entre componentes
hace el sistema más escalable facilitando el añadir nuevos dispositivos, ya que
no habría que reprogramar ningún NodeMCU, sensor o actuador.
3.2 Implementación
3.2.1 Electrónica
Para controlar los componentes vamos a usar los NodeMCU. Estos gracias a
un “plugin” se puede programar como si fuera un Arduino y usando su IDE.
Como los NodeMCU se conectan al ordenador por micro USB no requieren de
conector “FTDI” para cargar los programas.
Para poder usar el IDE de Arduino con los NodeMCU necesitamos primero
configurarlo adecuadamente. Para ello debemos ir a
“Archivo/Preferencias/gestor URLs Adicionales de Tarjetas” y ahí poner la URL
de la placa que queremos cargar (la URL la encontramos en
https://github.com/esp8266/Arduino).
24
Los siguientes apartados se pueden dividir en dos partes diferenciadas, por un
lado, la conexión de los componentes electrónicos que vamos a usar y por otro
la programación de estos con el IDE de Arduino.
Conexión:
25
Internet de las cosas. Sistema electrónico de control basado en Arduino
Programación:
#include <DHT.h>
int pinDht=2;
DHT dht(pinDht,DHT11);
void getDataFromSensor()
{
int auxTemp= dht.readTemperature();
int auxHum=dht.readHumidity();
void setup()
{
dht.begin();
Serial.begin(9600);
}
26
En el método “loop” que se repite constantemente lo que hacemos es
simplemente llamar al método “getDataFromSensor”. Le hemos introducido un
“delay” para que coja datos cada 30 segundos ya que estamos hablando de
valores que cambian poco con el tiempo y lo hacen lentamente por lo que estar
constantemente consultando el estado solo significa un consumo extra por
parte del sistema y no tendríamos ventajas en el funcionamiento general de
este.
void loop()
{
//Coge informacion del sensor
getDataFromSensor();
27
Internet de las cosas. Sistema electrónico de control basado en Arduino
Conexión:
La salida de este sensor es analógica por lo que hay que conectarla al pin A0
del NodeMCU que es el único pin analógico de la placa.
Programación:
Empezamos definiendo el pin por el que recibirá los datos la placa. En este
caso al ser analógica la entrada solo puede ser por el pin A0 ya que no tiene
más entradas analógicas.
void getDataFromSensor()
{
luz=analogRead(pinLuz);
Serial.print(" Luz: ");
Serial.print(luz,DEC);
}
void loop()
{
//Coge informacion del sensor
getDataFromSensor();
}
28
3.2.1.1 Led y Botón
Conexión:
29
Internet de las cosas. Sistema electrónico de control basado en Arduino
Programación:
void setup()
{
pinMode(led, OUTPUT);
pinMode(button, INPUT);
attachInterrupt(button, manejadorLed, RISING);
}
void manejadorLed(){
if(millis()>t+250)
{
estado=digitalRead(led);
if(estado==LOW)
{
digitalWrite(led,HIGH);
}
else
30
{
digitalWrite(led,LOW);
}
}
t=millis();
}
Como Cliente:
Para conectarnos a la red wifi y realizar las peticiones HTTP vamos a servirnos
de una librería disponible para ESP8266 que es “ESP8266WiFi” que nos
proporcionara las herramientas necesarias para realizar nuestro trabajo.
Para llevar a cabo la conexión vamos a empezar por definir las variables para
conectarnos al wifi y el nombre del host donde está el servidor.
31
Internet de las cosas. Sistema electrónico de control basado en Arduino
#include <ESP8266WiFi.h>
void setup()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
En el método “loop” crearemos un cliente y abriremos una conexión TCP. Una vez
hecho esto crearemos la URL de la petición poniendo las variables y sus valores. Le
vamos a pasar una variable “pass” con la contraseña necesaria para poder ejecutar el
PHP y así hacerlo un poco más seguro.
void loop()
{
// Usamos WiFiClient para crear conexiones TCP
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
32
Por último, realizaremos el “GET” y esperaremos la respuesta del servidor.
<?php
$password="1234";
if( $_GET['pass'] == $password)
{
require("parametrosConfDB.php");
33
Internet de las cosas. Sistema electrónico de control basado en Arduino
// Ejecutamos la instruccion
mysqli_query($con, $query);
mysqli_close($con);
}
else
{
echo "Acceso bloqueado. Necesitas la contraseña para acceder a la base
de datos.";
}
?>
Como Servidor:
void setup()
{
// Start the server
server.begin();
}
int getDataClient()
{
// Comprueba si hay algún cliente conectado
WiFiClient client = server.available();
if (!client) {
return -1;
}
34
delay(1);
}
Ahora comprobamos la URL y si acaba en “/gpio/0” o “/gpio/1”. Esto será lo que nos
indique si nos están mandando apagar o encender el led ya que no estamos
mandando variables en la URL para controlar el led, sino que usamos solo la dirección
de la petición.
void loop()
{
35
Internet de las cosas. Sistema electrónico de control basado en Arduino
3.2.2 Servidor
Como el servidor está alojado en una red privada no puede accederse desde
fuera de la red por lo que no funcionaría desde fuera de casa. Para ello lo que
hay que hacer es hacer redirección de puertos (“port forwarding”), es decir,
accedemos al rúter de la red en la que está el servidor y abrimos uno de los
puertos que estén libres y le indicamos que todo el tráfico que valla a ese
puerto lo envíe a la dirección IP de nuestro servidor. De esta forma si te
conectas a la dirección pública del rúter con el puerto indicado te enviara a
nuestro servidor.
36
Como se observa en la captura los puertos 80, 22, 5000 están abiertos para el
servidor, la conexión SSH y la conexión con el ESP8266 respectivamente.
37
Internet de las cosas. Sistema electrónico de control basado en Arduino
// Te pedirá que pongas una contraseña (tiene que ser la misma // que la
de MySQL
Include /etc/phpMyAdmin/apache.conf
// reiniciamos Apache
38
3.2.2.3 Creación Base de Datos
Dicho lo anterior vamos a implementar una base de datos con dos tablas,
“valores” que se encargara de almacenar los datos del sensor de temperatura y
humedad que enviara un NodeMCU. Y “valoresLuz” que almacenará los
valores del sensor lumínico y del actuador led enviados por el otro modulo wifi.
La tabla “valores” estará compuesta por cuatro campos, los campos “ID”,
“Tiempo”, “Temperatura” y “Humedad”.
39
Internet de las cosas. Sistema electrónico de control basado en Arduino
40
3.2.3 Dispositivos
Para mostrar los datos hemos creado una página web albergada en la
Raspberry a la cual se accede desde el navegador escribiendo:
rodrigodomotica.ddns.net o también con rododrigodomotica.ddns.net/index.php.
41
Internet de las cosas. Sistema electrónico de control basado en Arduino
<?php
include("consultaDB.php");
consultaDB($dbhost,$dbuser,$dbpass,$dbname);
?>
Esto lanza la función “consultaDB” con los parámetros para poder iniciar
conexión con MySQL.
Primero creamos las variables globales donde guardar los datos que serán
accesibles desde todo el HTML, creamos la conexión con la base de datos y
formamos la petición SQL.
<?php
include('parametrosConfDB.php');
include('crearConexion.php');
include("consulta.php");
include('curl');
function consultaDB($dbhost,$dbuser,$dbpass,$dbname)
{
global $temp, $humedad, $time, $luz, $led;
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
$consultaSQL="SELECT Temperatura, Humedad, Tiempo FROM valores
WHERE ID=(Select MAX(ID) From valores)";
$consultaSQLLuz="SELECT Luz, Led FROM valorLuz
WHERE ID=(Select MAX(ID) From valorLuz)";
42
A continuación, con la conexión creada y la petición formada hacemos la
consulta y guardamos los datos obtenidos en las variables.
$data=consulta($enlace,$consultaSQL);
$dataLuz=consulta($enlace,$consultaSQLLuz);
$temp=$data["Temperatura"];
$humedad=$data["Humedad"];
$time=$data["Tiempo"];
$luz=$dataLuz["Luz"];
$led = $dataLuz["Led"];
Y por último si “index.php” ha sido lanzado desde el botón para que encienda o
apague el led, nos habrá mandado una variable “valorLed” con “true”, si ha sido
así entonces creamos la URL oportuna para la petición HTTP al NodeMCU. Si
el led estaba encendido mandamos un 0 y si estaba apagado un 1 para que
cambie de estado.
if($_POST["valorLed"])
{
if($led == 1)
{
$led =0;
$url = "http://rodrigodomotica.ddns.net:5000/gpio/0";
}
else
{
$url = "http://rodrigodomotica.ddns.net:5000/gpio/1";
$led =1;
}
Con la URL formada ahora hacemos dos cosas, guardamos el nuevo estado en
la base de datos, y usando cURL hacemos la petición HTTP al NodeMCU.
$ch = curl_init("$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_exec($ch);
}
//Cierra la conexión
mysqli_close($enlace);
}
43
Internet de las cosas. Sistema electrónico de control basado en Arduino
<?php
function conectar($dbhost,$dbuser,$dbpass,$dbname)
{
if (!($enlace=mysqli_connect($dbhost,$dbuser,$dbpass,$dbname)))
{
echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
echo "error de depuración: " . mysqli_connect_errno() .
PHP_EOL;
echo "error de depuración: " . mysqli_connect_error() .
PHP_EOL;
exit;
}
return $enlace;
}
?>
<?php
function consulta($enlace,$consultaSQL)
{
if($resultado= mysqli_query($enlace,$consultaSQL))
{
while($fila=mysqli_fetch_array($resultado,MYSQLI_ASSOC))
{
$data=$fila;
}
}
return $data;
}
?>
<div class="datos">
<img class ="iconosDatosLed" src="led.png">
<form class="btnActualizarLuz" action="index.php" method="post">
<input type="hidden" name="valorLed" value=true />
<?php
if($led)
44
{
echo "<p><input type='submit' value='Apagar'
/></p>";
}
else echo "<p><input type='submit' value='Encender'
/></p>";
?>
</form>
</div>
<div class="datos">
<img class="iconosDatos" src="humedad.png">
<?php
echo "<p class= 'valores'><strong>" .$humedad ."
%</strong></p>";
?>
</div>
$(document).ready(function(){
$(".enlacesNoSubrallados").mouseover(function () {
$(this).css('text-decoration', 'underline');
})
})
$(document).ready(function(){
$(".enlacesNoSubrallados").mouseleave(function () {
$(this).css('text-decoration', 'none');
})
})
$(document).ready(function(){
$(".menu").mouseleave(function () {
$(this).css('text-decoration', 'none');
$(this).css('color', '#008080');
})
})
45
Internet de las cosas. Sistema electrónico de control basado en Arduino
$(document).ready(function(){
$(".menu").mouseover(function () {
$(this).css('text-decoration', 'underline');
$(this).css('color', '#ff8000');
})
})
46
3.2.3.2 Aplicación Android
Para desarrollar la aplicación vamos a hacer uso del IDE que proporciona
Google AndroidStudio. La aplicación se estructura en seis actividades, una
pantalla principal desde donde tienes acceso a todas las demás y con una
barra lateral desde la que también puedes moverte por las distintas opciones.
Otras tres actividades donde se muestran los datos de los sensores y el control
del led como son “Iluminación”, “Temperatura” y “Humedad”. Otra actividad con
información meteorológica, otra de configuración y finalmente una con
información sobre el desarrollador.
Actividad Principal:
47
Internet de las cosas. Sistema electrónico de control basado en Arduino
case R.id.button_temperatura:
intent = new Intent(this,TemperaturaActivity.class);
startActivity(intent);
break;
}
}
48
Actividad Temperatura y Humedad:
49
Internet de las cosas. Sistema electrónico de control basado en Arduino
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temperatura);
getDataSensor.delegate=this;
getDataSensor.execute("http://rodrigodomotica.ddns.net/getAndroid.p
hp?pass=1234");
}
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
InputStream is = null;
int len = 500;
String contentAsString;
HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
int response = connection.getResponseCode();
is = connection.getInputStream();
contentAsString = readStream(is, len);
50
Y finalmente nosotros haciendo uso de la interfaz creada por nosotros
“AsyncResponse” llevamos el resultado a nuestra clase.
@Override
protected void onPostExecute(String result)
{
delegate.processFinish(result);
}
try {
JSONObject json = new JSONObject(output);
temperatura.setText(json.getString("Temperatura")+" ºC");
ultActualizacion.setText("Última actualización:
"+json.getString("TiempoTemp"));
} catch (JSONException e) {
e.printStackTrace();
}
}
<?php
include('parametrosConfDB.php');
include('crearConexion.php');
include("consulta.php");
$password="1234";
if( $_GET['pass'] == $password)
{
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
51
Internet de las cosas. Sistema electrónico de control basado en Arduino
$data=consulta($enlace,$consultaSQL);
$dataLuz=consulta($enlace,$consultaSQLLuz);
$arr =
array("Luz"=>$dataLuz["Luz"],"Led"=>$dataLuz["Led"],"Tiempo"=>$dataLuz["T
iempo"],
"Temperatura"=>$data["Temperatura"],"Humedad"=>$data["Humedad"],"TiempoTe
mp"=>$data["Tiempo"]);
echo json_encode($arr);
}
?>
52
Actividad Iluminación:
if(datos.isLed())
53
Internet de las cosas. Sistema electrónico de control basado en Arduino
{
image.setImageDrawable(getResources().getDrawable(R.mipmap.
bombilla_apagada_redonda));
datos.setLed(false);
postDataSensor.execute("http://rodrigodomotica.ddns.net/postL
uzAndroid.php?pass=1234&Led=0");
}else
{
image.setImageDrawable(getResources().getDrawable(R.mipmap.
bombilla_encendida_redonda));
datos.setLed(true);
postDataSensor.execute("http://rodrigodomotica.ddns.net/postL
uzAndroid.php?pass=1234&Led=1");
}
}
Include(‘…’)
$password="1234";
if( $_GET['pass'] == $password)
{
$led = $_GET['Led'];
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
$url = "http://rodrigodomotica.ddns.net:5000/gpio/{$led}";
$ch = curl_init("$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_exec($ch);
curl_close($ch);
54
Actividad Meteorología:
Una vez conformada la URL solo hay que llamar al método “doInBackground” y
obtenemos la respuesta en forma de JSON.
55
Internet de las cosas. Sistema electrónico de control basado en Arduino
String ciudad=this.parent.getUbicacion();
56
Actividad Configuración:
57
Internet de las cosas. Sistema electrónico de control basado en Arduino
if(!hola.equals("")){
editor.putString("ubicacion",et.getText().toString());
editor.apply();
if(hola.equals(preferences.getString("ubicacion","aaasdfafddf")))
Toast.makeText(ConfiguracionActivity.this,R.string.
correcto_cambioUbicacion,Toast.LENGTH_SHORT).show();
else Toast.makeText(ConfiguracionActivity.this,
R.string.error_cambioUbicacion,Toast.LENGTH_SHORT).show();
}
else Toast.makeText(ConfiguracionActivity.this,"Ubicación no
válida",Toast.LENGTH_SHORT).show();
}
58
4. Presupuesto
En este apartado se especifican los costes asociados al proyecto. Los costes
se encuentran desglosados en tres apartados: mano de obra, material y
licencias de software.
Mano de obra:
En esta tabla se muestran los costes por hora y por tipo de trabajo realizados.
Supervisor 10 20 200
Subtotal 6248
Material:
Subtotal 950
59
Internet de las cosas. Sistema electrónico de control basado en Arduino
Raspberry Pi 3B Computador 1 40 40
KY-18 Sensor 1 2 2
Multímetro Instrumento 1 15 15
eléctrico
Electrónica Componentes 1 20 20
varios: led, cables,
etc.
Subtotal 89.5
Licencias de software:
En este apartado se muestran las licencias que hemos tenido que adquirir para
poder desarrollar el proyecto.
Subtotal 149
60
Presupuesto final:
Total 7436.5
61
Internet de las cosas. Sistema electrónico de control basado en Arduino
5. Conclusión y mejoras
Por último, para concluir este proyecto vamos a realizar un análisis del trabajo
realizado para conseguir llegar hasta este punto, y las posibles mejoras que se
podrían implantar o cambios que ahora con perspectiva se vean más claros.
Estas mejoras que se podrían aplicar al proyecto son utilizar el protocolo MQTT
(que es un protocolo planeado para IoT, con un consumo muy reducido y
posibilidad de suscribirse a temas…) para realizar la comunicación entre los
componentes. Otra mejora muy importante (sobre todo en sistemas conectados
a la red) es la seguridad. Este es un tema muy amplio, ya que hay muchos
campos a segurizar: registro de usuarios, encriptación de contraseñas de
62
usuarios, protocolos seguros como HTTPS, en vez de permitir el acceso directo
a la base de datos, desarrollar una API para obtener los datos.
Por lo que, para finalizar, este proyecto toca una cantidad asombrosa de
tecnologías lo que se traduce en un gran aprendizaje por parte del estudiante.
También es un proyecto con muchas posibilidades y que se podría seguir
aumentando indefinidamente, como hemos mostrado con las mejoras
implementables, así que hemos intentado asegurarnos de que el proyecto es
suficientemente representativo de la variedad de posibilidades que hay.
63
Internet de las cosas. Sistema electrónico de control basado en Arduino
6. Bibliografía
[1] Como montar LAMP en una Raspberry Pi:
https://www.1and1.es/digitalguide/servidores/configuracion/como-
configurar-un-servidor-web-raspberry-pi-con-lamp/
[2] Página web oficial de Raspberry PI, información, instalación de sus sistemas
operativos: https://www.Raspberrypi.org/
[15] Llorens Agost, Marisa, Gómez Adrián, Jon Ander, Galiano Ronda, Isabel
(2016), “Empezar a programar usando Java”, Académica
[16] Jesús Tomás Gironés (2017), “El gran libro de Android 6ª Ed”, Marcombo
[17] Upton, Eben (2013), “Raspberry Pi: guía del usuario”, Anaya Multimedia
64
7. Anexos
7.1 Programa NodeMCU (DHT11)
#include <DHT.h>
#include <ESP8266WiFi.h>
void getDataFromSensor()
{
//luz=analogRead(pinLuz);
int auxTemp= dht.readTemperature();
int auxHum=dht.readHumidity();
void setup()
{
dht.begin();
Serial.begin(9600);
65
Internet de las cosas. Sistema electrónico de control basado en Arduino
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void loop()
{
Serial.print("connecting to ");
Serial.println(host);
66
7.2 Programa NodeMCU (Luz, Led y Botón)
#include <ESP8266WiFi.h>
void getDataFromSensor()
{
luz=analogRead(pinLuz);
}
void manejadorLed(){
if(millis()>t+250)
{
//cont++;
estado=digitalRead(led);
if(estado==LOW)
{
digitalWrite(led,HIGH);
clientLed = estado = HIGH;
}
else
{
digitalWrite(led,LOW);
clientLed = estado = LOW;
67
Internet de las cosas. Sistema electrónico de control basado en Arduino
}
}
t=millis();
}
void setup()
{
//Cuando caiga(falling), flanco de bajada de la señal
pinMode(led, OUTPUT);
digitalWrite(led, estado);
pinMode(button, INPUT);
attachInterrupt(button, manejadorLed, RISING);
Serial.begin(9600);
//INICIA LA CONEXION Y ESPERA HASTA QUE ESTE REALIZADA
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
int getDataClient()
{
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return -1;
}
68
else {
Serial.println("invalid request");
client.stop();
return -1;
}
client.flush();
return val;
}
void loop()
{
//int estadoLed = digitalRead(led);
int clientLed = getDataClient();
if(clientLed != estado && clientLed != -1)
{
digitalWrite(led, clientLed);
estado = clientLed;
}
69
Internet de las cosas. Sistema electrónico de control basado en Arduino
while (client.available()) {
String line = client.readStringUntil('\r');
}
}
<?php
$password="1234";
if( $_GET['pass'] == $password)
{
require("parametrosConfDB.php");
//Conexion con la base de datos
$con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
//obtenemos los datos de la url y con el formato para query apropiado
$Temperatura = mysqli_real_escape_string($con, $_GET['Temperatura']);
$Humedad = mysqli_real_escape_string($con, $_GET['Humedad']);
// EInsertamos los valores en la tabla
$query = "INSERT INTO valores(Temperatura, Humedad)
VALUES('$Temperatura','$Humedad')";
// Ejecutamos la instruccion
mysqli_query($con, $query);
mysqli_close($con);
*/
}
else
{
echo "Acceso bloqueado. Necesitas la contraseña para acceder a la base
de datos.";
}
?>
<?php
$password="1234";
if( $_GET['pass'] == $password)
70
{
require("parametrosConfDB.php");
//Conexion con la base de datos
$con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
//obtenemos los datos de la url y con el formato para query apropiado
$led = mysqli_real_escape_string($con, $_GET['Led']);
$luz = mysqli_real_escape_string($con, $_GET['Luz']);
// EInsertamos los valores en la tabla
$query = "INSERT INTO valorLuz(Luz, Led) VALUES('$luz','$led')";
// Ejecutamos la instruccion
mysqli_query($con, $query);
mysqli_close($con);
}
else
{
echo "Acceso bloqueado. Necesitas la contraseña para acceder a la base
de datos.";
}
?>
<?php
function conectar($dbhost,$dbuser,$dbpass,$dbname)
{
if (!($enlace=mysqli_connect($dbhost,$dbuser,$dbpass,$dbname)))
{
echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
echo "error de depuración: " . mysqli_connect_errno() .
PHP_EOL;
echo "error de depuración: " . mysqli_connect_error() .
PHP_EOL;
exit;
}
return $enlace;
}
?>
71
Internet de las cosas. Sistema electrónico de control basado en Arduino
<?php
function consulta($enlace,$consultaSQL)
{
if($resultado= mysqli_query($enlace,$consultaSQL))
{
while($fila=mysqli_fetch_array($resultado,MYSQLI_ASSOC))
{
$data=$fila;
}
return $data;
}
?>
Script que carga todos los datos en la página web. Se ejecuta siempre al llamar
a “index.php”.
<?php
include('parametrosConfDB.php');
include('crearConexion.php');
include("consulta.php");
include('curl');
function consultaDB($dbhost,$dbuser,$dbpass,$dbname)
{
global $temp, $humedad, $time, $luz, $led;
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
$consultaSQL="SELECT Temperatura, Humedad, Tiempo FROM valores
WHERE ID=(Select MAX(ID) From valores)";
$consultaSQLLuz="SELECT Luz, Led FROM valorLuz
WHERE ID=(Select MAX(ID) From valorLuz)";
$data=consulta($enlace,$consultaSQL);
$dataLuz=consulta($enlace,$consultaSQLLuz);
$temp=$data["Temperatura"];
$humedad=$data["Humedad"];
$time=$data["Tiempo"];
$luz=$dataLuz["Luz"];
$led = $dataLuz["Led"];
if($_POST["valorLed"])
{
if($led == 1)
72
{
$led =0;
$url = "http://rodrigodomotica.ddns.net:5000/gpio/0";
}
else
{
$url = "http://rodrigodomotica.ddns.net:5000/gpio/1";
$led =1;
}
$consultaLed = "INSERT INTO valorLuz(Luz, Led)
VALUES('$luz','$led')";
consulta($enlace,$consultaLed);
$ch = curl_init("$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_exec($ch);
curl_close($ch);
}
//Cierra la conexión
mysqli_close($enlace);
}
//consultaDB($dbhost,$dbuser,$dbpass,$dbname);
?>
Programa que llama la aplicación Android para obtener los datos de la base de
datos.
<?php
include('parametrosConfDB.php');
include('crearConexion.php');
include("consulta.php");
$password="1234";
if( $_GET['pass'] == $password)
{
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
$consultaSQL="SELECT Temperatura, Humedad, Tiempo FROM valores
WHERE ID=(Select MAX(ID) From valores)";
$consultaSQLLuz="SELECT Luz, Led, Tiempo FROM valorLuz
WHERE ID=(Select MAX(ID) From valorLuz)";
$data=consulta($enlace,$consultaSQL);
$dataLuz=consulta($enlace,$consultaSQLLuz);
73
Internet de las cosas. Sistema electrónico de control basado en Arduino
$arr =
array("Luz"=>$dataLuz["Luz"],"Led"=>$dataLuz["Led"],"Tiempo"=>$dataLuz["T
iempo"],
"Temperatura"=>$data["Temperatura"],"Humedad"=>$data["Humedad"],"TiempoTe
mp"=>$data["Tiempo"]);
echo json_encode($arr);
}
?>
Programa que llama la aplicación Android para cambiar el estado del led.
<?php
include('parametrosConfDB.php');
include('crearConexion.php');
include("consulta.php");
include('curl');
$password="1234";
if( $_GET['pass'] == $password)
{
$led = $_GET['Led'];
$enlace=conectar($dbhost,$dbuser,$dbpass,$dbname);
//Cierra la conexión
mysqli_close($enlace);
$url = "http://rodrigodomotica.ddns.net:5000/gpio/{$led}";
$ch = curl_init("$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_exec($ch);
curl_close($ch);
}
?>
74
7.10 Android clase GetDataSensor.java
try {
// Creates a new URL from the URI
URL url = new URL(urls[0]);
InputStream is = null;
int len = 500;
String contentAsString;
// Get sa connection to the web service
HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
75
Internet de las cosas. Sistema electrónico de control basado en Arduino
@Override
protected void onPostExecute(String result)
{
delegate.processFinish(result);
}
76
if (connection.getResponseCode() ==
HttpURLConnection.HTTP_OK) {
InputStreamReader isr = new
InputStreamReader(connection.getInputStream());
Log.i("responde connection", connection.getResponseCode()
+ "");
}
// Close the connection
connection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// Return the received Quotation object
return "OK";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_iluminacion);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);// activa
el boton 'atras' en la barra superior
getDataSensor.delegate=this;
getDataSensor.execute("http://rodrigodomotica.ddns.net/getAndroid.php?pas
s=1234");
77
Internet de las cosas. Sistema electrónico de control basado en Arduino
try {
JSONObject json = new JSONObject(output);
if (json.getString("Led").equals("1")) datos.setLed(true);
else datos.setLed(false);
if (json.getString("Luz").equals("1")) datos.setLuz(true);
else datos.setLuz(false);
ultActualizacion.setText("Última actualización:
"+json.getString("Tiempo"));
} catch (JSONException e) {
e.printStackTrace();
}
inicializarValores(datos.isLed(),datos.isLuz(),
datos.getFechaLuz());
if (led)
ledIV.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_encen
dida_redonda));
else
ledIV.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_apaga
da_redonda));
if (luz)
luzIV.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_encen
dida_redonda));
else
luzIV.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_apaga
da_redonda));
}
ImageView image=(ImageView) v;
PostDataSensor postDataSensor = new PostDataSensor();
78
if(datos.isLed())
{
image.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_apaga
da_redonda));
datos.setLed(false);
postDataSensor.execute("http://rodrigodomotica.ddns.net/postLuzAndroid.ph
p?pass=1234&Led=0");
}else
{
image.setImageDrawable(getResources().getDrawable(R.mipmap.bombilla_encen
dida_redonda));
datos.setLed(true);
postDataSensor.execute("http://rodrigodomotica.ddns.net/postLuzAndroid.ph
p?pass=1234&Led=1");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temperatura);
getDataSensor.delegate=this;
getDataSensor.execute("http://rodrigodomotica.ddns.net/getAndroid.p
hp?pass=1234");
}
79
Internet de las cosas. Sistema electrónico de control basado en Arduino
try {
JSONObject json = new JSONObject(output);
temperatura.setText(json.getString("Temperatura")+" ºC");
ultActualizacion.setText("Última actualización:
"+json.getString("TiempoTemp"));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
protected Weather doInBackground(Void... params) {
String ciudad=this.parent.getUbicacion();
Uri.Builder uriBuilder = new Uri.Builder();
uriBuilder.scheme("http");
uriBuilder.authority("api.openweathermap.org");
uriBuilder.appendPath("data");
uriBuilder.appendPath("2.5");
uriBuilder.appendPath("weather");
uriBuilder.appendQueryParameter("q", ciudad);
uriBuilder.appendQueryParameter("APPID",
"a4d47e1f013caa3f3718785b5c8b9dab");
Log.d("url", uriBuilder.toString());
80
try {
// Creates a new URL from the URI
URL url = new URL(uriBuilder.build().toString());
try{
} catch(Exception e){e.printStackTrace();}
81
Internet de las cosas. Sistema electrónico de control basado en Arduino
@Override
protected void onPostExecute(Weather param) {
// Quotation received
if (param != null) {
this.parent.gotWeather(param.getTemperatura(),
param.getHumedad(),param.getPrecipitaciones(),param.getViento());
}
// No response received
else {
this.parent.resetWeather();
}
super.onPostExecute(param);
}
82