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.
Material necessário
Para fazer este projeto, você precisará do seguinte material:
- Uma PocketBeagle Board
É FUNDAMENTAL que ela já esteja funcional, ou seja: com cartão SD contendo imagem gravada e que consiga acessar a internet pela USB (conforme ensinamos em Acessar a Internet na PocketBeagle) - Um cabo micro-USB
- Um display OLED I²C de tamanho 0.96″ (da cor de sua escolha)
- Jumpers fêmea-fêmea
- Duas barras de pinos 2×40 180 graus
- Material para soldar (ferro de solda, estanho, etc.)
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.
Para utilizar esta API no projeto em questão, siga o procedimento abaixo:
- Acesse este site e crie sua conta no site OpenWeatherMap.
- Uma vez criada a conta, faça o login na mesma por este link.
- Ao logar, você será direcionado Às configurações de sua conta. Nesta tela, clique sobre o link API Keys
- Copie a API Key exibida (no campo “Key” da tela que surgir) e guarde-a (ela será necessária neste projeto)
- 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.
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:
- Baixe as fontes TTF clicando aqui e aqui. Descompacte os arquivos baixados em um local conhecido / de fácil acesso no seu computador.
- 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”)
- 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.