1. Controlador


Descripción:

El controlador de la estación meteorológica ArduMeteo es la placa de hardware libre Arduino, en su versión Duemilanove. Con ella se controla la toma de datos desde los distintos dispositivos conectados a ella: Temperatura del aire, veleta, anemómetro y pluviómetro. El dispositivo también realiza los cálculos para obtener los valores de los distintos parámetros ambientales a partir de ellos:temperatura del aire, dirección del viento, su velocidad y precipitación, en unidades del Sistema Internacional.

Existen multitud de posibilidades para realizar dichas mediciones, algunas de ellas haciendo uso de un Reloj de Tiempo Real (RTC), e incluso almacenando los datos (por ejemplo en tarjetas de memoria SD). En este proyecto para la I Arduino Virtualcamp, nos limitamos a construir los dispositivos de medición y a mostrar una de las posibles formas de realizar la medición. A continuación se muestra un códgo (firmware) de ArduMeteo que muestra el funcionamiento del conjunto de la estación Meteorológica. El usuario final puede realiar las modificaciones que considere necesarias según ssus necesidades para cómo realizar la medición, cúando y cómo mostrar los resultados (puerto Serie, pantalla LCD, almacenamiento en tarjeta SD, etc.

Circuito:

Circuito

Ver circuito

Firmware:

Firmware versión 0.1 (20110717 04:35)


/* PROYECTO ARDUMETEO
* Estación meteorológica basada en el uso del hardware libre Arduino
* para medir:
* (1) Temperatura del aire interior y exterior,
* (2) precipitación,
* (3) Dirección y velocidad del viento
*
* Esta estación ha sido desarrollado para la I Arduino Virtualcamp, 16-17 de Julio de 2011
* Creado por: Nayma con la colaboración de: madepablo
* 
*
* ArduMeteo está basada en eluso de sensores sencillos y material reciclado para la creación
* de los instrumentos de medida.
*/


// Definición de librerías
#include  // Librerías para el sensor de temperatura DS18B20
#include 
#include 

// Definición de pins digitales a los que se conectan los sensores
#define tempaire 4

#define lluvia 2 (no requerido) // Pluviómetro

// Definición de pins analógicos
#define sectorUno 1 // Sensor 1 de la veleta
#define sectorDos 2 // Sensor 2 de la veleta
#define sectorTres 3 // Sensor 3 de la veleta
#define sectorCuatro 4 // Sensor 4 de la veleta
#define sectorCinco 5 // Sensor 5 de la veleta
#define anemometro 0 // Anemómetro

//Activación de librerías
OneWire oneWire(tempaire); // Configuración librería termómetro DS18B20
DallasTemperature sensores(&oneWire);

// Definición de constantes
char* direcciones[] = {"error", "N", "NO", "O", "SO", "S", "SE", "E", "NE"};
float agua = 0.00125; // Capacidad de balancín del pluviómetro en l o mm/m2
unsigned int periodo = 600; // poner 60000Periodo (en ms) de medida de los sensores (excepto el pluviómetro que mide de forma contínua)

// Definición de variables
unsigned long medidas = 0; // Contador de medidas tomadas por ArduMeteo (Opcional)
float aire_exterior = 0; // Temperatura exterior
float aire_interior = 0; // Temperatura interior
int valorUno = 0; // Sensor 1 de la veleta
int valorDos = 0; // Sensor 2 de la veleta
int valorTres = 0; // Sensor 3 de la veleta
int valorCuatro = 0; // Sensor 4 de la veleta
int valorCinco = 0; // Sensor 5 de la veleta
int valor = 0; // Valor de la veleta
unsigned short direccion = 0; // Parámetro de dirección del viento
float velocidad = 0; // Velocidad del viento (en m/s)
unsigned long pulsos = 0; // Contador de pulsos del balancín del pluviómetro
float precipitacion = 0; // Precipitación medida por el pluviómetro


void setup(){
// Configurando los pins
pinMode(sectorUno, INPUT); // Configuración de pins de senosres de la veleta
pinMode(sectorDos, INPUT);
pinMode(sectorTres, INPUT);
pinMode(sectorCuatro, INPUT);
pinMode(sectorCinco,INPUT);

//Inicialización de sensores
sensores.begin(); // Inicia el sensor de temperatura DS18B20
//Inicialización del puerto serie
Serial.begin(9600);
//Muestra la pantalla de inicio
bienvenida(); 
}

void loop(){

attachInterrupt(0,contador, RISING); // Inicia la "escucha" del pluviómetro de forma continua e independiente del resto de sensores 
unsigned long millis(); // Durante un periodo de tiempo no hará nada salvo escchar el pluviómetro
long startTime = millis(); // mide el numero de gotas en 30 segundos
while(millis()  startTime + periodo) {
}

leertemperaturas(); // Mide la temperatura del aire interior/exterior
medirdireccionviento(); // Mide ladirección del viento
velocidadviento(); // Mide la velocidad del viento
detachInterrupt(0); // Deja de escuchar el pluviómetro para calcular la precipitación
calculalluvia();
}

// Lee los dos sensores de temperatura del aire, tanto el interior como el exterior.
void leertemperaturas() {
sensores.requestTemperatures();
aire_exterior=sensores.getTempCByIndex(0);
aire_interior=sensores.getTempCByIndex(1); 
}

// Lee los distintos sectores y calcula la dirección del viento
void medirdireccionviento(){
// Lee los distintos sectores
valorUno = analogRead (sectorUno); // Lee el sector uno
if (valorUno  600){
valorUno = 0;
}
else {
valorUno = 1;
} 
valorDos = analogRead (sectorDos); // Lee el sector dos
if (valorDos  400) {
valorDos = 0;
} else{
valorDos = 1;
}
valorTres = analogRead (sectorTres); // Lee el sector tres
if (valorTres  400) {
valorTres = 0;
} else{
valorTres = 1;
}
valorCuatro = analogRead (sectorCuatro); // Lee el sector 4
if (valorCuatro  600) {
valorCuatro = 0;
} else{
valorCuatro = 1;
}
valorCinco = analogRead (sectorCinco); // Lee el sector cinco
if (valorCinco  300) {
valorCinco = 0;
} else{
valorCinco = 1;
}
//Calcula la dirección del viento
valor = valorCinco*16+valorCuatro*8+valorTres*4+valorDos*2+valorUno;
if (valor 4 ){
direccion = 1; // Norte 
}
else if (valor =7 ){
direccion = 2; // Noroeste 
}
else if (valor =11 ){
direccion = 3; // Oeste 
}
else if (valor =15 ){
direccion = 4; // Suroeste 
}
else if (valor =19 ){
direccion = 5; // Sur 
}
else if (valor =23 ){
direccion = 6; // Sureste 
}
else if (valor =27 ){
direccion = 7; // Este 
}
else if (valor =30 ){
direccion = 8; // Noreste 
}
else {
direccion = 0; // error
}
mostrarResultados();
} 

// Mide la velocidad del viento
void velocidadviento(){
velocidad = analogRead(0);
}

// Mide la intensidad de lluvia (disdrómetro)
void calculalluvia(){
precipitacion = pulsos * agua; // calcula la intensidad de la lluvia en gotas/m2/sec
pulsos = 0;
}

// Contador de pulsos del pluviómetro
void contador(){
pulsos++;
}


// Muestra la pantalla de vienvenida
void bienvenida(){
Serial.println(" ArduMeteo 1.0");
Serial.println("----------------------------------------------");
Serial.println("Nayma y madepablo, 2011. I Arduino VirtualCamp");
Serial.println();
}

// Muestra los resultados por el puerto serie
void mostrarResultados(){
Serial.print("Temperatura exterior: "); 
Serial.print(aire_exterior); 
Serial.println("C.");
Serial.print ("Temperatura interior: "); 
Serial.print(aire_interior); 
Serial.println("C.");
Serial.print("Direccion del viento: ");
Serial.println(direcciones[direccion]);
Serial.print("Velocidad del viento: ");
Serial.println(velocidad);
Serial.print("Precipitación ");
Serial.print(precipitacion);
Serial.println("l o mm/m2");
Serial.println();
}


Librerías empleadas:

  • OneWire (LINK)[Información]

  • DallasTemperatura (LINK)[Información]

  • Wire (LINK) [Información]

changed July 18, 2011