Pular para o conteúdo principal

Visão Geral do Projeto

Neste wiki, mostraremos como usar os recursos Bluetooth 5.0 BLE do Seeed Studio XIAO nRF52840 com o Seeed Studio Grove Temperature & Humidity Sensor (DHT20) para transmitir medições de temperatura e umidade ao Home Assistant usando o protocolo BTHome.

Usaremos CircuitPython para o código.

Primeiros Passos

Para acompanhar este tutorial, você precisa do seguinte hardware

Seeed Studio XIAO nRF52840-SenseSeeed Studio Grove Temperature&Humidity Sensor V2.0 (DHT20)

Preparação de Hardware

O sensor Grove DHT20 usa I2C para comunicação. Precisamos conectá-lo aos pinos I2C do XIAO nRF52840 Sense:

  • Podemos usar um XIAO Grove Shield com um cabo Universal de 4 pinos sem trava
  • Conectar o sensor DHT20 diretamente ao XIAO nRF52840 Sense usando um cabo Conversor de 4 pinos Jumper Fêmea para Grove 4 pinos

Aqui está o pinout do XIAO nRF52840 Sense e do XIAO Grove Shield

pir

pir

Configuração de Hardware

A fiação é simples. Usando o Shield ou não, o seguinte esquema em Fritzing mostra como ligar os componentes.

Wiring

Wiring

Wiring

Preparação de Software

Vamos usar o Thonny IDE (Linux) e algumas bibliotecas e arquivos relacionados. Estes são os passos que vamos seguir:

  1. Instalar o CircuitPython no XIAO nRF52840 Sense
  2. Instalar as bibliotecas necessárias
  3. Programar nosso sensor usando o protocolo BTHome
  4. Configurar o Home Assistant

Passo 1 - Instalar o CircuitPython

Vamos instalar o CircuitPython.

Vá para CircuitPython e baixe uma versão para o XIAO nRF52840 Sense. Escolha Downloads e, no campo de busca, comece a digitar XIAO nRF52840 até que os resultados mostrem o sensor.

CircuitPython Download

Em seguida, pressione o botão de download para obter o arquivo para o nosso dispositivo.

CircuitPython Download

Você deverá ter um arquivo .uf2. Para instalá-lo, precisamos entrar no modo bootloader. Conecte o XIAO nRF52840 Sense ao seu computador e pressione o botão de reset duas vezes.

CircuitPython Download

Uma nova unidade deve ter aparecido no seu computador chamada XIAO-SENSE.

XIAO nRF52840 Sense drive

Em seguida, copie o arquivo baixado para essa unidade.

XIAO nRF52840 Sense drive

Depois de um tempo, aparece uma nova unidade chamada CIRCUITPY. Temos o CircuitPython instalado em nosso microcontrolador.

XIAO nRF52840 Sense drive

Passo 2 - Instalar bibliotecas

Para usar nosso Grove Temperature & Humidity sensor V2.0 (DHT20), precisamos da biblioteca AHT20 da Adafruit.

O site anterior tem instruções sobre como instalar bibliotecas.

Depois de instalar, devemos ter os seguintes arquivos (estes são os necessários para o nosso sensor DHT20):

XIAO nRF52840 Sense drive

Passo 3 - Enviar o Código

Antes de irmos para o código, precisamos entender o que é BTHome.

BTHome logo

BTHome

BTHome é um padrão aberto para transmissão de dados de sensores e pressionamentos de botões via Bluetooth Low Energy (BLE). Ele é projetado para ser energeticamente eficiente, flexível e seguro. BTHome é suportado por plataformas populares de automação residencial, como o Home Assistant, de forma nativa.

Alguns benefícios do BTHome:

  • É um padrão aberto, portanto dispositivos de diferentes fabricantes podem funcionar juntos.
  • Os dispositivos são projetados para serem energeticamente eficientes, de forma que possam funcionar por muito tempo com uma única bateria.
  • Os dados são criptografados, portanto são protegidos contra acesso não autorizado.
  • É um formato flexível, portanto pode ser usado para transmitir uma variedade de dados de sensores e pressionamentos de botões.

BTHome é um padrão versátil e poderoso para transmitir dados de sensores e pressionamentos de botões via BLE. É uma boa opção para quem deseja adicionar dados de sensores e botões à sua casa inteligente.

Você pode ler mais sobre ele e aprender sobre o formato de dados no site oficial.

Código

Aqui está o código em CircuitPython.

Clique para copiar o código CircuitPython
# BTHome with DHT20
# This code is based on the excelent code by Koen Vervloesem
# https://github.com/koenvervloesem/BTHome-Inertial-Sensor-in-CircuitPython
# We don't use deep sleep because it just doesn't work
# on the XIAO nRF52840 Sense. It's a pitty.

from _bleio import adapter
from time import sleep
import board
# for the Grove sensor
import adafruit_ahtx0


# The size of the name is important.
DEVICE_NAME = "XIAO nRF52840 Sense"
INTERVAL = 0.1

# Because this is delaying just 0.1s - 100 milliseconds, we don't need to read the sensor
# values everytime. It's overkill - let's just read every 5 minutes.
# Let's create a timer that will add every INTERVAL
# when it reaches 30 - it will be 5 minutes passed
# then we read the sensor
# INTERVAL * 60 seconds * 5 minutes
# CONVERTING 0.1ms to seconds * 60s * minutes = 300
MINUTES_PER_READING = 5
readTimer = INTERVAL * 10 * 60 * MINUTES_PER_READING


# convert the measurement value to the BTHome format
def value_to_little_endian (measurement):

# Calculate the integer value by dividing the temperature by the factor
integer_value = int(measurement / 0.01)

# Extract the lower and upper bytes for little-endian representation
lower_byte = integer_value & 0xFF
upper_byte = (integer_value >> 8) & 0xFF

# Reverse the order of the bytes
little_endian_bytes = bytes([upper_byte, lower_byte])
return little_endian_bytes

class BTHomeAdvertisement:
_ADV_FLAGS = [0x02, 0x01, 0x06]
_ADV_SVC_DATA = [0x0a, 0x16, 0xd2, 0xfc, 0x40, 0x02, 0x00, 0x00, 0x03, 0xbf, 0x13]

def _name2adv(self, local_name):
adv_element = bytearray([len(local_name) + 1, 0x09])
adv_element.extend(bytes(local_name, "utf-8"))
return adv_element

def __init__(self, local_name=None):
if local_name:
self.adv_local_name = self._name2adv(local_name)
else:
self.adv_local_name = self._name2adv(adapter.name)

def adv_data(self, temperature, humidity):
adv_data = bytearray(self._ADV_FLAGS)
adv_svc_data = bytearray(self._ADV_SVC_DATA)
# temperature
# change values according -
temp = value_to_little_endian (temperature)
# returned value is list
adv_svc_data[6] = temp[1]
adv_svc_data[7]= temp[0]
# humidity
# change values according -
hum = value_to_little_endian (humidity)
# returned value is list
adv_svc_data[9] = hum[1]
adv_svc_data[10]= hum[0]
adv_data.extend(adv_svc_data)
adv_data.extend(self.adv_local_name)
return adv_data


# BTHome
bthome = BTHomeAdvertisement(DEVICE_NAME)

# Create sensor object
sensor = adafruit_ahtx0.AHTx0(board.I2C())

# because we want a initial reading
# let's initialize with the readTimer variable
# so we force the script to read the values
currentTimer = 0
# inital reading
temp = sensor.temperature
hum = sensor.relative_humidity

#DEBUG
#print("\nTemperature: %0.1f C" % temp)
#print("Humidity: %0.1f %%" % hum)

while True:
adv_data = bthome.adv_data(temp,hum)
adapter.start_advertising(
adv_data, scan_response=None, connectable=False, interval=INTERVAL * 2
)
sleep(INTERVAL)
adapter.stop_advertising()
# increase currentTimer
currentTimer += INTERVAL
#print (f"Current timer: {currentTimer}")
if (currentTimer >= readTimer):
#print (f'Read new values')
# Read new values
temp = sensor.temperature
hum = sensor.relative_humidity
#reset counter
currentTimer = 0


Lembre-se de salvá-lo como code.py para que seja executado na inicialização.

BTHome logo

Um pouco de explicação sobre o código

  • O código está cheio de comentários para explicá-lo um pouco.
  • Basicamente, a cada 0,2 s ele está transmitindo a temperatura e a umidade vindas do sensor DHT20.
  • Como não queremos sobrecarregar o sensor e ler valores a cada 0,2 s, colocamos um temporizador. Ele só lerá os valores a cada 5 minutos. Esse tempo é controlado pela variável MINUTES_PER_READING.

Passo 4 - Exibir dados no Home Assistant

Passo 4.1 - Adicionar XIAO nRF52840 Sense no Home Assistant

Home Assistant Logo

Home Assistant é um software gratuito e de código aberto para automação residencial. Ele é projetado para ser um sistema de controle central para dispositivos de casa inteligente, com foco em controle local e privacidade.

Home Assistant atua como um hub central de controle da casa inteligente, combinando diferentes dispositivos e serviços em um único lugar e integrando-os como entidades. O sistema baseado em regras fornecido para automação permite criar rotinas personalizadas com base em um evento de gatilho, condições e ações, incluindo scripts. Isso possibilita a criação de automações, gerenciamento de alarmes de segurança e vigilância por vídeo para sistemas de segurança residencial, bem como o monitoramento de dispositivos de medição de energia.

Você pode ler mais sobre isso no site oficial.

Requisitos

Um requisito crucial é que o HA (Home Assistant) tenha Bluetooth. Se você estiver executando o HA em um Raspberry PI, é provável que tenha. Tudo depende da versão do RPi.

Configuração

No "Passo 3 - Enviar Código", programamos o XIAO nRF52840 e, para o próximo passo, ele deve estar em execução, para que o HA possa detectá-lo.

Abra sua instalação do HA. Vá em Settings -> Devices and Services

Home Assistant

Agora, a sua página de Integrations será exibida. Selecione Bluetooth

Home Assistant

E a Integração deve aparecer.

Home Assistant

NOTA: Se algo não estiver funcionando, verifique se o Passive scanning não está selecionado

Home Assistant

Ao entrar na página de Integrations, se você tiver o XIAO nRF52840 Sense conectado, ele já deve ter sido detectado e aparecerá na página.

Home Assistant

Pressione "Configure" para configurar esta nova Integration. Pressione Submit.

Home Assistant

Agora você só precisa selecionar a área onde colocar esse novo sensor e pronto.

Home Assistant

Em seguida, vá novamente em Settings -> Integrations e selecione a nova integração BTHome

Home Assistant

Em seguida, somos levados à página da integração. Podemos ver que temos 1 dispositivo e 3 entidades. As entidades são a temperatura, a umidade e a intensidade do sinal

Home Assistant

Se clicarmos nas entidades, veremos uma nova página onde podemos ter uma visualização de todas elas.

Home Assistant

Se, em vez disso, pressionarmos em device, veremos a página do dispositivo com todas as opções, bem como os valores atuais. Usando essa página, podemos adicioná-lo ao dashboard.

Home Assistant

Ao pressionar "ADD to DASHBOARD", podemos escolher a visualização onde colocá-lo.

Home Assistant

Depois disso, teremos uma visualização do card. Basta pressionar "ADD TO DASHBOARD" para adicioná-lo ao dashboard.

Home Assistant

Se formos ao dashboard, veremos nosso card recém-adicionado com a temperatura e a umidade transmitidas pelo XIAO nRF52840 Sense.

Home Assistant

E mais - Função de Deep Sleep

Eu não consegui fazê-la funcionar. Se alguém tiver uma solução, por favor deixe um comentário. Você pode compartilhar suas ideias no GitHub

✨ Projeto de Contribuidor

Suporte Técnico & Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para lhe fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...