Medições meteorológicas com BeagleBone Black e display OLED

Medições meteorológicas com BeagleBone Black

 

Este artigo mostrará como fazer uma BeagleBone Black interagir com um sensor DHT22 para medir os valores instantâneos de temperatura e umidade relativa. Além disso, as informações lidas do sensor serão exibidas em um display OLED (comunicando com a BeagleBone Black via I2C).

 

 

Materiais necessários

 

Para a reprodução deste projeto, são necessários os seguintes materiais e softwares:

  • Uma placa BeagleBone Black (utilizei a Rev. C)*;
  • Um sensor de temperatura e umidade DHT22;
  • Um display OLED 0.96" (modelo de comunicação I2C);
  • Terminal serial (sugestão: PuTTY)**.

 

* Foi utilizada a distribuição Debian 8.6 (Jessie). A imagem para instalação da distribuição na placa, bem como as outras suportadas na placa, pode ser baixada aqui.

 

 

Circuito esquemático

 

O circuito esquemático do projeto é exibido na figura 1.

 

Medições meteorológicas com BeagleBone Black - Circuito esquemático
Figura 1 - Circuito esquemático

 

Sendo, no OLED:

  • Fio lilás: SCL
  • Fio laranja: SDA

 

A alimentação da BeagleBone Black neste projeto pode ser feita tanto via USB quanto pela entrada de fonte DC 5V.

 

 

Considerações: I2C na BeagleBone Black

 

A BeagleBone Black possui três barramentos I2C: 0, 1 e 2. O barramento 0 (I2C-0) é reservado para comunicação do SoC com componentes da própria placa (HDMI e chip de gerenciamento de energia) e o barramento 1, aparentemente, tem uso reservado (pois não vem habilitado de fábrica para uso). Sendo assim, somente o barramento número 2 está completamente livre / disponível para acesso ao desenvolvedor, conforme mostrado na figura 2.

 

Medições meteorológicas com BeagleBone Black - Pinagem da BeagleBoneBlack (destaque para I2C2)
Figura 2 - Pinagem da BeagleBoneBlack (destaque para I2C2)

 

Desta forma, é possível comunicar a placa com dispositivos I2C através do bus 2 (I2C-2), permitindo assim o uso de muitos periféricos e sensores, tais como: acelerômetros, controladores LCD, displays OLED, memórias EEPROM, etc.

 

 

Display OLED 0.96"

 

O display OLED utilizado possui dimensão de 0.96", com resolução 128x64 pixels. Este display utiliza o controlador SSD1306. No mercado, há uma grande variedade de displays (resolução, dimensões e cores distintas, sendo mais comum entre os hobbistas e makers os modelos mostrados na figura 3.

 

Tipos mais comuns de displays OLED 0.96" destinado a hobbistas / makers
Figura 3 - Tipos mais comuns de displays OLED 0.96" destinado a hobbistas / makers

 

Dentre os grandes atrativos no uso destes tipos de displays estão:

  • Baixo consumo energético, uma vez que a tecnologia OLED não exige o uso e um backlight;
  • Boa resolução, permitindo até a exibição de pequenas fotos (binarizadas, devido à limitação de cores do display);
  • Comunicação I2C, o que permite comunicação com o display a 2 fios somente;
  • Independente do ângulo ao qual é olhado o display, sua visualização não é prejudicada ou impossibilitada (como ocorre em displays LCD e sete segmentos).

 

Quanto à comunicação I2C, estes modelos de display OLED 0.96" já contém resistores de pull-up. Portanto, para a comunicação basta ligar o SDA e SCL do display ao SDA e SCL da BeagleBone Black.

 

IMPORTANTE: apesar do endereço do display no barramento I2C vem indicado atrás dos mesmo (seja por uma seleção via jumper ou fixo), é altamente recomendável verificar o real endereço do display no barramento. Isso evita transtornos e perdas de tempo no desenvolvimento de aplicações com estes displays. 

 

Para esta verificação no Linux da BeagleBone Black há o comando i2cdetect. Este comando irá varrer o barramento I2C informado na chamada do comando, permitindo o usuário verificar quais endereços estão sendo usados (e, no caso deste display OLED, descobrir em qual endereço ele está). Para esta varredura no barramento 2 (I2C-2), com o circuito esquemático montado e ligado, utilize o comando da seguinte maneira:

 

i2cdetect -r 2

 

O comando produzirá a seguinte resposta:

 

Varredura do barramento 2 da I2C. Em destaque, o endereço do display OLED
Figura 4 - Varredura do barramento 2 da I2C. Em destaque, o endereço do display OLED

 

Ou seja, conclui-se que o display OLED está no endereço 0x3c do barramento 2 da I2C.

 

 

Sensor DHT22

 

O sensor DHT22 (também conhecido como AM2302) é capaz de medir temperatura ambiente e umidade relativa do ar. Possui somente 4 terminais, sendo um dedicado à comunicação (que utiliza protocolo proprietário).

 

Sensor de temperatura e umidade relativa do ar DHT22
Figura 5 - Sensor de temperatura e umidade relativa do ar DHT22

 

Este sensor, assim como o display OLED 0.96", é muito popular entre os hobbistas e makers. Inclusive, já foi utilizado neste projeto aqui no portal Embarcados.

 

 

Projeto - Bibliotecas

 

Tanto o display OLED 0.96" (com controlador SSD1306) quanto o sensor DHT22 possuem bibliotecas suportadas pela Adafruit. São ótimas bibliotecas, disponíveis em várias linguagens. Neste projeto, irá ser utilizada a linguagem de programação Python, portanto as bibliotecas utilizadas estão disponíveis em:

 

 

Para maiores informações de como instalar as bibliotecas, consulte os seguintes sites: DHT Humidity Sensing on Raspberry Pi or Beaglebone Black with GDocs Logging e SSD1306 OLED Displays with Raspberry Pi and BeagleBone Black.

 

 

Projeto - Código-fonte e execução

 

O código-fonte do projeto é visto a seguir:

 

#Medicao da temperatura e exibicao no display OLED 0.96 (I2C)
#Autor: Pedro Bertoleti
#Data: Novembro/2016


import Adafruit_SSD1306
import Adafruit_DHT
import time

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

#configuracao do sensor de temperatura utilizado (DHT22)
sensor = Adafruit_DHT.DHT22  

#Configuracao do pino de reset do display (utilizado apenas para comunicacao via SPI, porem de 
#uso obrigatorio nas funcoes da biblioteca
RST = 'P9_12'

#configuracao do pino de leitura do sensor de temperatura
pin = 'P8_11'

#display 128x64 (no barramento 2 da I2C, no endereco 0x3c)
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3c, i2c_bus=2)

#------------------
#Programa principal
#------------------

disp.begin()
disp.clear()
disp.display()

#Cria area de imagem para escrita / desenho no display
width = disp.width
height = disp.height
image = Image.new('1', (width, height)) #imagem binaria (somente 1's e 0's)

#Determina a area a ser desenhada / escrita
draw = ImageDraw.Draw(image)

#definicoes uteis do display (para localizacao no mesmo)
padding = 2
shape_width = 20
top = padding
bottom = height-padding
x = padding

#Carrega fonte padrao do display
font = ImageFont.load_default()

Leitura = 1

while(True):
	try:
		#faz leitura do sensor de temperatura e umidade
		umidade, temperatura = Adafruit_DHT.read_retry(sensor, pin)

        #formata string de umidade e temperatura
		UmidadeStr = "{0:0.1f}".format(umidade) 		
		TemperaturaStr = "{0:0.1f}*C".format(temperatura) 		
		print "Leitura "+str(Leitura)+": "+TemperaturaStr+" - "+UmidadeStr
                Leitura = Leitura + 1
				
		#Escreve informacoes na tela		
		draw.text((x, top),    '   Medicoes DHT22',  font=font, fill=255)
		draw.text((x, top+20), 'TEMPERATURA: ', font=font, fill=255)
		draw.text((x, top+30), TemperaturaStr, font=font, fill=255)
		draw.text((x, top+40), 'UMIDADE: ', font=font, fill=255)
		draw.text((x, top+50), UmidadeStr, font=font, fill=255)

        disp.image(image)
		disp.display()
        time.sleep(1)
		
		#desenha um retangulo preto em todo o display (para apagar "restos" de dados na 
		#area de imagem)
        draw.rectangle((0,0,width,height), outline=0, fill=0)
	except KeyboardInterrupt:
		print "Aplicacao encerrada."
		exit(1)

 

Salve o arquivo com o nome temp_oled.py e, para executar o programa, utilize o seguinte comando:

 

sudo python temp_oled.py

 

Observação: no Linux da BeagleBone Black, para acessar barramentos (SPI, I2C, etc.) é preciso que se faça como super usuário (por isso a execução é feita com sudo).

 

 

Resultado

 

Como resultado da execução, a tela do terminal irá exibir todas as leituras de temperatura e umidade relativa feitas. Observe a figura 6.

 

Execução do programa (terminal)
Figura 6 - Execução do programa (terminal)

 

E, o projeto montado, ficara conforme mostram as figuras 7 e 8.

 

Montagem
Figura 7 - Montagem
Montagem
Figura 8 - Montagem

 

 

Referências

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Pedro Bertoleti
Sou engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP) e trabalho com Android embarcado em Campinas-SP. Curioso e viciado em tecnologia, sempre busco me aprimorar na área de sistemas embarcados (modalidades bare-metal, RTOS, Linux embarcado e Android embarcado).Para mais informações, acesse minha página no Facebook:https://www.facebook.com/pbertoleti
recentes antigos mais votados
Notificar
Jonathan Gonzaga
Visitante
Jonathan Gonzaga

Fala Pedro, blz? Excelente artigo, muito bom. Deixa eu te perguntar, tem previsão pra abertura de turmas no e-Stude, no curso de Sistemas Embarcados Profissionais? Mandei e-mail para o Rafael a algum tempo, mas não obtive rerorno.