Estação meteorológica local
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Ferramentas e máquinas necessárias
| ||||
| ||||
|
Aplicativos e serviços online
| ||||
|
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
- Estação meteorológica baseada no Raspberry Pi
- Estação meteorológica Raspberry Pi 2
- Estação meteorológica Raspberry Pi
- Estação meteorológica V 2.0
- 6-Shooter:Estação de Mistura de Bebidas Arduino
- Sensor de temperatura múltipla
- Registrador de dados do balão meteorológico Arduino
- $ 10 Estação meteorológica portátil Arduino (AWS)
- Estação meteorológica ThingSpeak Arduino
- WiFi ESP8266 e Sensor DHT22