Informações de Clima com a Raspberry Pi - MakerHero
Informações de Clima com a Raspberry Pi

Informações de Clima com a Raspberry Pi

Deixe um comentário

Nesta aula, vamos explorar como utilizar a Raspberry Pi para acessar e exibir informações de clima em tempo real. O objetivo é integrar sua placa Raspberry Pi com a API do OpenWeatherMap para obter previsões para os próximos dias. 

O que é uma API para Raspberry Pi?

API é a sigla para “Application Programming Interface” ou, em português, “Interface de Programação de Aplicações”. Basicamente, uma API é um conjunto de regras e definições que permite que diferentes programas de software se comuniquem entre si.

No contexto da Raspberry Pi, uma API pode ser usada para interagir com serviços online, como APIs de clima, APIs de controle de dispositivos IoT, APIs de mapas, entre outras. Por exemplo, se você quiser que sua Raspberry Pi acesse informações meteorológicas, você pode usar uma API de clima. Essa API permitirá que a Raspberry Pi envie uma solicitação para um servidor remoto que fornece dados meteorológicos e receba de volta informações como temperatura, umidade, velocidade do vento, etc.

Como funciona uma API na Raspberry Pi?

Quando você utiliza uma API na placa Raspberry Pi, você geralmente está realizando o seguinte processo:

  • Enviar uma Solicitação (Request): A Raspberry Pi envia uma solicitação para o servidor da API. Esta solicitação é geralmente feita através de um protocolo HTTP, similar ao funcionamento de um navegador de internet.
  • Receber uma Resposta (Response): O servidor da API processa a solicitação e envia uma resposta de volta para a Raspberry Pi. Essa resposta normalmente contém dados em um formato legível por máquina, como JSON (JavaScript Object Notation) ou XML.
  • Processar os Dados: A Raspberry Pi, então, processa os dados recebidos para realizar alguma ação, como exibir informações de clima em um display, enviar notificações ou acionar outros dispositivos.

Por que usar uma API na Raspberry Pi?

  • Automatização: APIs permitem que você crie scripts na Raspberry Pi para automatizar a coleta de dados e a execução de tarefas.
  • Flexibilidade: Com uma API, você pode integrar facilmente sua Raspberry Pi com uma variedade de serviços online, desde informações meteorológicas até controle de dispositivos inteligentes.
  • Aprendizado: Utilizar APIs é uma ótima maneira de aprender sobre programação, redes e comunicação entre dispositivos, temas muito úteis para quem trabalha com IoT (Internet das Coisas).

Informações de Clima com a Raspberry Pi: OpenWeatherMap

O OpenWeatherMap é um serviço popular que fornece informações meteorológicas para qualquer local no mundo, acessíveis por meio de sua API. Nesta aula, vamos usar a API do OpenWeatherMap para recuperar dados de clima em tempo real e exibi-los na Raspberry Pi.

Antes de começarmos a utilizar a API do OpenWeatherMap, é necessário criar uma conta gratuita no site do serviço. Siga os passos abaixo:

  • Acesse o site do OpenWeatherMap: openweathermap.org.
  • Crie uma conta: Preencha suas informações para criar a sua conta.
  • Obtenha sua chave de API: Após criar a conta, vá até o painel de controle e copie a sua chave de API. Esta chave será necessária para autenticar suas solicitações à API.

OpenWeatherMap

Materiais Necessários

Para montar o circuito para obter informações de clima com a Raspberry Pi, vamos precisar dos seguintes materiais:

Circuito para Obter Informações de Clima com a Raspberry Pi

Abaixo está representado o circuito de montagem para obter informações do clima com a placa Raspberry Pi:

Circuito para Obter Informações de Clima com a Raspberry Pi

O circuito montado conforme o esquema ficará como mostrado na figura abaixo:

Circuito para Obter Informações de Clima com a Raspberry Pi

Instalação das Bibliotecas para Obter Informações de Clima com a Raspberry Pi

Para usar um display OLED e o sensor DHT11 com a Raspberry Pi, além de realizar requisições para a API OpenWeatherMap, é necessário instalar algumas bibliotecas específicas.

Antes de instalar qualquer biblioteca, é recomendável atualizar o sistema operacional para garantir que todas as dependências estejam atualizadas. Execute os seguintes comandos no terminal:

sudo apt-get update
sudo apt-get upgrade

Para testar a comunicação I2C e verificar se o display OLED está corretamente conectado, instale as ferramentas I2C:

sudo apt-get install -y i2c-tools

A biblioteca SMBus  é necessária para que o Python se comunique com dispositivos conectados ao barramento I2C:

sudo apt-get install -y python3-smbus

A biblioteca Pillow é necessária para manipulação de imagens e textos para exibição no display OLED:

sudo apt-get install python3-pil

A biblioteca NumPy é utilizada para cálculos e manipulações matemáticas necessárias em diversas bibliotecas:

sudo apt-get install python3-numpy

A biblioteca libgpiod2 fornece acesso à interface de GPIO de dispositivos Linux, necessária para o sensor DHT11:

sudo apt-get install libgpiod2

Para gerenciar as bibliotecas Python de forma isolada, é recomendável criar um ambiente virtual. Primeiro, instale o pacote python3-venv (caso ainda não esteja instalado):

sudo apt-get install python3-venv

Escolha um diretório para o ambiente virtual (por exemplo, myenv) e crie o ambiente com o comando:

python3 -m venv myenv

Ative o ambiente virtual:

source myenv/bin/activate

Após ativar o ambiente virtual, o nome do ambiente aparecerá no prompt do terminal, indicando que o ambiente está ativo.

Com o ambiente virtual ativado, instale as seguintes bibliotecas necessárias para o projeto:

pip3 install adafruit-circuitpython-ssd1306
pip3 install Pillow
pip3 install gpiod
pip3 install requests
pip3 install adafruit-circuitpython-dht

Para melhorar o desempenho do display OLED, especialmente em animações rápidas, ajuste a velocidade do barramento I2C para 1 MHz (padrão pode estar configurado para 100 kHz ou 400 kHz). Edite o arquivo de configuração com o comando:

sudo nano /boot/firmware/config.txt

Adicione a seguinte linha ao final do arquivo:

dtparam=i2c_baudrate=1000000

instalação das Bibliotecas

Use as teclas CTRL+O para salvar e CTRL+X para sair.

Depois de instalar todas as bibliotecas e fazer as configurações necessárias, você pode desativar o ambiente virtual com o comando:

deactivate

Código Python para Obter Informações de Clima com a Raspberry Pi 

Agora você pode criar um script Python para obter as informações de clima com a Raspberry Pi. Crie um arquivo Python com um nome como clima-raspberry-pi.py.

nano clima-raspberry-pi.py

Use o seguinte código:

#Bibliotecas utilizadas
import time
import board
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
import requests
from datetime import datetime
import adafruit_dht

# Definindo a largura e a altura do display OLED
WIDTH = 128
HEIGHT = 64

# Inicializando a interface I2C para comunicação com o display OLED
i2c = busio.I2C(board.SCL, board.SDA)

# Configurando o display OLED usando a biblioteca adafruit_ssd1306
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C)

# Inicializando o sensor DHT11 na porta GPIO 23
dhtDevice = adafruit_dht.DHT11(board.D23)

# Chave da API e cidade para obter a previsão do tempo
API_KEY = 'insira-aqui-sua-chave-da-api'
CITY = 'insira-aqui-o-nome-da-sua-cidade'
BASE_URL = 'http://api.openweathermap.org/data/2.5/forecast'

# Função para obter a previsão do tempo da API OpenWeatherMap
def get_weather_forecast(api_key, city):
    url = f'{BASE_URL}?q={city}&appid={api_key}&lang=pt_br&units=metric'
    try:
        response = requests.get(url)  # Fazendo uma requisição à API
        response.raise_for_status()  # Verificando se houve erro na requisição
        return response.json()  # Retornando os dados da previsão em formato JSON
    except requests.RequestException as e:
        return {"error": str(e)}  # Retornando uma mensagem de erro em caso de falha

# Função para extrair temperaturas máximas e mínimas para os próximos dias
def extract_temperatures(data, num_days=2):
    forecasts = data.get('list', [])
    daily_temperatures = {}
    for forecast in forecasts:
        dt_txt = forecast.get('dt_txt')  # Data e hora da previsão
        temp_max = forecast.get('main', {}).get('temp_max')  # Temperatura máxima
        temp_min = forecast.get('main', {}).get('temp_min')  # Temperatura mínima
        if dt_txt and temp_max is not None and temp_min is not None:
            date = datetime.strptime(dt_txt, '%Y-%m-%d %H:%M:%S').date()  # Convertendo para o formato de data
            if date not in daily_temperatures:
                daily_temperatures2024 = {'temp_max': temp_max, 'temp_min': temp_min}
            else:
                # Atualizando temperaturas máxima e mínima para o mesmo dia
                daily_temperatures2024['temp_max'] = max(daily_temperatures2024['temp_max'], temp_max)
                daily_temperatures2024['temp_min'] = min(daily_temperatures2024['temp_min'], temp_min)
    sorted_dates = sorted(daily_temperatures.keys())  # Ordenando as datas
    result = {date: daily_temperatures2024 for date in sorted_dates[:num_days]}  # Retornando temperaturas para os próximos dias
    return result

# Função para ler dados do sensor DHT11
def read_dht11():
    try:
        temperature_c = dhtDevice.temperature  # Leitura da temperatura
        humidity = dhtDevice.humidity  # Leitura da umidade
        return temperature_c, humidity
    except RuntimeError as error:
        return None, None  # Retornando None em caso de erro de leitura

# Loop principal para atualizar o display OLED
while True:
    weather_data = get_weather_forecast(API_KEY, CITY)  # Obter a previsão do tempo
    temperature_now, humidity_now = read_dht11()  # Obter temperatura e umidade atuais

    oled.fill(0)  # Limpar o display OLED
    image = Image.new("1", (oled.width, oled.height))  # Criar uma nova imagem em preto e branco
    draw = ImageDraw.Draw(image)  # Criar um objeto de desenho para a imagem
    fonte = ImageFont.load_default()  # Carregar a fonte padrão

    if 'error' in weather_data:
        draw.text((0, 0), weather_data['error'], font=fonte, fill=255)  # Exibir mensagem de erro no display
    else:
        temperatures = extract_temperatures(weather_data, num_days=2)  # Extrair temperaturas para os próximos 2 dias
        y_position = 0
        draw.text((0, y_position), f"Agora", font=fonte, fill=255)  # Exibir "Agora" para as leituras atuais
        y_position += 10
        if temperature_now is not None and humidity_now is not None:
            draw.text((0, y_position), f"Temp: {int(temperature_now)}C Umi: {humidity_now}%", font=fonte, fill=255)  # Exibir temperatura e umidade atuais
        else:
            draw.text((0, y_position), "Erro na leitura DHT11", font=fonte, fill=255)  # Exibir mensagem de erro de leitura do DHT11
        y_position += 10

        for date, temps in temperatures.items():
            formatted_date = date.strftime('%d/%m')  # Formatar a data
            draw.text((0, y_position), formatted_date, font=fonte, fill=255)  # Exibir a data
            y_position += 10
            draw.text((0, y_position), f"Max: {int(temps['temp_max'])} C Min: {int(temps['temp_min'])} C", font=fonte, fill=255)  # Exibir temperaturas máxima e mínima
            y_position += 10
            if y_position > HEIGHT - 10:  # Verificar se há espaço suficiente para exibir mais dados
                break

    oled.image(image)  # Transferir a imagem para o display OLED
    oled.show()  # Atualizar o display OLED
    time.sleep(600)  # Esperar 10 minutos antes de atualizar novamente

Altere as linhas 14 e 15 com sua chave da API e o nome da sua cidade.

Depois de colar o código no nano, pressione Ctrl+O para salvar e Enter para confirmar. Finalmente, saia do editor com Ctrl+X.

Agora ative novamente o ambiente virtual com o seguinte comando:

source myenv/bin/activate

Por fim, use o seguinte comando para executar o programa Python:

python3 clima-raspberry-pi.py

Após executar o código, o display OLED exibirá a temperatura e umidade atuais lidas do sensor DHT11, seguidas pela previsão do tempo dos próximos dois dias, incluindo as temperaturas máximas e mínimas para a cidade especificada.

display OLED exibirá a temperatura e umidade

Informações de Clima com a Raspberry Pi: Possíveis Erros

Ao trabalhar com uma API na placa Raspberry Pi, alguns erros comuns podem ocorrer, como:

  • Erro de Conexão com a Internet: Verifique se a Raspberry Pi está conectada à Internet. Teste a conexão tentando acessar um site no navegador ou pings para servidores externos.
  • Erro na Chave da API: Certifique-se de copiar e colar a chave da API corretamente no código. Verifique se a chave está ativa e válida no painel de controle do OpenWeatherMap.
  • Nome da Cidade Incorreto: Verifique o nome da cidade no código e garanta que esteja correto e em conformidade com o formato esperado pela API.
  • Erro de Formatação dos Dados: Verifique a documentação da API para garantir que você está acessando e processando os dados corretamente. Adapte o código para corresponder ao formato atual dos dados retornados pela API.
  • Problemas com o Display OLED: Verifique todas as conexões físicas entre o display e a Raspberry Pi. Certifique-se de que a biblioteca e os parâmetros do display OLED estão corretamente configurados no código.
  • Erro no Sensor DHT11: Verifique as conexões do sensor DHT11 e certifique-se de que está corretamente instalado. Teste o sensor com um script simples para confirmar se está funcionando corretamente.
  • Erros no Ambiente Virtual: Certifique-se de ativar o ambiente virtual antes de instalar bibliotecas. Verifique se todas as bibliotecas necessárias estão instaladas e atualizadas.
  • Erros de Permissão: Use sudo para executar comandos que requerem permissões administrativas. Verifique se você tem permissões suficientes para acessar arquivos e dispositivos necessários

Faça seu comentário

Acesse sua conta e participe