Proyecto Arduino Nano: Mini estación meteorológica

Siguiendo con los proyectos de la Arduino Nano, esta vez emprendemos un trabajo simple, pero divertido. Además que no es tan costosa de realizar. Se trata de una Mini Estación Meteorológica, que tiene como placa principal a la Arduino Nano.

Proyecto Arduino Nano: Componentes que utilizaremos

COMPONENTES CANTIDAD
Arduino Nano R3 x1
SENSOR DE PRESIÓN BMP-280 S x1
Sensor de temperatura y humedad DHT11 (4 pines) x1
Cable de USB-A a Mini-USB x1
RECINTO IMPRESO 3D x1

Proyecto Arduino Nano: Herramientas adicionales

  • Soldador (genérico)
  • Alambre para soldar, sin plomo
  • Cinta adhesiva de doble cara
  • Impresora 3D (genérica)

Proyecto Arduino Nano: Software

Para realizar la programación necesitamos el IDE de Arduino.

Además, de algún software para empezar con la edición de nuestra mini estación meteorológica. Podemos utilizar AutoCad de Autodesk o cualquier programa similar, que nos sirva para editar los componentes en 3D.

Arduino IDEInstalación y descarga del IDe de Arduino Autodesk FusionDescarga el programa de Edición 3D

Introducción

La captura de datos físicos como el del ambiente en tiempo real, es simplemente emocionante. En este proyecto, no sólo podrás capturar tres parámetros físicos fundamentales para la predicción del tiempo, a saber, la temperatura, la humedad y la presión atmosférica, sino que también podrás visualizar los datos en tiempo real en una pantalla LCD.

Proyecto Arduino Nano: Descripción

Los dos sensores utilizados en este proyecto son el BMP-280 y DHT-11. El primero detecta la temperatura y la presión atmosférica, mientras que el segundo detecta la humedad relativa.

El DHT-11 se podría haber hecho con el BME-280 (también puede medir la humedad) en lugar del BMP-280, pero si se tiene en cuenta el costo, entonces la combinación de sensores utilizados aquí es mucho más económica para los proyectos impresión sencilla.

También debemos tener en cuenta que, aunque la DHT-11 es capaz de detectar tanto la temperatura como la humedad, es utilizada para detectar la humedad sólo porque su resolución de detección de la temperatura es de +/-2° en comparación con +/-5° para el BMP-280.

El corazón de este proyecto es la placa de desarrollo Arduino Nano. En este proyecto, se eligió a la placa Arduino Nano sobre la Arduino Nano, debido a su precio asequible.

Te puede interesar  Proyecto Arduino MKR1000: Obturador GoPRO

Una pantalla LCD TFT de 1.44″ de la serie ST7735 es usada como pantalla para nuestro proyecto. Evitamos emplear alguna otra pantalla más grande, para evitar que la placa Arduino NANO se sobrecargue.

Proyecto Arduino Nano: Programación

Hemos proporcionado una combinación de diagrama de circuitos y diagrama de bloques, de la forma más conveniente y posible para ayudar a los emprendedores de este proyecto a comprender la configuración física y la conexión de los componentes.

También nos dimos la tarea de proporcionar tablas para la ubicación de los componentes para facilitar más las cosas.

Al revisar el diagrama y las tablas uno notará que los pines de 5V y GND del cabezal ICSP en la Arduino Nano, han sido utilizados para suministrar energía a los componentes, junto con los pines de energía y de tierra. Esto se ha hecho para eliminar cualquier fuente de energía adicional que haga que el sistema sea voluminoso.

En cuanto a la programación, en la primera parte hemos incluido una serie de bibliotecas para mantener la programación corta y simple. Además de las obvias, las librerías Wire.h y SPI.h son dignas de mención porque Wire.h es la que permite al Arduino comunicarse con los dispositivos I2C/TWI como el BMP-280 y la pantalla LCD ST7735 y SPI.h proporciona la interfaz periférica en serie con la pantalla LCD ST7735.

En la segunda parte, se inicializan los sensores y se configura la disposición, el color de fuente, etc. Todo esto, parte del LCD, para así mostrar los datos según nuestras preferencias.

En la parte final de nuestra programación, obtenemos la salida de los sensores, el cual se muestra con un leve retraso, conveniente entre cada lectura para mantener los procesos estables.

Proyecto Arduino Nano: Construcción

En nuestro prototipo, los componentes se han mantenido modulares y conectados empleando cables de puente en lugar de soldaduras. Esto no sólo permite una fácil localización de problemas y reparación, sino que también hace que el proceso de ensamblaje no tenga problemas.

La caja del dispositivo ha sido impresa en 3D para un ajuste perfecto de los componentes. La caja está provista de una ventilación adecuada para exponer los sensores a los medidores y disipar el calor generado por el sistema, que de otro modo interferiría con los elementos de detección.

El dispositivo se alimenta a través del mismo tipo de USB a tipo USB Mini-B utilizado para programar el Arduino. El prototipo ha sido colocado en el interior en el estiramiento durante unas pocas horas usando tanto el puerto USB del PC como el cargador de 5V del smartphone como fuente de alimentación.

Te puede interesar  ARDUINO UNO

Los resultados son bastante precisos comparados con los datos meteorológicos oficiales, considerando el costo de producción y el tiempo que hemos invertido en el desarrollo.

En conclusión, podemos decir que este proyecto es bastante económico, útil por decirlo menos, y lo más importante, es divertido tener una pequeña y práctica estación meteorológica disponible siempre que lo necesitemos.

Procesos

Diagramas de Circuito: Proyecto Arduino Mini Estación Meteorológica

El diagrama de circuitos de nuestra estación meteorológica tendrá el siguiente este esquema. Podemos seguir este mismo, o quizás modificarlo según nuestros requerimientos. Podemos ver el cableado desde nuestra placa Arduino Nano hacia los demás componentes, como el LCD y los sensores.

Proyecto Arduino Nano: Códigos que necesitamos

CÓDIGO C/C++

Estos son los códigos necesarios para el proyecto. Para guiarte, solo sigue las declaraciones en los comentarios.

#include <SPI.h>               //include Serial Peripheral Interface library
#include <Wire.h>              //include Two Wire Interface library
#include <Adafruit_GFX.h>      // include Adafruit graphics library
#include <Adafruit_ST7735.h>   // include Adafruit ST7735 TFT library
#include <Adafruit_BMP280.h>   // include Adafruit BMP280 sensor library
#include "DHT.h"               //include DHTXX sensor library
#define DHTPIN 2               //DHT11 data pin connected to arduino pin D2
#define DHTTYPE DHT11          //specifying the type of DHT sensor used
#define TFT_RST   8            // TFT RST pin is connected to arduino pin D8
#define TFT_CS    10           // TFT CS  pin is connected to arduino pin D9
#define TFT_DC    9            // TFT DC  pin is connected to arduino pin D10
// initialize ST7735 SERIES TFT library
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
 
// define device I2C address: 0x76 or 0x77 (0x77 is the library default address)
#define BMP280_I2C_ADDRESS  0x76
 
Adafruit_BMP280  bmp280;       // initialize Adafruit BMP280 library
DHT dht(DHTPIN, DHTTYPE);      // initialize DHT sensor
 
void setup(void)
{
  dht.begin();                                         // synchronizing DHT sensor
  tft.initR(INITR_144GREENTAB);                        // initialize a ST7735S chip, black tab
  tft.fillScreen(ST77XX_BLACK);                        // setting black background
  tft.drawFastHLine(0, 15 ,  tft.width(), ST77XX_CYAN);// draw horizontal seperation line at position (0, 15)
 
  tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK);         // set text color to white and black background
  tft.setTextSize(1);                                  // setting text size to 1
  //tft.setCursor(4, 0);                               // move cursor to position (4, 0) pixel
  //tft.print("ARDUINO + ST7735 TFT");
  tft.setCursor(25, 5);                                // move cursor to position (25, 5) pixel
  tft.print("WEATHER BUDDY");
 
  // initialize the BMP280 sensor
  if( bmp280.begin(BMP280_I2C_ADDRESS) == 0 )
  {  // connection error or device address wrong!
    tft.setTextColor(ST77XX_RED, ST77XX_CYAN);         // set text color to red and black background
    tft.setTextSize(2);                                // setting text size to 2
    tft.setCursor(5, 76);                              // move cursor to position (5, 76) pixel
    tft.print("Connection");
    tft.setCursor(35, 100);                            // move cursor to position (35, 100) pixel
    tft.print("Error");
    while(1);  // stay here
  }
 
  tft.drawFastHLine(0, 55,  tft.width(), ST77XX_CYAN);  // draw horizontal seperation line at position (0, 55)pixel
  tft.drawFastHLine(0, 95,  tft.width(), ST77XX_CYAN);  // draw horizontal seperation line at position (0, 195)pixel
  tft.setTextColor(ST77XX_RED, ST77XX_BLACK);           // set text color to red and black background
  tft.setCursor(30, 20);                                // move cursor to position (30, 20) pixel
  tft.print("TEMPERATURE ");                            // setting heading for first section
  tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK);          // set text color to cyan and black background
  tft.setCursor(40, 60);                                // move cursor to position (40, 60) pixel
  tft.print("HUMIDITY ");                               // setting heading for second section
  tft.setTextColor(ST77XX_GREEN, ST7735_BLACK);         // set text color to green and black background
  tft.setCursor(40, 100);                               // move cursor to position (40, 100) pixel
  tft.print("PRESSURE ");                               // setting heading for third section 
  tft.setTextSize(2);                                   // setting text size to 2 
}
 
// main loop
void loop()
  {

  char _buffer[8];
  // read temperature, humidity and pressure from the BMP280 sensor
  float temp = bmp280.readTemperature();    // get temperature in °C
  float hum = dht.readHumidity();           // get humidity in rH%
  float pres = bmp280.readPressure();       // get pressure in hPa
 
  // print temperature (in °C)
  if(temp < 0)                              // if temperature < 0
    sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
  else                                      // if temperature >= 0
    sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );// setting the value approximation 
  tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);  // set text color to yellow and black background
  tft.setCursor(11, 34);                          // move cursor to position (11,34) pixel 
  tft.print(_buffer);                             // print temperature from BMP-280 sensor
  tft.drawCircle(89, 34, 2, ST77XX_YELLOW);       // print the degree symbol ( ° )(can be omitted if * is used instead)
  tft.setCursor(95, 34);                          // move cursor to position (95,34) pixel 
  tft.print("C");                                 // print the Celcius symbol     
 
  // 2: print humidity (in %)
  sprintf( _buffer, "%02u ", (int)(hum));          // setting the value approximation 
  tft.setTextColor(ST77XX_MAGENTA, ST77XX_BLACK);  // set text color to magenta and black background
  tft.setCursor(45, 74);                           // move cursor to position (45,74) pixel
  tft.print(_buffer);                              // print humidity from DHT-11 sensor
  tft.setCursor(75, 74);                           // move cursor to position (75,74) pixel
  tft.print("%");                                  // print the percentage symbol     
 
 
  // 3: print pressure (in hPa)
  sprintf( _buffer, "%04u.%02u", (int)(pres/100), (int)((uint32_t)pres % 100) ); // setting the value approximation 
  tft.setTextColor(ST77XX_ORANGE, ST77XX_BLACK);  // set text color to orange and black background
  tft.setCursor(3, 112);                          // move cursor to position (3,112)pixel      
  tft.print(_buffer);                             // print atmospheric pressure from BMP-280
  tft.setCursor(91, 112);                         // move cursor to position (91,112)pixel
  tft.print("hPa");                               // print unit of atmospheric pressure as hecto pascal
 
  delay(1000);                                    // wait 1 second before taking next sensor reading
 
}

Créditos: Arduino NANO

Gracias a: Dnbakshi07