Informações de Clima com a Raspberry Pi
Deixe um comentárioNesta 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.
Materiais Necessários
Para montar o circuito para obter informações de clima com a Raspberry Pi, vamos precisar dos seguintes materiais:
- Raspberry Pi 5 (ou qualquer outra placa Raspberry Pi)
- Display OLED 0.96″ 128×64 I2C
- Sensor de Umidade e Temperatura DHT11
- Resistor 10kΩ
- Protoboard
- Jumpers Macho-Fêmea
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:
O circuito montado conforme o esquema ficará como mostrado na figura abaixo:
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
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.
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