Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Estación meteorológica local

Componentes y suministros

Arduino Nano R3
× 1
Seeed Grove - Sensor de barómetro (BMP280)
× 1
Sensor de temperatura y humedad DHT11 (4 pines)
× 1
Módulo de pantalla ElectroPeak 0.96 "OLED 64x128
× 1
Sensor UV GUVA-S12SD
× 1
DS3231 RTC
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Alambre de soldadura, sin plomo
Impresora 3D (genérica)

Aplicaciones y servicios en línea

Arduino IDE
Autodesk Fusion 360

Acerca de este proyecto

Durante mucho tiempo, quise hacer una estación meteorológica sin usar Internet. Es genial medir los datos meteorológicos de su entorno y echar un vistazo a los datos cuando lo desee. por lo tanto, hago una estación meteorológica local de aspecto atractivo que puede medir la presión del aire circundante, la temperatura, la humedad y el índice UV del día (si la coloca cerca de la ventana). ¡Espera, tiene más! 😉 también tiene una pantalla Reloj para mostrar la hora, la fecha y el día de la semana.

En este tutorial, le mostraré cómo hacer esta estación de clima frío en esos pasos.

Paso 1:construcción del recinto

Yo uso Autodesk fusion 360 para crear el cerramiento e imprimirlo con PLA verde. Necesita soportes y lo imprimo con un 20% de relleno con una velocidad de 70 mm / s en mi Ender 3. Encontrará el archivo STL para el gabinete con este proyecto.

Paso 2:BMP280

BMP280 es un sensor de temperatura y presión atmosférica y utiliza el protocolo I2C o SPI para comunicarse con Arduino. Aquí utilizo SPI. Para usar SPI, conecte-

  • CS a D10
  • SDA a D11
  • SDO a D12
  • SCK a D13

En la parte del código, para usar este sensor necesitamos una biblioteca. primero que nada, incluyo la librería en el código #include . puede descargar la biblioteca desde aquí.

Luego defino el pin SPI para el sensor. En la función de configuración, inicializo el sensor BMP, y en la función de bucle, leo los datos de presión y temperatura usando bmp.readPressure () y bmp.readTemperature () mando. Divido el valor de la presión por 100 para medir la presión en la unidad hPa. Para medir la altitud utilizo bmp.readAltitude (1005.47) mando. Aquí tienes que cambiar el valor (1005.47) de acuerdo con la presión promedio de su área.

Paso 3:DS3231 RTC

Esta estación meteorológica también tiene una pantalla de tiempo que puede mostrar la hora actual, la fecha y el día de los débiles. Para ello, utilizo el módulo DS231 RTC, que utiliza el protocolo I2C para comunicarse. así que para usar esto, conecte-

  • SCL a A5
  • SDA a A4

En primer lugar, debe configurar la fecha y la hora en el RTC mediante DS3231_set.ino programa de la biblioteca Ejemplo.

En el programa principal, incluyo la biblioteca #include y lea los datos de tiempo según las instrucciones de la biblioteca. aquí utilizo el ejemplo de la biblioteca como referencia para el código. Creé un caso para cada día de la semana para encontrar el día actual.

Paso 4:DHT11

Utilizo este sensor para medir la humedad. Para eso, conecto su salida de datos a Arduino D2 . Y en el programa, incluyo la biblioteca DHT #include luego en la configuración inicializo el sensor y en el ciclo, leo el valor de humedad usando dht.readHumidity () comando.

Paso 5:Sensor UV GUVA-S12SD

GUVA-S12SD es un fotodiodo de tipo Schottky a base de nitruro de galio. Tiene una longitud de onda de detección UV típica de 240-370 nm (que cubre los rayos UVB y la mayor parte del espectro UVA). Emite un voltaje analógico calibrado que varía con la intensidad de la luz ultravioleta. Entonces, podemos leer el valor analógico a través de Arduino ADC.

en la función de bucle, leo analógicamente el valor del sensor y calculo el índice UV

  float sensorValue =analogRead (A0); 
float sensorVoltage =sensorValue / 1024 * 5.0;
int UV_index =sensorVoltage / 0.1;

Paso 6:pantalla OLED

Utilizo una pantalla OLED de 0,96 "128 * 64 para este proyecto, utiliza el protocolo I2C, así que lo conecto a Arduino de la siguiente manera:

  • SCK a A5
  • SDA a A4

En el programa, al principio, incluyo la biblioteca Adafruit_SSD1306 y Adafruit_GFX

  #include  
#include

luego creo la variable de visualización y también agrego un mapa de bits para mostrar algunas imágenes. En la configuración, inicializo la pantalla. luego en el ciclo, muestro todos los datos usando el display.print () función. Muestro los datos en cuatro páginas, Tiempo, Presión, temperatura y humedad, y UV_index. hay un retraso de 5 segundos entre cada página.

Videoclip

Código

  • Código de la estación meteorológica local
Código de la estación meteorológica local Arduino
 #include  #include  #include  #include  #include  #include  #include  #include  #include  // # incluye  #define SCREEN_WIDTH 128 # define SCREEN_HEIGHT 64 # define SCREEN_fruta_de_pantalla, , OLED_RESET); # define BMP_SCK (13) #define BMP_MISO (12) #define BMP_MOSI (11) #define BMP_CS (10) DS3231 clock; bool century =false; bool h12Flag; bool pmFlag; Adafruit_BMP280 bmp, BMP_MCISI , BMP_SCK); # define DHTPIN 2 # define DHTTYPE DHT11DHT dht (DHTPIN, DHTTYPE); const unsigned char PROGMEM frame0 [] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x01, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x18, 0x07, 0xC0, 0x07, 0x86, 0 x18, 0x61, 0xE0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x1C, 0x40, 0x00, 0x3C, 0x02x, 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0xC0, 0x00, 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0xF, 0xFF, 0xFC, 0xFC, 0xF, 0xFF, 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3xF, 0xC0 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0xF01, 0x80x3, 0x00, 0xF01, 0x80x3, 0x00, 0x81, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char PROGMEM frame1 [] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x01, 0x00, 0x9D, 0x80, 0x03, 080, 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x00, 0x80, 0x06 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0xA6, 0xC 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0x00, 0xE0, 0 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA06, 0xE0 0xA6, 0x80, 0x00, 0x06, 0x08, 0xA6, 0x80, 0x00, 0x02, 0x19, 0xA6, 0xC0, 0x00, 0x03, 0xF3, 0x26, 0x60 , 0x00, 0x00, 0xC6, 0x26, 0x30, 0x00, 0x00, 0x0C, 0xE3, 0x10, 0x00, 0x00, 0x09, 0x80, 0x98, 0x00, 0x00, 0x19, 0x00, 0xC8, 0x00, 0x00, 0x13, 0x13 , 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x1B, 0x00, 0x4C, 0x00, 0x00, 0x09, 08x80 , 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char PROGMEM frame2 [] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80}; configuración vacía () {Serial.begin (57600); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println (F ("SSD1306 falló")); } Wire.begin (); dht.begin (); if (! bmp.begin ()) {Serial.println (F ("Problema.bmp")); mientras (1) demora (10); } display.clearDisplay (); display.setTextColor (BLANCO); display.setTextSize (1); display.setCursor (0, 9); display.setFont (&FreeSans9pt7b); display.println ("**** LOCAL ****"); display.setCursor (0, 38); display.setFont (&FreeMonoBoldOblique12pt7b); display.println ("agua"); display.setCursor (27, 58); display.println ("Estación"); display.display (); retraso (2000); bmp.setSampling (Adafruit_BMP280 ::MODE_NORMAL, / * Modo de funcionamiento. * / Adafruit_BMP280 ::SAMPLING_X2, / * Sobremuestreo de temperatura * / Adafruit_BMP280 ::SAMPLING_X16, / * Sobremuestreo de presión * / Adafruit_BMP280 ::FILTER_X16. * Adafruit_BMP280 ::STANDBY_MS_500); /* Tiempo de espera. * /} void loop () {// Visualización del tiempo.clearDisplay (); display.setTextColor (BLANCO); display.setTextSize (1); display.setCursor (13, 15); display.setFont (&FreeMonoBoldOblique12pt7b); display.print (clock.getHour (h12Flag, pmFlag)); display.setCursor (38, 15); display.println (":"); display.setCursor (50, 15); display.println (clock.getMinute ()); display.setCursor (70, 15); if (pmFlag) {display.println ("PM"); } else {display.println ("AM"); } display.setFont (&FreeSans9pt7b); display.setCursor (20, 60); display.println (clock.getDate ()); display.setCursor (40, 60); display.println ("/"); display.setCursor (46, 60); display.println (clock.getMonth (siglo)); display.setCursor (65, 60); display.println ("/"); display.setCursor (70, 60); display.println ("20"); display.setCursor (90, 60); display.println (clock.getYear ()); display.setCursor (30, 30); display.setFont (&FreeSans9pt7b); switch (clock.getDoW ()) {caso 1:display.println ("sábado"); descanso; caso 2:display.println ("Domingo"); descanso; caso 3:display.println ("Lunes"); descanso; caso 4:display.println ("martes"); descanso; caso 5:display.println ("miércoles"); descanso; caso 6:display.println ("jueves"); descanso; caso 7:display.println ("viernes"); descanso; } display.display (); retraso (5000); // P display.clearDisplay (); display.drawBitmap (0, 0, frame0, 40, 40, 1); display.setFont (&FreeSans9pt7b); display.setCursor (41, 28); display.println (bmp.readPressure () / 100); display.setCursor (110, 28); display.setFont (); display.println ("hPa"); display.setCursor (0, 55); display.setFont (&FreeSans9pt7b); display.println ("Altitud:"); display.setCursor (65, 62); display.println (bmp.readAltitude (1005.47)); display.setCursor (113, 62); display.println ("m"); display.display (); retraso (5000); // T &RH display.clearDisplay (); display.setFont (&FreeMonoBoldOblique12pt7b); display.drawBitmap (0, 5, frame1, 40, 51, 1); display.setCursor (35, 30); display.print (bmp.readTemperature ()); display.setFont (&FreeSans9pt7b); display.setCursor (102, 28); display.println ("*"); display.setCursor (110, 31); display.println ("C"); display.setFont (); display.setCursor (66, 45); display.println ("RH:"); byte RH =dht.readHumidity (); display.setCursor (95, 45); display.println (RH); display.setCursor (110, 45); display.println ("%"); display.drawBitmap (0, 56, frame2, 135, 15, 1); display.display (); retraso (5000); // Pantalla UV.clearDisplay (); flotador sensorValue =analogRead (A0); flotador sensorVoltage =sensorValue / 1024 * 5.0; int UV_index =sensorVoltage / 0.1; display.setFont (&FreeSans9pt7b); display.setCursor (0, 15); display.print ("ÍNDICE UV"); display.setCursor (58, 45); display.println (UV_index); display.display (); retraso (5000);} 

Piezas y carcasas personalizadas

Esquemas


Proceso de manufactura

  1. Estación meteorológica basada en Raspberry Pi
  2. Estación meteorológica Raspberry Pi 2
  3. Estación meteorológica Raspberry Pi
  4. Weather Station V 2.0
  5. 6-Shooter:Arduino Drink Mixing Station
  6. Sensor de temperatura múltiple
  7. Registrador de datos de globos meteorológicos con tecnología Arduino
  8. $ 10 Estación meteorológica portátil Arduino (AWS)
  9. Estación meteorológica ThingSpeak Arduino
  10. WiFi ESP8266 y sensor DHT22
  11. Pulsera inteligente