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.