Ao ler o artigo Informações do clima com o PocketBeagle e OpenweatherMap, de Pedro Bertoleti, imediatamente me veio a ideia de fazer uma versão com o Raspberry Pi Zero W, que permite conexão à internet via WiFi. Vamos aproveitar e conectar um sensor de temperatura, para termos a temperatura local e usar as informações do OpenweatherMap para determinar a previsão de mínima e máxima. Assim você consegue obter informações de clima com Raspberry Pi.
Material Necessário
- Raspberry Pi Zero W
Com o Raspbian Stretch Lite instalado e configurado (as instruções estão no site www.raspberrypi.org). Devem estar configurados o WiFi e o fuso horário. Habilite a interface I2C e o acesso via SSH (você pode também conectar um teclado e monitor, mas para isto precisará dos respectivos adaptadores).
- Barra de pinos 2×40 180 graus
- Display OLED I2C de 0,96 polegadas
- Sensor de temperatura DHT11
- Jumpers femea / fêmea
Montagem
O primeiro passo é soldar a barra de pinos no Raspberry Pi Zero W. O esquema abaixo mostra as conexões a serem feitas:
Atenção: Existem variações de pinagem para o display e para o sensor. No caso do display, preste atenção nas indicações dos sinais impressas na placa. Já o sensor DHT11 é encontrado nas versões com 3 e 4 pinos. A figura mostra o sensor com 3 pinos (dado, Vcc e Gnd); na versão de 4 pinos a ordem dos sinais costuma ser Vcc, dados, não conectado e Gnd.
Preparativos para a Aplicação
Você vai precisar se cadastrar no OpenweatherMap para receber uma API key, os detalhes estão no artigo do Pedro Bertoleti. Com o OpenWeatherMap podemos obter informações de clima com Raspberry Pi.
Vamos usar várias bibliotecas na nossa aplicação. Para facilitar eu criei um script, que será baixado diretamente do Github para o Raspberry.
Se log no Raspberry através do SSH e execute os comandos abaixo:
sudo apt-get update sudo apt-get install git git clone https://github.com/dquadros/Clima.git cd Clima chmod +x instala.sh sudo ./instala.sh
Este ultimo comando será bastante demorado e solicitará algumas confirmações. Ao final todas as bibliotecas necessárias estarão instaladas. São instaladas também as fontes de caracteres utilizadas no display.
Aplicação clima com Raspberry Pi em Python
A aplicação foi desenvolvida em Python e é basicamente um loop, com as informações de temperatura e clima com Raspberry Pi sendo consultadas periodicamente. O sensor de temperatura é lido a cada minuto. A consulta ao clima com Raspberry Pi é feita a cada 10 minutos.
A consulta utilizada é de previsão de tempo pelo código da cidade. Consulte o site do OpenweatherMap para obter o código da sua cidade. A previsão de tempo possui informações sobre a condição atual e previsões para os próximos 5 dias, quebrada em períodos de 3 horas. A aplicação extrai o código do ícone da condição atual e determina a temperatura mínima e máxima nas próximas 24 horas.
Segue abaixo o código completo:
# Informacoes de clima no Raspberry Pi Zero # com sensor DHT11 e display OLED I2C 128x64 import Adafruit_SSD1306 import Adafruit_DHT import requests import json import time from PIL import Image from PIL import ImageDraw from PIL import ImageFont #Iniciacao sensor sensor = Adafruit_DHT.DHT11 pino_sensor = 25 #Iniciacoes de display disp = Adafruit_SSD1306.SSD1306_128_64(rst=None, i2c_address=0x3c, i2c_bus=1) disp.begin() disp.clear() disp.display() width = disp.width height = disp.height image = Image.new('1', (width, height)) #imagem binaria draw = ImageDraw.Draw(image) #Fontes para os caracteres font = ImageFont.load_default() font8 = ImageFont.truetype('Minecraftia-Regular.ttf', 8) font16 = ImageFont.truetype('ManualDisplay.ttf', 16) font40 = ImageFont.truetype('ManualDisplay.ttf', 40) #Icones de tempo icon_sol = Image.open("01d.png") icon_lua = Image.open("01n.png") icon_nuvem = Image.open("02.png") icon_chuva = Image.open("09.png") icon_tempes = Image.open("11.png") icon_nevoa = Image.open("50.png") #Posicoes das informacoes na tela top = 2 col1 = 2 col2 = 72 col3 = 96 #Informacoes do clima def le_infos_clima(): #coloque aqui a sua chave e o id da sua cidade api_key_openweather = "minha chave" cidade_id = "3448439" url_http_req = "http://api.openweathermap.org/data/2.5/forecast?id="+cidade_id+"&appid="+api_key_openweather dados = requests.get(url_http_req).json() #extrai as informacoes cidade = dados["city"]["name"] lista = dados["list"] icon_id = lista[0]["weather"][0]["icon"] if icon_id == "01d": icon = icon_sol elif icon_id == "01n": icon = icon_lua elif icon_id in ["02d", "02n", "03d", "03n", "04d", "04n"]: icon = icon_nuvem elif icon_id in ["09d", "09n", "10d", "10n"]: icon = icon_chuva elif icon_id in ["11d", "11n"]: icon = icon_tempes elif icon_id in ["50d", "50n"]: icon = icon_nevoa else: icon = None min = 999.0 max = 0.0 for i in range(8): temp = float(lista[i]["main"]["temp_min"]) if temp < min: min = temp temp = float(lista[i]["main"]["temp_max"]) if temp > max: max = temp min = min - 273.15 max = max - 273.15 return cidade,icon,int(min),int(max) prox_consulta = time.time() temp = "" while(True): try: #Atualizar as informacoes if time.time() > prox_consulta: (cidade,icon,min,max) = le_infos_clima() prox_consulta = time.time()+610 # maximo eh 1 consulta cada 10 minutos agora = time.localtime() hora = "{0:02d}:{1:02d}".format(agora.tm_hour, agora.tm_min) (umid, new_temp) = Adafruit_DHT.read_retry(sensor, pino_sensor); if not new_temp is None: temp = str(int(new_temp)) + "C" #Escreve informacoes no display OLED draw.text((col1, top), cidade, font=font, fill=255) draw.text((col3, top), hora, font=font, fill=255) draw.text((col1, top+15), "Temp",font=font8,fill=255) draw.text((col1, top+25), temp, font=font40, fill=255) if not icon is None: image.paste(icon,(col2, top+15)) draw.text((col2, top+41), "Min",font=font8,fill=255) draw.text((col2, top+50), str(min)+"C", font=font16, fill=255) draw.text((col3, top+41), "Max",font=font8,fill=255) draw.text((col3, top+50), str(max)+"C",font=font16, fill=255) disp.image(image) disp.display() time.sleep(60) #Limpa display: desenha um retangulo preto em todo o #display draw.rectangle((0,0,width,height), outline=0, fill=0) except KeyboardInterrupt: exit(1)
Se você quiser deixar a aplicação rodando direto (inclusive depois de ter desconectado o ssh), você pode usar
nohup sudo python clima.py
Gostou? Nos ajude a melhorar o blog comentando abaixo sobre este tutorial.
Boa Noite!
Estou com um erro sobre as fontes, executei os comando conforme descritos no terminal server.
Estou usando o Thonny, mas usei o IDLE 2.7 e gerou o mesmo erro. Salvei o código executavel na pasta Clima e mesmo assim ocorre o erro.
Traceback (most recent call last):
File “/home/pi/Clima/clima-pi3.py”, line 34, in
font8 = ImageFont.truetype(‘Minecraftia-Regular.ttf’, 8)
File “/usr/lib/python3/dist-packages/PIL/ImageFont.py”, line 238, in truetype
return FreeTypeFont(font, size, index, encoding)
File “/usr/lib/python3/dist-packages/PIL/ImageFont.py”, line 127, in __init__
self.font = core.getfont(font, size, index, encoding)
OSError: cannot open resource
Agradeço se ajudar a resolver, pois esse não consegui ainda!
Como faço para executar usando python 3?
Vou ter que examinar isto. Acho que o meu código deve funcionar no Python 3, o problema é conferir se as várias bibliotecas usadas estão disponíveis para o Python 3 e acertar os comandos de instalação.
Posso usar esse projeto em um Raspberry 3 Model B
Olá Adamo!
É possível sim.
Abraços!
André Rocha – Equipe MakerHero
Você pode seguir exatamente como está no tutorial (exceto por soldar os pinos no Raspberry Pi, pois o Pi e já vem com os pinos soldados). Não há nada específico ao Raspberry Pi Zero.
como faço para iniciar a aplicação no PItft dislpay??
Olá, montei o projeto Informações de Clima com Raspberry Pi Zero W e gostaria de deixá-lo autoexecutável na inicialização do Raspberry Pi.
Editei o arquivo /etc/rc.local com a seguinte linha: sudo python /home/pi/Clima/clima.py
dei permissão de execução com chmod 775 clima.py
mas o programa não roda na inicialização do Raspberry Pizero.
Não consigo encontrar o erro. O que pode mais ser feito?
Moises, talvez seja mais fácil você executar como um service, semelhante ao mostrado em https://www.makerhero.com/blog/agendamento-de-tarefas-no-linux-raspberry-pi-zero-w/
Vocês teriam algum case para este projeto?
Olá Alberto!
Você pode usar a case da pi zero
Abraços!
André – Equipe MakerHero
Tenho uma sugestão 🙂
Pq vcs não colocam um botão: comprar todo material necessário… e até dando um desconto para o pacote?
Olá Alexandre!
Vamos sugerir aqui!
Abraços!
André – Equipe MakerHero