Informações de Clima com Raspberry Pi Zero W 13

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.

Clima com Raspberry Pi Zero W

Material Necessário

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

Montagem

O primeiro passo é soldar a barra de pinos no Raspberry Pi Zero W. O esquema abaixo mostra as conexões a serem feitas:

Circuito do projeto

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.

Montagem do projeto

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.

Faça seu comentário

Acesse sua conta e participe

13 Comentários

  1. 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!

  2. Como faço para executar usando python 3?

    1. 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.

  3. Posso usar esse projeto em um Raspberry 3 Model B

    1. Olá Adamo!

      É possível sim.

      Abraços!

      André Rocha – Equipe MakerHero

    2. 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.

  4. como faço para iniciar a aplicação no PItft dislpay??

  5. 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?

    1. 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/

  6. Vocês teriam algum case para este projeto?

    1. Olá Alberto!

      Você pode usar a case da pi zero:

      https://www.makerhero.com/produto/case-raspberry-pi-zero-oficial/

      Abraços!

      André – Equipe MakerHero

  7. 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?

    1. Olá Alexandre!

      Vamos sugerir aqui!

      Abraços!

      André – Equipe MakerHero