Informações do clima com o PocketBeagle e OpenweatherMap Deixe um comentário

A PocketBeagle Board é a mais nova placa da linha BeagleBone e mostra que tamanho não é documento: apesar de seu diminuto tamanho, é uma placa com recursos incríveis, conforme pode ser visto nos artigos Conheça a PocketBeagle Board e Acessar a Internet na PocketBeagle aqui do blog. Para demonstrar a utilização dessa placa, este post mostrará como utilizar a PocketBeagle e OpenWeatherMap API, para apresentar em um display oled as informações do clima on-line.

Projeto PocketBeagle e OpenWeatherMap API

Material necessário

Para fazer este projeto, você precisará do seguinte material:

OpenWeatherMap API: uma API free para informações climáticas

Como fonte de informações climáticas, este projeto faz uso da OpenWeatherMap API. Esta API possui uma versão free e de simples uso, bastando apenas um simples cadastro para usufruir por completo dela, com informações de temperatura, umidade relativa do ar, nebulosidade, histórico de chuvas das últimas horas e muito mais! O uso free da API está limitado a quantidade de chamadas que podem ser feitas: no plano free, apenas uma chamada pode ser feita por minuto (o que é mais do que suficiente para a grande maioria dos projetos que faz uso deste tipo de informação). Caso você precise de mais consultas por minuto, há planos pagos disponíveis.

PocketBeagle e OpenweatherMap

Para utilizar esta API no projeto em questão, siga o procedimento abaixo:

  1. Acesse este site e crie sua conta no site OpenWeatherMap.
  2. Uma vez criada a conta, faça o login na mesma por este link.
  3. Ao logar, você será direcionado Às configurações de sua conta. Nesta tela, clique sobre o link API Keys
  4. Copie a API Key exibida (no campo “Key” da tela que surgir) e guarde-a (ela será necessária neste projeto)
  5. Aguarde pelo menos 10 minutos. Este é o tempo de ativação de sua conta para conseguir fazer uso da API.

Pronto, agora você já tem acesso a OpenWeatherMap API para fazer o projeto!

Circuito esquemático para PocketBeagle e OpenWeatherMap

O circuito esquemático do projeto pode ser visto na figura abaixo.

 

PocketBeagle e OpenWeatherMap API

Instalando bibliotecas na PocketBeagle Board

Antes de prosseguir, é preciso instalar algumas bibliotecas na PocketBeagle Board. Estas bibliotecas permitirão que a placa faça requisições HTTP para a OpenWeatherMap API e que consiga se comunicar com o display OLED 0.96″.

Para instalar todas as bibliotecas necessárias, execute os comandos abaixo na ordem em que são passados.

sudo apt-get update
sudo apt-get install build-essential python-dev python-pip
sudo pip install requests
sudo apt-get install i2c-tools
sudo pip install Adafruit_BBIO
sudo apt-get install python-imaging python-smbus
sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
cd Adafruit_Python_SSD1306
sudo python setup.py install

Preparação para o display: baixar fontes TTF

No projeto, serão utilizadas duas fontes TTF para exibição de informações no display (uma fonte TTF que simula um display de 7 segmentos e uma que tem boa definição mesmo com tamanhos de fonte muito pequenos). Isso fará com que o visual das informações fique bom e, assim, você aproveitará o display OLED ao máximo. Para baixar as fontes e transferi-las a PocketBeagle Board, faça o seguinte procedimento:

  1. Baixe  as fontes TTF clicando aqui e aqui. Descompacte os arquivos baixados em um local conhecido / de fácil acesso no seu computador.
  2. Com algum cliente de SFTP (FileZilla, por exemplo), conecte-se a PocketBeagle Board (com IP 192.168.7.2 e, se você não mudou as informações de autenticação da placa, utilize usuário “debian” e senha “temppwd”)
  3. Através do cliente SFTP, envie para a pasta home da PocketBeagle Board (se você não mudou as informações de autenticação da placa: /home/debian) os dois arquivos TTF das fontes

Agora sua placa possui todos os recursos necessários para desenvolvermos o projeto da PocketBeagle e OpenWeatherMap API

Projeto: código-fonte

Salve o código fonte na pasta home da PocketBeagle Board (se você não mudou as informações de autenticação da placa: /home/debian) como info_clima.py
IMPORTANTE: não se esqueça de colocar nos locais indicados do código a sua API Key, cidade e país.

import Adafruit_SSD1306
import requests
import json
import time

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

#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)

#demais variaveis globais
api_key_openweather = "" #coloque aqui sua api-key do OpenWeather
cidade = ""  #coloque aqui o nome da cidade desejada, sem acentos #para nomes com espaco, substitua o espaco por %20
pais = "" #coloque aqui a sigla do pais em que a cidade esta (par ao Brasil, a sigla é br)

def le_infos_clima():
    global api_key_openweather
    global cidade
    global pais

    url_http_req = "http://api.openweathermap.org/data/2.5/weather?q="+cidade+","+pais+"&appid="+api_key_openweather
    dados_clima = requests.get(url_http_req).json()

    #parser das informacoes desejadas do JSON
    temp_atual_kelvin = dados_clima["main"]["temp"]
    umidade = dados_clima["main"]["humidity"]
    nebulosidade = dados_clima["clouds"]["all"]

    temp_atual_celsius = int(float(temp_atual_kelvin) - 273.15)
    umidade_atual = float(umidade)
    nebulosidade = float(nebulosidade)
    return temp_atual_celsius,umidade,nebulosidade


###################
#Programa principal
###################

#Inicializacoes de display
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()

#variavel de controle de leituras
leitura = 0

#Fonte da temperatura: fonte ttf que simula display 7 segmentos, com tamanho 30
font_temp = ImageFont.truetype('ManualDisplay.ttf', 40)

#Fonte da umidade: fonte ttf que simula display 7 segmentos, com tamanho 16
font_umid = ImageFont.truetype('ManualDisplay.ttf', 16)

#Fonte da nebulosidade: fonte ttf que simula display 7 segmentos, com tamanho 16
font_neb = ImageFont.truetype('ManualDisplay.ttf', 16)

#Fonte dos titulos das informacoes
font_titulos = ImageFont.truetype('Minecraftia-Regular.ttf', 8)

while(True):
    try:
        #requisita informacoes da API e faz parser do json, filtrando as informacoes desejadas (temperatura, umidade e nebulosidade
        (temp,umidade,nebulosidade) = le_infos_clima()
        leitura = leitura + 1

        temperatura_str = str(temp)+"C"
        umidade_str = str(umidade)+"%"
        nebulosidade_str = str(nebulosidade)+"%"

        #escreve as informacoes lidas e a cidade referida
        print "Leitura: "+str(leitura)
        print ""
        print "Cidade: "+cidade+","+pais
        print "Temperatura atual: "+temperatura_str
        print "Umidade relativa do ar: "+umidade_str
        print "Nebulosidade: "+nebulosidade_str

   	#Escreve informacoes no display OLED
        draw.text((x, top),    "Clima: "+cidade,  font=font, fill=255)
        draw.text((x, top+15), "Temp",font=font_titulos,fill=255)
        draw.text((x, top+25), temperatura_str, font=font_temp, fill=255)
        draw.text((x+70, top+15), "Umid.",font=font_titulos,fill=255)
        draw.text((x+70, top+25), umidade_str, font=font_umid, fill=255)
        draw.text((x+70, top+40), "Neb.",font=font_titulos,fill=255)
        draw.text((x+70, top+50), nebulosidade_str, font=font_neb, fill=255)

        disp.image(image)
        disp.display()
        time.sleep(90)

	#Limpa display: 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)

Para executar o projeto, basta utilizar o comando abaixo:

python info_clima.py

Em instantes você deve visualizar, no display oled, as informações de tempo conforme mostrado na imagem principal deste post.

Gostou deste post sobre a PocketBeagle e OpenWeatherMap API? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe