sábado, 22 de agosto de 2015

Central meteorológica experimental con ARDUINO y Bluetooth


Listado de componentes
  • Sensor DHT22.
  • Sensor BMP085.
  • Módulo BT RN-42.
  • LCD.
  • Arduino UNO.
  • Resistencias 10 KΩ (3).
  • Pulsadores NA (2).
  • LED.
  • Cables. 



Código fuente

// “Central meteorológica experimental”

// Programa

// A. Incluir bibliotecas (libraries)
 
#include ; // Presentar datos por LCD
#include ; // Pantalla LCD
#include ; // Comunicación I2C
#include ; // Sensor BMP085
#include ; // Sensor DHT22
#include ; // Comunicación Bluetooth RN-42  

// B. Definir variables
 
// Pines para la pantalla LCD:
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
// Variables para la librería del sensor DHT
#define DHTTYPE DHT22
#define DHTPIN A0  
// Definir pines:
const int led = 13;
const int pulsadorA = 2;
const int pulsadorB = 3;
// Variables de programa
int contador=0;  
float temperature;
float pressure;
float pressure2;  
float h;
float t;
float tmedia;
// Variables de librería:
LiquidCrystal_I2C lcd(0x27,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Adafruit_BMP085 bmp;
DHT dht(DHTPIN, DHTTYPE); 
SoftwareSerial SerialBT(10,11); // (RX, TX) en Arduino

// C. Bucle inicial (setup) 
 
 void setup() {  
  pinMode(led, OUTPUT); // Se define el LED como una salida
  pinMode(pulsadorA, INPUT); // Definir pulsador 1 como una entrada
  pinMode(pulsadorB, INPUT); // Definir pulsador 2 como una entrada  
  Serial.begin(9600);
  SerialBT.begin(9600);  
  dht.begin();
  bmp.begin();  
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }  
  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(LOW);
  lcd.home();

// D. Núcleo del programa

 void loop(){     
  if(digitalRead(pulsadorA) == HIGH){
  digitalWrite(led, HIGH); // Led encendido
  lcd.display();
  lcd.setBacklight(HIGH);
  contador=1;
  }  
  if(digitalRead(pulsadorB) == HIGH){
    digitalWrite(led, LOW); // Led encendido
    Serial.println("Apagado"); // Se registra la pulsación
    contador=0;
    lcd.noDisplay();
    lcd.setBacklight(LOW);
  }  
  if(contador == 1){
  t = dht.readTemperature();
  h = dht.readHumidity();  
  temperature = bmp.readTemperature();
  pressure = bmp.readPressure();       
  tmedia= (t+temperature)/2;  
  pressure2= (pressure/100);      
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(tmedia);
  lcd.print((char)223);
  lcd.print("C   ");
  lcd.print(h);
  lcd.print("%");  
  lcd.setCursor(0,1);
  lcd.print(pressure2);
  lcd.print("mbar");
  delay(3000);  
    Serial.print("Humidity-DHT = "); 
    Serial.println(h);
    Serial.print("Temperature-DHT = "); 
    Serial.print(t);
    Serial.print("[");
    Serial.write(186);
    Serial.println("C]");  
    Serial.print("Temperature-BMP = ");
    Serial.print(temperature);
    Serial.print("[");
    Serial.write(186);
    Serial.println("C]");     
    Serial.print("Pressure = ");
    Serial.print(pressure2);
    Serial.println("[mbares]");
    SerialBT.println(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ");
    SerialBT.print("T=      ");
    SerialBT.print(tmedia);
    SerialBT.println("  [Grados Celsius] ");     
    SerialBT.print("H=     ");
    SerialBT.print(h);
    SerialBT.println("  [% de Humedad Relativa]");     
    SerialBT.print("P= ");
    SerialBT.print(pressure2);
    SerialBT.println("  [milibares]");     
   // Determinar la altitud considerando la presión barométrica estándar
    // Presión de 1013.25 millibar = 101325 Pascal
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" meters");     
    Serial.print("Real altitude = ");
    Serial.print(bmp.readAltitude(101300));
    Serial.println(" meters");     
  }
}

Algunos comentarios
  • Se presenta un proyecto de “Central Meteorológica” experimental capaz de medir temperatura, humedad relativa, presión atmosférica y altura con presentación local de resultados e interfaz de comunicación Bluetooth. Se deja para una etapa intermedia el desarrollo de la interface Android, el sketch correspondiente en Arduino, el Datalogger y el anexado de otros sensores: velocidad y dirección del viento y luminosidad. Para una etapa final, desarrollo de la interfaz de comunicación Ethernet.
  • Sensor DHT22: temperatura (-40°C a +80°C, +-0.5% precisión) y humedad relativa (0% a 99%, precisión +-2% RH a 25°C). Tiempo de sensado: 1 vez cada 2 segundos. 
  • Sensor BMP085: temperatura (-40°C a +85°C), presión barométrica (300 hPa a 1100 hPa, 0.03 hPa resolución / 0.25 m) y altitud (9000 m sobre el nivel del mar a -500m).
  • Interfaz de comunicación Bluetooth: módulo BT Clase 2 “RN-42”.
  • LCD: bus de dos hilos I2C (Inter-Integrated Circuit) para la presentación local de la información. Utiliza solo dos líneas bidireccionales de bus: reloj (SCK, AD5 en la placa UNO) y datos (SDA, AD4 en la placa UNO).
  • Cada uno de los dos pulsadores está conectado en montaje “pull down” empleando resistencias de 10 KΩ (valor “normal” en montajes pull up y pull down). Así, se establece un estado lógico bajo a la entrada del circuito lógico cuando dicho circuito está en reposo y alto en el caso contrario evitando falsos estados producidos por ruido eléctrico cuando se deja una entrada con un valor indeterminado.


0 comentarios: