Índice:

Estação meteorológica portátil para observadores do céu noturno: 7 etapas (com fotos)
Estação meteorológica portátil para observadores do céu noturno: 7 etapas (com fotos)

Vídeo: Estação meteorológica portátil para observadores do céu noturno: 7 etapas (com fotos)

Vídeo: Estação meteorológica portátil para observadores do céu noturno: 7 etapas (com fotos)
Vídeo: Como é uma observação profissional? 2024, Novembro
Anonim
Estação meteorológica portátil para observadores do céu noturno
Estação meteorológica portátil para observadores do céu noturno

A poluição luminosa é um dos muitos problemas do mundo. Para resolver esse problema, precisamos saber o quanto o céu noturno está poluído com luz artificial. Muitos alunos com professores em todo o mundo tentam medir a poluição luminosa com sensores caros. Decidi mudar meu luxímetro portátil (para mais informações verifique o projeto anterior de instructables Luxímetro portátil) para uma estação meteorológica com sensor TSL2591. Este sensor é sensível o suficiente para medir a poluição noturna. Além disso, adiciono HTU21D para medição de temperatura e umidade.

Etapa 1: O que é poluição noturna e como ela mede

O que é poluição noturna e como ela mede
O que é poluição noturna e como ela mede

A poluição noturna é a luz de lâmpadas, carros, casas, enormes painéis de lcd na cidade e todas as luzes feitas por humanos. Essa luz chama artificial. Para os observadores, a luz artificial é o principal problema para ver as estrelas da cidade, e eles devem ir para fora da cidade. Para os humanos, a alta poluição luminosa é prejudicial. E também para árvores, grama e animais.

Para verificar a poluição luminosa do seu lugar, você pode ver aqui o mapa de poluição luminosa

É apenas um modelo, e os valores reais podem variar. É por isso que criei aquele luxímetro.

Para medir a poluição luminosa, eu meço apenas lux e calculo magnitude / arsec2.

Posso calcular de lux a candela por suqare metros:

1 cd / m2 = 1 lux

A magnitude por segundo de arco quadrado (mag / arcsec2) descreve o fundo do céu noturno (chama o brilho da superfície).

Mais na wiki: brilho da superfície

Para calcular cd / m2 para mag / arcsec2 é a fórmula:

[valor em mag / arcsec2] = Log10 ([valor em cd / m2] / 108000) / - 0,4

unihedron.com/projects/darksky/magconv.php

Etapa 2: BOM

BOM
BOM

Para este projeto, você precisa de:

1. WEMOS D1 Mini ou qualquer microcontrolador

(Eu uso wemos, porque é o menor, com porta usb, você pode experimentar o Arduino Nano)

WEMOS D1 MINI (Yanwen Economic Air Mail)

WEMOS D1 MINI (envio padrão AliExpress)

WEMOS D1 MINI 10 pcs (China Post Registered Air Mail - frete grátis)

cabo usb para programação e upload de código para wemos

2. Sensor TSL2591

TSL2591 (Yanwen Economic Air Mail)

TSL2591 (China Post Registered Air Mail)

TSL2591 (China Post Registered Air Mail)

3. Sensor de temperatura e umidade HTU21D

HTU21D (Cainiao Super Economy)

HTU21D (Yanwen Economic Air Mail - frete grátis)

4. Tela OLED de 0,96 (128 x 64)

Display OLED

Display OLED

Display OLED

5. bateria 18650

Bateria de íon de lítio 18650

Bateria de íon de lítio 18650

porta bateria 18650

6. Módulo de carregamento TP4056

tp4056

tp4056

7. botões de mudança ou jumper dip

mergulho vermelho swtich

swtichers, muito diferente

8. cabos de placa de ensaio e dupont

pequeno breadboard

kit tábua de pão

9. caso, eu crio de madeira + fita

fita vermelha

Impressora 3D Prusa, espero fazer estojo de plástico: D

Etapa 3: circuito

O circuito
O circuito

O circuito é muito simples:

Conecte todos os módulos i2c (TSL2591, OLED, HTU21D) aos pinos SCL e SDA em wemos (SDA -> D2, SCL -> D1).

Alimente-os com 3,3 V do wemos.

Conecte o terminal positivo da bateria ao pino de 5 V no wemos e o pino da bateria + no módulo de carregamento tp4056 ao terminal positivo da bateria.

Conecte todos os aterramentos juntos.

Etapa 4: Sensor HTU21D

Sensor HTU21D
Sensor HTU21D

Compro novo sensor de temperatura, que mede com precisão 0,3 ° C!

Coisas que você deve saber sobre este sensor (do sparkfun):

  • Usa a interface I2C
  • Exatidão de umidade típica de ± 2%
  • Precisão de temperatura típica de ± 0,3 ° C
  • Opera de 0 a 100% de umidade, mas este sensor não é recomendado para ambientes agressivos onde pode entrar em contato com água (como chuva).
  • Sensor de 3,3 V - use conversores de nível lógico em linha ou resistores de 10k para limitar os sinais de 5 V
  • Apenas um sensor HTU21D pode residir no barramento I2C por vez

Meu resumo: é um bom sensor, pois mede com precisão 0,3 ° C e ambos - temperatura e umidade. Prós é a interferência I2C e os contras 3.3V, mas isso não importa no meu caso.

Etapa 5: TSL2591

TSL2591
TSL2591

Este sensor é bom para medir a poluição do céu noturno devido à sua sensibilidade (até 188 micro lux!).

1. são diodos com possível ir e medida completa. Eu não uso.

2. regulador de tensão de 5V a 3,3 V

Especificações do chip (da adafruit):

  • Resposta aproximada do olho humano
  • Faixa dinâmica extremamente ampla de 1 a 600.000.000 contagens
  • Faixa de Lux: Sensibilidade de 188 uLux, até 88.000 medições de entrada de Lux.
  • Faixa de temperatura: -30 a 80 * C
  • Faixa de tensão: 3,3-5V no regulador de bordo
  • Interface: I2C
  • Esta placa / chip usa endereço I2C de 7 bits 0x29 (fixo)
  • Dimensões: 19 mm x 16 mm x 1 mm / 0,75 "x 0,63" x 0,04 "Peso: 1,1 g
  • 2 diodos para medição - infravermelho e espectro total

Resumo:

188 uLux é perfeito, também a comunicação I2C é simples. Talvez o problema possa ser corrigido endereço I2C (0x29). Também a bordo do regulador é bom e possível usar o sensor durante o inverno (geada).

Etapa 6: Código

Você precisa dessas bibliotecas (eu as adiciono a um arquivo zip):

  • Adafruit-GFX-Library-master
  • adafruit_gfx_library_master
  • Adafruit_HTU21DF_Library-master
  • Adafruit_Sensor-master
  • Adafruit_TSL2591_Library-master

Código: você pode usar o meu ou criar o seu próprio. Não se esqueça de definir o tempo de integração máximo (600 MS) e o ganho para o máximo (GAIN_MAX) para medir o céu noturno.

Se você tentar usar meu código, baixe o arquivo ino. Quando eu copio meu código instrutível, algo está errado com as bibliotecas

Eu uso o carregamento de imagens da lua apenas para me divertir. Você pode usar qualquer um, basta usar esta página para obter o array:

javl.github.io/image2cpp/

//https://lastminuteengineers.com/oled-display-arduino-tutorial///https://javl.github.io/image2cpp/ // mcd para magnitude https://unihedron.com/projects/darksky/magconv.php… // O HD44780 é um controlador para telas de cristal líquido (LCDs) baseadas em caracteres. https://unihedron.com/projects/darksky/magconv.php… #include

#incluir

#include #include #include "Adafruit_HTU21DF.h" #include "Adafruit_TSL2591.h" int counter; // Endereço TWI do display OLED #define OLED_ADDR 0x3C Adafruit_SSD1306 display (-1); // - 1 para reiniciar a tela com botão de reinicialização na placa arduino Adafruit_HTU21DF htu = Adafruit_HTU21DF (); Adafruit_TSL2591 tsl = Adafruit_TSL2591 (2591); // passe um número para o identificador do sensor (para seu uso posterior) uint32_t lum; uint16_t ir, full; int ulux; float lux; float temp; float rel_hum; float mag_arcsec2; // visual mags / arcsecond² [valor em mag / arcsec2] = Log10 ([valor em cd / m2] / 108000) / - 0,4 // símbolos // grau para Celsius const unsigned char degree PROGMEM = {0xe, 0x11, 0x11, 0x11, 0xe, 0x0, 0x0, 0x0}; // expoente 2 const Unsigned char expoent PROGMEM = {0xe, 0x1b, 0x3, 0x6, 0xc, 0x18, 0x1f, 0x0}; // 'moon_logo', 128x64px const unsigned char intro PROGMEM = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xbe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xcc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xc0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x ff, 0xff, 0xf0, 0x00, 0x3f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x60, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x38, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x48, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc4, 0x1f, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x60, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x43, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x5f, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0x0f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x 00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; void setup () {// htu21d htu.begin (); // tsl2591 sensor_t sensor; tsl.getSensor (& sensor); tsl.setGain (TSL2591_GAIN_MAX); // MAX, HIGH MED, LOW, tsl.setTiming (TSL2591_INTEGRATIONTIME_600MS); // 100MS, 200 MS, 300MS, 400MS, 500MS, 600MS // configuração para exibição oled display.begin (SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay (); display.display (); display.drawBitmap (0, 0, introdução, 128, 64, BRANCO); display.display (); atraso (1000); display.setTextSize (1); display.setTextColor (WHITE); display.setFont (& FreeSerif9pt7b); display.clearDisplay (); } loop vazio () {lux = 0; ulux = 0; mag_arcsec2 = 0; temp = 0; rel_hum = 0; atraso (100); lum = tsl.getFullLuminosity (); ir = lum >> 16; cheio = lum & 0xFFFF; atraso (100); lux = tsl.calculateLux (completo, ir); // intensidade de luz em microlux ulux = lux * 1000000; se (ulux <0) {ulux = 0; } mag_arcsec2 = log10 (lux / 108000) / - 0,4; // (log ((ulux / 108000)) /(-0.4) temp = htu.readTemperature (); rel_hum = htu.readHumidity (); display_values ();} void display_values () {//display.drawPixel(120, 50, WHITE); display.clearDisplay (); display.setCursor (1, 15); display.print (temp); display.drawBitmap (42, 2, grau, 8, 5, WHITE); display.setCursor (50, 15); display.print ("C"); display.setCursor (70, 15); display.print (rel_hum); display.setCursor (114, 15); display.print ("%"); display.drawLine (1, 20, 127, 20, WHITE); display.drawLine (67, 1, 67, 20, WHITE); display.setCursor (1, 35); display.print ("ulux ="); display.setCursor (50, 35); display.print (ulux); display.setCursor (1, 55); display.print ("mag / arsec"); display.drawBitmap (70, 45, expoente, 8, 8, BRANCO); display. setCursor (83, 55); display.print (mag_arcsec2); display.display ();}

Etapa 7: Dentro

Dentro
Dentro
Dentro
Dentro

Eu crio a própria caixa e uso protoboard com cabos duvidosos como vocês podem ver.

Eu uso o TP4056 para carregar a bateria com um cabo USB (preciso do jumper swtich dip).

Para ligar / desligar eu uso o dip jumper.

Para a luz do dia, TSL2591 mostra 0 e mag / arcsec2 é nan.

Para o céu noturno deve TSL2591 mostrar de 0 a 1000.000 microlux (ulux) e mag / arcsec2 correspondente

(cca. 14 a 22 mag / arsec2).

Para fullMoon, medi 50k ulux, que é 0,05 lux.

Recomendado: