1. Prototipo estación metereológica Curso IOT
1
ÍNDICE
1 Propósito y alcance................................................................................................1
2 Fases del proyecto - Participantes..........................................................................2
3 Hardware y Software comercial.............................................................................2
4 Software a desarrollar............................................................................................3
4.1 Recogida de datos (waspmote).......................................................................4
4.2 Formateo de la salida estándar xml (script linux) ...........................................6
4.3 Página web principal (código php).................................................................8
4.4 Página web para visualizar la lectura de sensores (código xls) .......................9
4.5 Código de estilo css.....................................................................................10
5 Propuestas de ampliación para futuras fases ........................................................11
1 Propósito y alcance
El I.E.S Europa ha sido seleccionado en el programa STEM (Sciencie, Technology,
Engeneering, Mathematics) con la línea temática Eficiencia energética. Energías
alternativas.
En la propuesta de participación en el concurso, se indicaba:
Esta línea temática está en consonancia con el New European Green Deal que en
palabras de la presidenta de la Comisión Europea, Ursula von der Leyen significa „ El
Pacto Verde Europeo es nuestra nueva estrategia de crecimiento. Contribuirá a reducir
las emisiones, así como a crear puestos de trabajo“. Estas palabras resumen con
claridad la importancia que la eficiencia energética y las energías alternativas van a
tener para la sociedad europea: el progreso científico en el campo de las energías nos
trae una sociedad mejor, menos agresiva con el medioambiente y más rica.
El IES Europa posee una instalación solar fotovoltaica con una capacidad de
producción de 71kwh que se consigue con 215 placas solares y que permite la
generación del 75% del total de la energía eléctrica consumida en el centro,
reduciendo de este modo nuestra contribución a la huella ecológica. Es la mayor
instalación solar fotovoltaica instalada en un centro público de Educación Secundaria
de la Comunidad de Madrid y, posiblemente, de nuestro país.
A partir de esta instalación nos proponemos que las alumnas y alumnos del IES Europa
puedan estudiar desde un punto de vista experimental las cuestiones relacionadas con
la energía, y por esto hemos elegido como línea temática la Eficiencia energética y las
energías renovables.
En nuestro Instituto creemos que la mejor manera de aprender es haciendo.
Con el espíritu que mueve a nuestro centro en la apuesta por la ciencia, desde el
departamento en Informática impulsamos que nuestros alumnos participen en la
ejecución de proyectos que estén en sintonía con la línea temática de nuestro programa
STEM.
En este documento se describe la idea de implementar una “estación metereológica“
mediante el uso de sensores que recojan diferentes parámetros y sean enviados a un PC
para su procesamiento y análisis. Para ello se ha realizado un análisis de viabilidad
inicial con la participación de un grupo de alumnos del ciclo ASIR.
2. Prototipo estación metereológica Curso IOT
2
El uso de prototipo a desarrollar tendrá principalmente dos funciones:
Situando el dispositivo próximo a los paneles solares del centro. Recogida de
información de las condiciones metereológicas que se estén dando en un
determinado momento. Con los datos obtenidos se tratará de encontrar
correlación entre el rendimiento que esté proporcionando la propia central solar
y los datos obtenidos. Permitirá determinar las mejores condiciones para un
máximo rendimiento.
Prospección de nuevos espacios en el centro que puedan ser candidatos para la
ampliación de la central actualmente instalada. Se plantea la toma simultánea del
estado de las condiciones metereológicas en al menos dos espacios diferenciados
en el centro. Esta solución podría estar disponible en préstamo para otros centros
que pudieran tener interés en montar instalaciones parecidas a la nuestra.
2 Fases del proyecto - Participantes
Análisis de viabilidad del prototipo. Realizada y aquí documentada. Alumnos de
ASIR y profesores del departamento de Informática participantes en el curso
“Con TEAM hay Steam“.
Realización de prácticas de laboratorio con el hardware disponible en los Kits
waspmote. Monitorización de temperatura, humedad y presión atmosférica.
Elaboración de prototipos. Lanzamiento de proyectos fin de ciclo de alumnos de
2 de ASIR para la implementación del proyecto descrito en el apartado anterior
que incluya información de nuevos sensores (si es posible) y el análisis
comparativo con los datos reales obtenidos de los paneles solares. Ver
propuestas de ampliación en la sección final de este documento.
3 Hardware y Software comercial
IOT Hardware Kit (Libelium)
o Waspmote 802.15.4 y Waspmote Gateway 802.15.4 (Antenna y Xbee
Pro)
o Battery.
o Waspmote event board.
o Sensor de temperatura.
o Sensor de temperatura, humedad y presión.
o Sensor de movimiento.
o Cables USB.
Waspmote IDE && API
Cutecom. Para recoger la información vía USB.
Servidor Web Apache bajo SSOO Linux y módulos PHP.
3. Prototipo estación metereológica Curso IOT
3
4 Software a desarrollar
Programa para la recogida de información de los sensores para el Kit waspmote.
Además de la toma de datos, se realizará un preformateo de la información con
el objetivo de que su almacenamiento final esté recogido en formato xml.
Implementación de un script en Linux, que utilizando los datos del apartado
anterior, aplique un formato xml final.
Desarrollo de páginas que integren código php, xsl y css para una presentación
amigable de los datos obtenidos y que pueda hacerse pública desde un servidor
Web.
4. Prototipo estación metereológica Curso IOT
4
4.1 Recogida de datos (waspmote)
Haciendo uso del IDE waspmote, cargaremos el siguiente programa.
La obtención de datos se realiza
utilizando un sensor de temperatura-
humedad-presión conectado a la placa
waspmote event board y esta a su vez a la
placa waspmote Gateway 802.15.4
#include <WaspSensorEvent_v30.h>
float temp;
float humd;
float pres;
float value;
char sensor[3] = "01";
void setup()
{
USB.ON();
Events.ON();
}
void loop()
{
temp = Events.getTemperature(); //Temperature
humd = Events.getHumidity(); //Humidity
pres = Events.getPressure(); //Pressure
// Publica los datos
USB.print("<medida><sensor>");
USB.print(sensor);
USB.print("</sensor><temp>");
USB.printFloat(temp, 2);
USB.print("</temp><humedad>");
USB.printFloat(humd, 1);
USB.print("</humedad><presion>");
USB.printFloat(pres, 2);
USB.println("</presion></medida>");
// Hiberna durante 10 segundos
PWR.deepSleep("00:00:00:10", RTC_OFFSET, RTC_ALM1_MODE1, ALL_OFF);
USB.ON();
}
5. Prototipo estación metereológica Curso IOT
5
En esta versión inicial del prototipo no se ha previsto realizar la codificación de un
programa que haga la lectura y volcado automático de los datos a fichero. Utilizaremos
el programa Cutecom para la lectura del puerto serie USB. La siguiente imagen muestra
la recogida de datos tomada durante una sesión de pruebas.
El volcado de los datos a fichero se realiza mediante un copiado y pegado manual. En
proyectos futuros puede ser un aspecto de mejora que este proceso esté automatizado.
Con el objetivo de preparar el fichero descargado para posteriores fases, su nombre
deberá seguir el siguiente formato: AAAA-MM-DD-VV.xml . P.e 2021-05-07-01.xml.
Siendo
AAAA- Año en el que se ha realizado la toma de información.
MM- Mes en el que se ha realizado la toma de información.
DD- Día en el que se ha realizado la toma de información.
VV- Versión del fichero. Utilizado por si un mismo día se han realizado varias
recogidas de datos.
Un ejemplo podría ser:
En la siguiente sección se muestra el script que procesa la información obtenida de los
sensores para conseguir el formato xml definitivo. El script procesa los ficheros que se
encuentran en la ruta Web-root/waspmote/script-linux/rawdata/. Por lo tanto será en
esta ubicación donde habrá que copiar los ficheros que se están describiendo en este
apartado.
Tras ser procesados los ficheros con los datos del sensor, se mueven a la nueva ruta
Web-root/waspmote/script-linux/rawdataproc/. Aquí quedarán almacenados por si es
preciso su uso futuro, pero en la nueva ubicación ya no volverán a ser considerados en
posteriores ejecuciones del script.
[23:14:33:117] J#␊
[23:14:36:104] <medida><sensor>02</sensor><temp>22.67</temp><humedad>42.5</humedad><presion>94593.89</presion></medida>␍␊
[23:14:46:602] <medida><sensor>02</sensor><temp>22.68</temp><humedad>42.7</humedad><presion>94590.77</presion></medida>␍␊
[23:14:57:611] <medida><sensor>02</sensor><temp>22.67</temp><humedad>42.5</humedad><presion>94593.42</presion></medida>␍␊
[23:15:08:604] <medida><sensor>02</sensor><temp>22.67</temp><humedad>42.8</humedad><presion>94591.53</presion></medida>␍␊
[23:15:19:597] <medida><sensor>02</sensor><temp>22.66</temp><humedad>43.0</humedad><presion>94594.19</presion></medida>␍␊
6. Prototipo estación metereológica Curso IOT
6
4.2 Formateo de la salida estándar xml (script linux)
La información almacenada en el fichero anterior, aunque tiene un preprocesamiento
inicial, no constituye un fichero xml bien formado. Los ficheros xml finales se generan
mediante la ejecución del script Convertxml.sh, que se encuentra en la ruta Web-
root/waspmote/script-linux/scripts. Su código es el siguiente.
gla y por último hacer clic en finalizar
#!/bin/bash
# DEFINICION DE VARIABLES
nombreFich="" # NOMBRE DEL FICHERO DE SALIDA
cadEsc="" # CADENA A ESCRIBIR EN EL FICHERO
infoBool=NO # UTILIZADO PARA LOCALIDAD EL INICIO DE INFORMACION UTIL
fecha="" # FECHA RECUPERADA DEL NOMBRE DE FICHERO
version="" # VERSION RECUPERADA DEL NOMBRE DEL FICHERO
numeroSensor="" # NUMERO EL SENSOR QUE HA GENERADO LA INFORMACION
nombreFichSal="" # NOMBRE DEL FICHERO DE SALIDA. SENSIR-FECHA_VERSION
horaMuestra="" # HORA DE LA MUESTRA
restoLect="" # RESTO DE LA LECTURA RECIBIDA DEL SENSOR
sensorAlfa="" # NOMBRE DEL SENSOR
paramUno="" # CONTIENE INFORMACION PARA LA FUNCION procesarFichRaw
# CABECERA INICIAL DE TODOS LOS FICHEROS xml RESULTANTES
cabecerasXMLInic(){
echo '<?xml version="1.0"?>' >> "$nombreFichSal"
echo '<?xml-stylesheet type="text/xsl" href="./../xslfiles/waspmote.xsl" ?>' >> "$nombreFichSal"
echo '<waspmote>' >> "$nombreFichSal"
echo '<umbraTempMin>20</umbraTempMin>' >> "$nombreFichSal"
echo '<umbraTempMax>25</umbraTempMax>' >> "$nombreFichSal"
echo '<umbraHumedadMin>40</umbraHumedadMin>' >> "$nombreFichSal"
echo '<umbraHumedadMax>45</umbraHumedadMax>' >> "$nombreFichSal"
echo '<umbraPresionMin>20</umbraPresionMin>' >> "$nombreFichSal"
echo '<umbraPresionMax>30</umbraPresionMax>' >> "$nombreFichSal"
sensorAlfa="<sensor>$numeroSensor</sensor>"
echo "$sensorAlfa" >> "$nombreFichSal"
}
# FUNCION QUE PROCESA CADA FICHERO RAW A XML
procesarFichRaw (){
# LA FECHA Y VERSION VIENE DEL NOMBRE DEL FICHERO
fecha=$(echo "$paramUno" | cut -c 1-10)
version=$(echo "$paramUno" | cut -c 12-13)
echo "Procesando el fichero $paramUno"
while IFS= read -r line
do
# PUEDE QUE HAYA LINEAS QUE NO SEAN DE INFORMACION ANTERIORES. EN
LA PRIMERA LINEA VALIDA:
if [[ "$infoBool" = "NO" && "$line" = *medida* ]]
then
infoBool="SI" # YA HAN EMPEZADO LOS REGISTROS CON
INFO. UTIL
# RECUPERAR EL NUMERO DE SENSOR
numeroSensor=$(echo "$line" | cut -c 31-32)
# CREAR EL NOMBRE DEL FICHERO DE SALIDA USANDO FECH A Y
NUMERO DE SENSOR
nombreFichSal="./../xmldata/$numeroSensor-$fecha-$version.xml"
# ESCRIBE LA CABECERA DEL FICHERO XML RESULTANTE
cabecerasXMLInic
fi
7. Prototipo estación metereológica Curso IOT
7
Los ficheros xml finales, una vez han sido tratados y están listos para que sean
visualizados con un navegador mediante servicio web (http), se encuentran en la ruta
Web-root/waspmote/xmlfiles. Un fichero ejemplo podría ser.
# ESTE REGISRO HAY QUE VOLCARLO AL FICHERO DE SALIDA
if [[ "$infoBool" = "SI" ]]
then
horaMuestra=$(echo "$line" | cut -c 2-9)
restoLect=$(echo "$line" | cut -c 42-)
cadEsc="<medida><tiempo>$fecha-$horaMuestra</tiempo>$restoLect"
echo "$cadEsc" >> "$nombreFichSal"
fi
done < "./../rawdata/$paramUno"
echo "</waspmote>" >> "$nombreFichSal"
# GUARDA EL FICHERO RAW DATA EN rawdataproc PARA QUE NO VUELVA A SER
PROCESADO SI SE LLAMA DE NUEVO AL SCRIPT
$(mv "./../rawdata/$paramUno" "./../rawdataproc/$paramUno")
}
# PARA CADA FICHERO EN EL DIRECTORIO RAWDATA. PENDIENTE DE PROCESAR.
for i in $(ls ./../rawdata/ -C1)
do
paramUno=$i # UTILIZADO PARA PASAR EL NOMBRE DEL FICHERO A LA
FUNCION procesarFichRaw
infoBool="NO" # INICIALIZA VARIABLE NECESARIA ANTES DE PROCESAR
CUALQUIER FICHERO RAW
procesarFichRaw # FUNCION QUE PROCESA CADA FICHERO RAW A XML
done
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="./../xslfiles/waspmote.xsl" ?>
<waspmote>
<umbraTempMin>20</umbraTempMin>
<umbraTempMax>25</umbraTempMax>
<umbraHumedadMin>40</umbraHumedadMin>
<umbraHumedadMax>45</umbraHumedadMax>
<umbraPresionMin>20</umbraPresionMin>
<umbraPresionMax>30</umbraPresionMax>
<sensor>02</sensor>
<medida><tiempo>2021-05-01-01-07-39</tiempo><temp>21.49</temp><humedad>48.2</humedad><presion>93806.80</presion></medida>
<medida><tiempo>2021-05-01-01-07-50</tiempo><temp>21.48</temp><humedad>48.3</humedad><presion>93809.78</presion></medida>
<medida><tiempo>2021-05-01-01-08-01</tiempo><temp>21.46</temp><humedad>48.4</humedad><presion>93804.80</presion></medida>
</waspmote>
8. Prototipo estación metereológica Curso IOT
8
4.3 Página web principal (código php)
Se plantea una sencilla página php que muestre el listado de ficheros xml con la
información disponible en la ruta Web-root/waspmote/xmlfiles (lecturas de los sensores
en formato xml).
La página está situada en la ruta Web-root/waspmote/index.php.
Disponible vía web en la url http://IpServidorWeb/waspmote
Su código es:
<html>
<head>
<title>Prueba de PHP</title>
<link rel="stylesheet" href="./cssfiles/index.css">
</head>
<body>
<div id="cab">
<h4 style=" float:left; width:70%;text-align:center; margin-top:3%;">Prototipo - Central Metoreológica<br/>Departamento Informática</h4>
<div style=" float:left; width:30%;text-align:center;margin-top:1%;"><img style="width:100px;" src="./img/ieseuropa.png" alt="Logo-Europa"
/></div>
</div>
<p style="clear:left;text-align:center;padding-top:3%;margin-bottom:-1%;font-size:25px;color:blue;">LECTURA DE SENSORES</p>
<?php
$dir = opendir("./xmlfiles/");
$files = array();
while ($current = readdir($dir)){
if( $current != "." && $current != "..") {
$files[] = $current;
}
}
echo '<ul>';
for($i=0; $i<count( $files ); $i++){
echo '<li><a target="_blank" href="xmlfiles/'.$files[$i].'">'.$files[$i].'</a></li>';
}
echo '</ul>';
?>
</body>
</html>
9. Prototipo estación metereológica Curso IOT
9
4.4 Página web para visualizar la lectura de sensores (código xls)
Los ficheros xml se procesan para su visualización mediante el siguiente código xls.
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Prototipo - Central Metoreológica.</title>
<link rel="stylesheet" type="text/css" href="./../cssfiles/waspmote.css" />
</head>
<body>
<div id="cab">
<h4 style=" float:left; width:70%;text-align:center; margin-top:3%;">Prototipo - Central Metoreológica<br/>Departamento Informática</h4>
<div style=" float:left; width:30%;text-align:center;margin-top:1%;"><img style="width:100px;" src="./../img/ieseuropa.png" alt="Logo-Europa"
/></div>
</div>
<p style="clear:left;text-align:center;padding-top:3%;margin-bottom:0%;font-size:25px;color:blue;">Sensor: <xsl:value-of select="waspmote/medida/sensor" /></p>
<div id="cuer">
<div id="rangos">
<div style="margin-bottom:1%;text-decoration:underline;color:blue;">UMBRALES DE MEDIDA</div>
<div style="display:inline-block;width:33%;">Temp. (Cel.): <xsl:value-of select="waspmote/umbraTempMin" /> -- <xsl:value-of
select="waspmote/umbraTempMax" /></div>
<div style="display:inline-block;width:33%;">Humedad (%): <xsl:value-of select="waspmote/umbraHumedadMin" /> -- <xsl:value-of
select="waspmote/umbraHumedadMax" /> </div>
<div style="display:inline-block;width:33%;">Presión (Pa): <xsl:value-of select="waspmote/umbraPresionMin" /> -- <xsl:value-of
select="waspmote/umbraPresionMax" /></div>
</div>
<table style="width:100%;">
<tr>
<td style="color:black;width:25%;text-decoration:underline;color:blue;">Tiempo</td>
<td style="color:black;width:25%;text-decoration:underline;color:blue;">Temp. (Cel.)</td>
<td style="color:black;width:25%;text-decoration:underline;color:blue;">Humedad (%)</td>
<td style="color:black;width:25%;text-decoration:underline;color:blue;">Presión (Pa)</td>
</tr>
<!-- Por cada medida recogida en el fichero XML. Una entrada con tiempo, temperatura, humedad y presion -->
<xsl:for-each select="waspmote/medida">
<tr>
<!-- Tiempo -->
<td style="color:black;width:25%;"><xsl:value-of select="tiempo" /></td>
<!-- Temperatura. Si esta fuera de los umbrales en rojo, sino en negro -->
<xsl:if test="temp < /waspmote/umbraTempMin or temp > /waspmote/umbraTempMax">
<td style="color:red;width:25%;"><xsl:value-of select="temp" /></td>
</xsl:if>
<xsl:if test="not(temp < /waspmote/umbraTempMin or temp > /waspmote/umbraTempMax)">
<td style="color:black;width:25%;"><xsl:value-of select="temp" /></td>
</xsl:if>
<!-- Humedad. Si esta fuera de los umbrales en rojo, sino en negro -->
<xsl:if test="humedad < /waspmote/umbraHumedadMin or humedad > /waspmote/umbraHumedadMax">
<td style="color:red;width:25%;"><xsl:value-of select="humedad" /></td>
</xsl:if>
<xsl:if test="not(humedad < /waspmote/umbraHumedadMin or humedad > /waspmote/umbraHumedadMax)">
<td style="color:black;width:25%;"><xsl:value-of select="humedad" /></td>
</xsl:if>
<!-- Presion. Si esta fuera de los umbrales en rojo, sino en negro -->
<xsl:if test="presion < /waspmote/umbraPresionMin or presion > /waspmote/umbraPresionMax">
<td style="color:red;width:25%;"><xsl:value-of select="presion" /></td>
</xsl:if>
<xsl:if test="not(presion < /waspmote/umbraPresionMin or presion > /waspmote/umbraPresionMax)">
<td style="color:black;width:25%;"><xsl:value-of select="presion" /></td>
</xsl:if>
</tr>
</xsl:for-each>
</table>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
10. Prototipo estación metereológica Curso IOT
10
La figura muestra un ejemplo de la página.
4.5 Código de estilo css
Para la página principal index.php:
Para las páginas utilizadas para mostrar los datos recogidos por los sensores:
#cab
{
text-align:center; text-transform:uppercase;
color:green; width:50%;
margin-left:25%; aling:center;
border-bottom:2px; border-style:solid;
}
ul {
list-style: none; text-align:center;
width:30%; margin-left:32%;
}
ul li {
border-bottom: 1.5px solid black; background-color:cyan;
overflow: hidden; white-space: nowrap;text-overflow: ellipsis;width:100%; text-decoration:underline; color:blue;
}
ul li a {
padding: .1em 0 .1em 0; display: block;
text-decoration: none; background-color:#F0E68C;
}
ul li a:hover {
background-color:white; color:black;
}
#cab
{
text-align:center; text-transform:uppercase;
color:green; width:90%;
margin-left:5%; aling:center;
border-bottom:2px; border-style:solid;
}
#rangos
{
text-align:center; text-transform:uppercase;
margin-top:1%; margin-bottom:1%;
padding-top:1%; padding-bottom:1%;
margin-left:1%; width:98%;
aling:center; border-width:2px;
border-style:solid; color:black;
}
#cuer
{
text-align:center; width:90%;
margin-left:auto; margin-right:auto;
border-width:2px; border-style:solid;
}
11. Prototipo estación metereológica Curso IOT
11
5 Propuestas de ampliación para futuras fases
Toma de información de un número mayor de parámetros, si hay disponibilidad
de sensores.
Validación de los ficheros xml mediante DTD o xml Schema.
Diseño de modelos comparativos entre los datos obtenidos por un sensor y la
información monitorizada de las estaciones solares que permitan conocer las
mejores condiciones para obtener rendimientos máximos de los paneles.
Diseño de modelos comparativos entre los datos obtenidos por un sensor y la
información monitorizada de las estaciones solares que permita determinar fallos
en los paneles solares si su rendimiento no está siendo el previsible.
Diseño de modelos comparativos entre los datos obtenidos por sensores
ubicados en diferentes ubicaciones en un mismo momento que permitan
determinar las ubicaciones más idóneas para la instalación de nuevos paneles.
Presentación de gráficas e informes en relación a todos los apartados anteriores.
Desarrollo de aplicaciones que permitan la conexión directa al puerto serie del
PC y por tanto la recogida de la información de los sensores sustituyendo a la
aplicación Cutecom. Esto evitará la necesidad de actuación manual en el
almacenamiento de datos a ficheros.
Conexión entre la placa waspmote y el PC vía radio. En el prototipo inicial se
realiza mediante conexión de cable USB.
Implementación responsive del desarrollo web propuesto.