Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Estação meteorológica local

Componentes e suprimentos

Arduino Nano R3
× 1
Seeed Grove - Sensor Barômetro (BMP280)
× 1
Sensor DHT11 de Temperatura e Umidade (4 pinos)
× 1
ElectroPeak 0.96 "Módulo de exibição OLED 64x128
× 1
Sensor UV GUVA-S12SD
× 1
DS3231 RTC
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Arame de solda, sem chumbo
Impressora 3D (genérica)

Aplicativos e serviços online

Arduino IDE
Autodesk Fusion 360

Sobre este projeto


Há muito tempo eu queria fazer uma estação meteorológica sem usar a internet. É ótimo medir os dados meteorológicos ao seu redor e dar uma olhada nos dados quando desejado. então, eu fiz uma estação meteorológica local de aparência bacana que pode medir a pressão do ar ao redor, temperatura, umidade e o índice de UV do dia (se você colocá-la perto da janela). Espere, tem mais! 😉 também possui uma tela Relógio para mostrar a hora, data e dia da semana.

Neste tutorial, mostrarei como fazer essa estação de clima frio nessas etapas.





Etapa 1:construção do gabinete


Eu uso o Autodesk fusion 360 para criar o gabinete e imprimi-lo com PLA verde. Ele precisa de suportes e eu imprimo com 20% de preenchimento com velocidade de 70 mm / s no meu Ender 3. Você encontrará o arquivo STL para o Enclosure com este projeto.





Etapa 2:BMP280


O BMP280 é um sensor de pressão atmosférica e temperatura e usa o protocolo I2C ou SPI para se comunicar com o Arduino. Aqui eu uso o SPI. Para usar SPI, conecte-
  • CS a D10
  • SDA para D11
  • SDO para D12
  • SCK para D13

Na parte do código, para usar este sensor, precisamos de uma biblioteca. em primeiro lugar, incluo a biblioteca no código #include . você pode baixar a biblioteca aqui.

Então eu defino o pino SPI para o sensor. Na função de configuração, inicializo o sensor BMP e, na função de loop, leio os dados de pressão e temperatura usando bmp.readPressure () e bmp.readTemperature () comando. Eu divido o valor da pressão por 100 para medir a pressão na unidade hPa. Para medir a altitude, eu uso bmp.readAltitude (1005.47) comando. Aqui você deve alterar o valor (1005,47) de acordo com a pressão média da sua área.





Etapa 3:DS3231 RTC


Esta estação meteorológica também possui uma tela de tempo que pode mostrar a hora atual, data e dia do fraco. Para isso, utilizo o módulo DS231 RTC, que utiliza o protocolo I2C para se comunicar. então, para usar isso, conecte
  • SCL para A5
  • SDA para A4

em primeiro lugar, você deve definir a hora e a data no RTC usando o DS3231_set.ino programa da biblioteca Exemplo.

No programa principal, incluo a biblioteca #include e ler os dados de tempo de acordo com as instruções da biblioteca. aqui, uso o exemplo da biblioteca como referência para o código. Criei um caso para todos os dias da semana para encontrar o dia atual.





Etapa 4:DHT11


Eu uso este sensor para medir a umidade. Para isso, eu conecto seus dados para Arduino D2 . E no programa, incluo a biblioteca DHT #include então na configuração inicializo o sensor e no loop, leio o valor da umidade usando dht.readHumidity () comando.





Etapa 5:Sensor UV GUVA-S12SD


GUVA-S12SD é um fotodiodo do tipo Schottky baseado em nitreto de gálio. Ele tem um comprimento de onda de detecção de UV típico de 240-370 nm (que cobre UVB e a maior parte do espectro de UVA). Ele produz uma tensão analógica calibrada que varia com a intensidade da luz UV. Portanto, podemos ler o valor analógico via Arduino ADC.

na função de loop, analiso o valor do sensor e calculo o índice UV
  float sensorValue =analogRead (A0); 
float sensorVoltage =sensorValue / 1024 * 5,0;
int UV_index =sensorVoltage / 0,1;





Etapa 6:display OLED


Eu uso um display OLED de 0,96 "128 * 64 para este projeto, ele usa o protocolo I2C, então eu o conecto ao Arduino como segue-
  • SCK para A5
  • SDA para A4

No programa, em primeiro lugar, incluo a biblioteca Adafruit_SSD1306 e Adafruit_GFX
  #include  
#include

em seguida, crio a variável de exibição e também adiciono algum bitmap para exibir algumas imagens. Na configuração, eu inicializo o display. em seguida, no loop, exibo todos os dados usando o display.print () função. Eu exibo os dados em quatro páginas, Tempo, Pressão, temperatura e umidade e UV_index. há um atraso de 5 segundos entre cada página.





Videoclipe



Código

  • Código da estação meteorológica local
Código da estação meteorológica local Arduino
 #include  #include  #include  #include  #include  #include  #include  #include  #include  // #include  #define SCREEN_WIDTH 128 # define SCREEN_HEIGHT 64 # define OLED_RES6_RESETSET SCREEN_HEIGHT 64 # define OLED_RES6_ESET e tela 4A , OLED_RESET); # define BMP_SCK (13) #define BMP_MISO (12) #define BMP_MOSI (11) #define BMP_CS (10) relógio DS3231; bool século =false; bool h12Flag; bool pmFlag; Adafruit_BMP_MISO280 bmp (BMP_CS, BMP_MISOI80 bmp (BMP_CS, BMP_MISOI80, BMP , 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, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x01, 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, 0x02, 0x38, 0x3C, 0x61, 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0x00, 0x1E, 0x79, 0xC0, 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0xFF, 0x3F, 0x1C, 0x3C, 0xFC, 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3F, 0xC3, 0xFC, 0xF0, 0x0F, 0x0F, 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0x7F, 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, 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, 0x00, 0x03, 0x80, 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x08, 0x20, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0xA6, 0xC0, 0x00, 0x00, 0x38, 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0xE0, 0x00, 0x00, 0xC0, 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA6, 0xE0, 0x00, 0x06, 0x08, 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, 0x80, 0x98, 0x00, 0x00, 0x19, 0x00, 0xC8, 0x00, 0x00, 0x13, 0x00, 0x6C , 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x1B, 0x00, 0x4C, 0x00, 0x00, 0x09, 0x80, 0xC8 , 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x80 , 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, 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, 0 xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80}; configuração nula () {Serial.begin (57600); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println (F ("SSD1306 falhou")); } Wire.begin (); dht.begin (); if (! bmp.begin ()) {Serial.println (F ("Problema.bmp")); enquanto (1) atraso (10); } display.clearDisplay (); display.setTextColor (WHITE); display.setTextSize (1); display.setCursor (0, 9); display.setFont (&FreeSans9pt7b); display.println ("**** LOCAL ****"); display.setCursor (0, 38); display.setFont (&FreeMonoBoldOblique12pt7b); display.println ("wather"); display.setCursor (27, 58); display.println ("Estação"); display.display (); atraso (2000); bmp.setSampling (Adafruit_BMP280 ::MODE_NORMAL, / * Modo operacional. * / Adafruit_BMP280 ::SAMPLING_X2, / * Temp. oversampling * / Adafruit_BMP280 ::SAMPLING_X16, / * Pressure oversampling * / Adafruit_BMP280 / SAMPLING_X2, / * Temp. oversampling * / Adafruit_BMP280 ::SAMPLING_X16, / * Pressure oversampling * / Adafruit_BMP280 / Filter_X16. Adafruit_BMP280 ::STANDBY_MS_500); /* Tempo de espera. * /} void loop () {// Time display.clearDisplay (); display.setTextColor (WHITE); 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 (século)); 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"); pausa; caso 2:display.println ("Domingo"); pausa; caso 3:display.println ("segunda-feira"); pausa; caso 4:display.println ("terça-feira"); pausa; caso 5:display.println ("quarta-feira"); pausa; caso 6:display.println ("quinta-feira"); pausa; caso 7:display.println ("Friday"); pausa; } display.display (); atraso (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 ("Altitude:"); display.setCursor (65, 62); display.println (bmp.readAltitude (1005.47)); display.setCursor (113, 62); display.println ("m"); display.display (); atraso (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 (); atraso (5000); // UV display.clearDisplay (); float sensorValue =analogRead (A0); float sensorVoltage =sensorValue / 1024 * 5,0; int UV_index =sensorVoltage / 0,1; display.setFont (&FreeSans9pt7b); display.setCursor (0, 15); display.print ("UV INDEX"); display.setCursor (58, 45); display.println (UV_index); display.display (); atraso (5000);} 

Peças personalizadas e gabinetes

Esquemas


Processo de manufatura

  1. Estação meteorológica baseada no Raspberry Pi
  2. Estação meteorológica Raspberry Pi 2
  3. Estação meteorológica Raspberry Pi
  4. Estação meteorológica V 2.0
  5. 6-Shooter:Estação de Mistura de Bebidas Arduino
  6. Sensor de temperatura múltipla
  7. Registrador de dados do balão meteorológico Arduino
  8. $ 10 Estação meteorológica portátil Arduino (AWS)
  9. Estação meteorológica ThingSpeak Arduino
  10. WiFi ESP8266 e Sensor DHT22