Avançar para o conteúdo

Sensor de nível de luz com microPython

No post de hoje, leremos o sensor de nível de luz BH1750 com microPython, usando o Raspberry Pi Pico 2 com RP2350. Programaremos em microPython, nativamente suportado pelo Pi Pico 2.

Este pequeno sensor BH1750 (folha de dados aqui) lê o nível de luz em Lux até 65535, o que não está lá em cima com o mais brilhante dos sóis. É por isso que eu o recomendaria para uso “interno”, como em projetos que não são expostos aos elementos. Escolhi programar este tutorial em microPython usando o Pi Pico 2 porque estou criando um curso sobre esse assunto, então pareceu a escolha natural.

Hardware

As conexões físicas para este projeto são novamente muito simples, tudo o que você precisa é conectar o BH1750 ao Raspberry Pi Pico 2. Isso é feito via porta i2c, então tudo o que você precisa é SDA, SCL, +3V3 e GND. A porta I2c no RP2350 pode assumir várias posições diferentes (configuráveis ​​no seu código), mas o padrão são os pinos 4 e 5.

A energia e as comunicações vêm via cabo micro USB conectado diretamente ao Pi Pico 2. Você pode usar uma placa de ensaio para as conexões ou soldar tudo diretamente um no outro, usando fio 22 AWG (por exemplo). Abaixo está o esquema usado e também uma foto do produto real, na minha bancada.

Diagrama esquemático do BH1750 com Pi Pico 2
Diagrama esquemático do BH1750 com Pi Pico 2
Sensor BH1750 com Pi Pico 2 na protoboard
Sensor BH1750 com Pi Pico 2 na protoboard

Firmware/código

O código BH1750 não é meu e foi encontrado neste Github, consiste em quatro arquivos “.py” necessários para interagir com o sensor. Modifiquei o código o suficiente para atender às minhas necessidades, para que ele não seja mais “original”. Uma das coisas que removi foi o tempo (horas, minutos, segundos) impresso no shell para cada leitura, não achei necessário ou útil.

A maneira como o código funciona é que ele faz uma leitura toda vez que um tempo de conversão atinge seu valor, que é calculado internamente pelo próprio sensor. Isso acontece dentro do arquivo “bh1750.py” na função “get_conversion_cycle_time”, um tempo em milissegundos é retornado para a função principal e aplicado como tempo de atraso.

Há também uma “proteção” que não permite novos valores enquanto o valor recém-lido for igual ao anterior. Outra função interessante deste código é o percentual normalizado, ele mostra o percentual que a leitura atual representa do máximo já lido. Tudo isso para mostrar os valores de qualidade atuais em Lux e também o máximo já lido.

Todo o código está disponível no meu Github aqui. Também há no link as imagens que usei neste artigo, todas para você baixar e usar.

Eu tive que verificar e alterar a linha abaixo com as informações i2c da minha placa, em “main.py”. O valor “id=0” significa que estou usando i2c0, com SCL no pino 5 e SDA no pino 4. A frequência do barramento é 400Khz.

i2c = I2C(id=0, scl=5, sda=4, freq=400_000)

Testando

Fiz um vídeo explicando a montagem e a codificação, bem como os níveis Lux apresentados. Abordo brevemente a folha de dados do BH1750 e as informações do shell que estão sendo retransmitidas. Aproveite o vídeo e comente suas perguntas no formulário abaixo deste artigo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *