Ganador - Arduino Contest 2011: Fraile del tiempo
Contenidos:
Introducción
Cook-Hacker: Joaquin Felipe (España).
Ingredientes:
- 1 x Arduino Duemilanove
- 1 x Arduino Ethernet Shield
- 1 x Sensor de Presión
- 1 x Sensor de Humedad
- 1 x Sensor de Temperatura
- 1 x Reloj en tiempo real
- 1 x Mini Servo
- 1 x Pantalla LCD serie
- 2 x Pulsadores
- 1 x Ethernet Cable
- Cables y conectores variados
Dificultad: Media -
Tiempo de Preparación: 3 horas

Índice de Pasos
Índice de Pasos:
- Intro
- Historia
- Funcionamiento
- Conexión de los elementos
- Sensor de Presión MPXAZ 6115A
- Sensor de Humedad HIH4000
- Sensor de Temperatura LM335
- Reloj en tiempo real DS1307 RTC
- Esquema con Fritzing
- Ethernet Shield
- Sincronización del Reloj
- Obtención de datos metereológicos
- Pantalla LCD serie
- Servomotor
- Vídeos
Paso 1: Intro:
Este Fraile del tiempo es una actualización de los antiguos higrómetros de crin de caballo que algunos conocimos de pequeños.
Está construido con un Arduino Duemilanove al que le hemos añadido:
- Sensores integrados para temperatura, humedad relativa y presión atmosférica.
- Reloj en tiempo real.
- Posibilidad de conexión a Internet para obtener datos externos y ajustar la hora.
- Visualización del tiempo señalando con el brazo, y mediante una pantalla LCD.
- Pulsadores para elegir datos locales o remotos.
Paso 2: Historia:
La idea inicial surge del sensor cromático de temperatura publicado ya que me pareció una curiosa forma de mostrar la temperatura.
Después, descubrí la presentación “vintage” del Weatherclock y me propuse construir una estación meteorológica con estética retro.
Al final le añadí la pantalla para llegar a un equilibrio entre diseño e información completa.
En la parte estética busqué información de los antiguos frailes del tiempo (higrómetros) y mi hermana Elena le dió la apariencia actual a la caja.
Paso 3: Funcionamiento:
El Fraile del tiempo tiene dos modos de trabajo:
- Local: Utiliza el reloj DS1307 y los sensores de temperatura, presión y humedad relativa. No necesita la placa Ethernet. Se accede a este modo pulsando el botón izquierdo.
- Remoto: Utiliza la placa Ethernet para conectarse a Internet. Permite actualizar la hora accediendo a un servidor de hora ntp. Accede a datos meteorológicos exteriores: Temperatura, Humedad Relativa, Presión, Nubosidad, Dirección del viento, Velocidad del viento. Se accede pulsando el botón derecho.
Paso 4: Conexión de los elementos:
Vista trasera con la conexión de los elementos:
Paso 5: Sensor de Presión MPXAZ 6115A:
Proporciona una tensión de salida proporcional a la presión, y es muy fácil de conectar. Ver hoja de datos del fabricante.
- Patillaje:
- Conexión al Arduino:
- Vs = 5V
- GND = masa
- Vout lo conectamos a la analógica 0
- Función de transferencia:
La presión la calculamos a partir de la función de transferencia:
int analogValueP = analogRead(0);
float voltP=0;
float presion=0;
int mbares=0;
voltP=(float) analogValueP * 5.0 / 1024.0;
presion = 1000.0* (voltP / 5.0 + 0.095) / 0.009;
Paso 6: Sensor de Humedad HIH4000:
Proporciona una tensión de salida proporcional a la humedad relativa, y es muy fácil de conectar. Ver hoja de datos del fabricante.
- Patillaje:
- Conexión al Arduino:
- + a 5v
- - a GND
- OUT conectado a analog 1
- Función de transferencia:
- (Vout - 0.958) / 0.0307 = % Humedad Relativa
int analogValueHR = analogRead(1);
float voltHR=0;
float hr=0;
voltHR=(float) analogValueHR * 5.0 / 1024.0;
hr = (voltHR - 0.958) / 0.0307;
Paso 7: Sensor de Temperatura LM335:
Proporciona una tensión de salida proporcional a la temperatura en Kelvin, es muy fácil de conectar, y permite la calibración externa mediante una resistencia de ajuste. Ver hoja de datos del fabricante.
- Patillaje:
Empleamos una resistencia fija de 5k, y una ajustable multivuelta de 10k.
- Conexión al Arduino:
Output conectada a la entrada analógica 2.
- Función de transferencia:
La función de transferencia del LM335 es 10mV/K. Para mostrar ºC le restamos 2.7315 al voltaje leido en la entrada 2.
int analogValueT = analogRead(2);
float voltT=0;
float t=0;
voltT=(float) analogValueT * 5.0 / 1024.0;
t = (voltT – 2.7315)/0.01;
Paso 8: Reloj en tiempo real DS1307 RTC:
Ver hoja de datos del fabricante.
- Patillaje y circuito básico:
- Un cristal de 32.768 Khz
- Batería de 3V con soporte, tipo CR2032
- 2 Resistencias de Pull-up de 2k2
- Para leer el bus i2c arduino usa los pines de entradas analógicas A4 y A5
- SCL: i2c clock: pin A5 del arduino
- SDA: i2c data: pin A4 del arduino
- Lectura del tiempo:
Basado en el ejemplo que viene con el arduino, para leer el DS1307 usaremos las siguientes librerias:
#include <Wire.h>
#include "RTClib.h"
Si disponemos de conexión a internet ajusta la hora accediendo a una servidor ntp:
#include <SPI.h>
#include <Ethernet.h>
#include <Udp.h>
- Cambio automático de horario verano/invierno:
Se utiliza la congruencia de Zeller para el cambio automático de hora invierno/verano.
Nos permite encontrar cuál es el último domingo de Marzo, en que comienza el horario de verano y el último domingo de Octubre, en que acaba.
El DS1307, la batería para conservar la hora con el arduino apagado, los sensores, la conexión al servo, y los pulsadores están todos en una placa de prototipos que se monta encima de la Ethernet shield.
Paso 9: Esquema con Fritzing:
La conexión de los distintos sensores, el DS1307, el servo, los pulsadores y la pantalla aparecerían como muestra el siguiente esquema con Fritzing. Todo esto va montado en una placa de prototipos, encima de la Ethernet shield.
Paso 10: Ethernet shield:
La placa Ethernet shield no es imprescindible, y si no la ponemos, el Fraile del tiempo mostrará la hora y los valores que obtiene de los sensores locales.
Mediante la placa Ethernet podemos conectarnos a internet para dos objetivos:
- Sincronizar nuestro reloj DS1307 a un servidor ntp.
- Obtener datos meteorologicos del exterior. En este caso, del aeropuerto de Zaragoza.
Hay que tener en cuenta que la placa Ethernet usa los pines 10, 11, 12, 13 para no usarlos en la placa de prototipos.
Paso 11: Sincronización del Reloj:
Para sincronizar el reloj DS1307 con un servidor de hora de Internet nos basamos en NTP2RTC de Rob Tillaart, que se basa en el cliente UDP NTP y usa las librerías RTClib.
Más información sobre NTP aquí, y tened cuidado con el ejemplo de Arduino.
unsigned long sendNTPpacket(byte *address) //envia peticion NTP al servidor
{
memset(pb, 0, NTP_PACKET_SIZE); // Pone el buffer a 0
// Inicializa los valores para la peticion NTP
pb[0] = 0b11100011; // LI, Version, Mode
pb[1] = 0; // Stratum, or type of clock
pb[2] = 6; // Polling Interval
pb[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
pb[12] = 49;
pb[13] = 0x4E;
pb[14] = 49;
pb[15] = 52;
Udp.sendPacket( pb,NTP_PACKET_SIZE, address, 123); //Peticiones NTP al puerto 123
}
void buscatiempoNTP () {
sendNTPpacket(timeServer); // send an NTP packet to a time server
delay(1000);// wait to see if a reply is available
if ( Udp.available() ) {
Udp.readPacket(pb, NTP_PACKET_SIZE);
unsigned long t1, t2, t3, t4;
t1 = t2 = t3 = t4 = 0;
for (int i=0; i< 4; i++)
{
t1 = t1 << 8 | pb[16+i];
t2 = t2 << 8 | pb[24+i];
t3 = t3 << 8 | pb[32+i];
t4 = t4 << 8 | pb[40+i];
}
float f1,f2,f3,f4;
f1 = ((long)pb[20] * 256 + pb[21]) / 65536.0;
f2 = ((long)pb[28] * 256 + pb[29]) / 65536.0;
f3 = ((long)pb[36] * 256 + pb[37]) / 65536.0;
f4 = ((long)pb[44] * 256 + pb[45]) / 65536.0;
const unsigned long seventyYears = 2208988800UL;
t1 -= seventyYears;
t2 -= seventyYears;
t3 -= seventyYears;
t4 -= seventyYears;
t4 += 1;
if (f4 > 0.4) t4++;
RTC.adjust(DateTime(t4));
}
else
{
Serial.print("$GO 1 15\r\n"); // Si falla la conexion a internet,
Serial.print("$PRINT ** \r\n"); // muestra un asterisco al final de la linea
}
ajusta=false;
}
Paso 12: Obtención de datos metereológicos:
Los datos los obtenemos en esta dirección URL.
Para simplificar el filtrado de los datos de la página web, nos conectamos a un servidor local que previamente ha tomado los datos y mediante php nos los devuelve entre tags para identificarlos mejor.
<title>Parseando datos de www.tutiempo.net</title>
</head>
<body>
Temperatura: <temp_c>21</temp_c>
Nubosidad: <cloud>Parcialmente cubierto</cloud>
Dviento: <wind_dir>E</wind_dir>
Vviento: <wind_vel> 11 </wind_vel>
Presion: <pressure_mb>1014</pressure_mb>
Humedad: <relative_humidity>40</relative_humidity>
</body>
</html>
Que en un navegador se muestra en una linea:
Temperatura: 21 Nubosidad: Parcialmente cubierto Dviento: E Vviento: 11 Presion: 1014 Humedad: 40
Ahora nuestro arduino ya tiene más fácil extraer los datos que acompañan a las palabras clave
El código php que extrae los datos en el servidor es el siguiente:
<?php
echo " <br>Parseando datos de www.tutiempo.net <br>";
$gestor = fopen("http://www.tutiempo.net/Tiempo_24_Horas/Zaragoza_Aeropuerto/LEZG.html", "r");
$contenido = \'\';
while (!feof($gestor)) {
$contenido .= fread($gestor, 8192);
}
fclose($gestor);
$contenido=strstr($contenido, \'td24T">\');
$datos=substr ($contenido, 7, 105);
$lista=explode("</td><td>", $datos);
$temperatura=explode("°C", $lista[0]);
$nubosidad[0]=$lista[1];
if ($lista[2]=="Calmado") {
$dviento[0]=VRB;
$vviento[0]=0;
} else {
$pordelante=explode("(", $lista[2]);
$dviento=explode(")", $pordelante[1]);
$pordelante=explode(")", $lista[2]);
$vviento=explode("Km/h", $pordelante[1]);
}
$presion=explode("mb", $lista[3]);
$humedad=explode("%", $lista[4]);
echo "Temperatura: <temp_c>$temperatura[0]</temp_c>";
echo chr(10);
echo "Nubosidad: <cloud>$nubosidad[0]</cloud>";
echo chr(10);
echo "Dviento: <wind_dir>$dviento[0]</wind_dir>";
echo chr(10);
echo "Vviento: <wind_vel>$vviento[0]</wind_vel>";
echo chr(10);
echo "Humedad: <relative_humidity>$humedad[0]</relative_humidity>";
echo chr(10);
echo "Presion: <pressure_mb>$presion[0]</pressure_mb>";
echo chr(10);
?>
</body>
</html>
Paso 13: Pantalla LCD serie:
La pantalla serie LCD se conecta mediante 4 cables solamente:
- Rojo y Negro alimentación.
- Amarillo TX (pin 1).
- Blanco RX (pin 0).
- Incluso podemos prescindir de conectar el RX.
Inicializamos el puerto serie para comunicar con la pantalla a 9600 baudios y borramos la pantalla.
void setup() {
Serial.begin(9600);
Serial.print("$CLEAR\r\n");
}
En el cuerpo del programa podemos colocar el cursor en cualquier punto e imprimir.
Serial.print("$GO 1 1\r\n");
Serial.print("$PRINT P=\r\n");
Serial.print("$GO 1 4\r\n");
Serial.print("$PRINT ");
Serial.print( int(presion/100));
Serial.print(" \r\n");
Paso 14: Servomotor:
El brazo del fraile se mueve mediante un servomotor miniatura, de los empleados en aeromodelismo, conectado al pin 3.
Para moverlo empleamos la librería:
#include <Servo.h>;
Las posiciones a señalar van de 81 a 126 en saltos de 9
const int posnieve = 81;
const int poslluvia = 90;
const int posviento = 99;
const int posnubes = 108;
const int possoleado = 117;
const int posniebla = 126;
int posbrazo = 0; // variable para almacenar la posicion
Inicialmente hace un test en el que recorre las diferentes posibilidades.
Cuando el arduino dispone de conexión a los datos externos, ajusta la posición del brazo en función de lo que está leyendo.
Para comparar la velocidad del viento necesitamos convertirlo a entero, y si es mayor de un valor dado, el monje señala viento.
Para las demás situaciones, con comparar las primeras letras es suficiente.
del servo void muevebrazo () {
posbrazo=possoleado; // Inicialmente selecciona soleado
if (atoi(velvientoext) > 30) posbrazo=posviento;
if (strncmp(nubosidadext, "Nub", 3) == 0) posbrazo=posnubes;
if (strncmp(nubosidadext, "Niev", 4) == 0) posbrazo=posnieve;
if (strncmp(nubosidadext, "Nieb", 4) == 0) posbrazo=posniebla;
if (strncmp(nubosidadext, "Ll", 2) == 0) posbrazo=poslluvia;
brazo.write(posbrazo);
}
Paso 15: Vídeos:
Vídeo de funcionamiento:
Enlaces y Documentación
Enlaces y Documentación:
- Vídeo: Fraile del tiempo.
Receta
Receta: Tarta de queso con gelatina de naranja y chocolate
Ingredientes para 6-8 personas:
- 275g de galletas María desmenuzadas
- 150g de mantequilla fundida
- 50g de chocolate fundido
- 250g de queso de untar
- 2 Yogures Griegos
- 50g azucar
- Zumo de ½ limón
- 2 sobres de Gelatina de Naranja en 250 ml de agua caliente
- 100g de chocolate fondant
Dificultad: Fácil -
Tiempo de Preparación: 45 minutos

Instrucciones preparación:
Machacar las galletas y mezclarlas con la mantequilla derretida.
Añadir 50 g. de chocolate derretido y mezclar bien. Forrar las paredes y la base de un molde engrasado de fondo desmontable.
Tapar y refrigerar por lo menos 30 minutos, hasta que esté bien firme.
Triturar el queso y el yogur con una batidora. Añadir el azúcar y el zumo de limón, y mezclar.
Diluir la gelatina en agua templada en un cuenco y agregar a la mezcla de queso y revolver hasta que quede uniforme.
Verter en el molde de galleta.
Derretir el chocolate que queda y añadirlo, mezclándolo con la punta de un pincho para que llegue al fondo. Tapar y refrigerar unas 3 horas.
Para servir, pasar un cuchillo por el borde de la tarta, despegándola del molde, quitar el aro y pasar a un plato grande.








