Informações da CPU da Raspberry Pi Zero W com display OLED 3

Aos que acompanham os últimos lançamentos das placas de desenvolvimento de sistemas embarcados, sobretudo às da linha Raspberry Pi, uma coisa ficou clara: a Raspberry Pi Zero W é uma das placas da linha mais impressionantes, dada seu reduzido tamanho físico, conectividade, versatilidade de aplicação e preço baixo (em relação a outras placa da mesma linha). São praticamente infinitas as aplicações com ela. Desde uso como computador pessoal simples, central de jogos até projetos robustos com Linux embarcado e IoT. E neste post, vamos explicar como mostrar as informações da CPU da Raspberry Pi Zero W com display OLED 0.96″.

Informações de CPU da Raspberry Pi Zero W

E o que será mostrado? Com tanto uso, é importante monitorar informações de sua placa em tempo real, incluindo àquelas que mostram a “saúde” da mesma, tais como temperatura da CPU, frequência da CPU e uso percentual.

Material necessário

Para fazer este projeto, você precisará de:

 

Preparação: habilitar uso do I²C na Raspberry Pi Zero W

A primeira coisa a ser feita é habilitar o uso do I²C na Raspberry Pi Zero W. Para fazer isso, siga o procedimento abaixo:

  1. Em algum terminal Linux da Raspberry (seja por acesso SSH ou local), execute o seguinte comando:
    sudo raspi-config
  2. Na tela que aparecer, vá até Advanced Options (utilize as setas para cima e para baixo para navegar nas opções e a tecla Enter para selecionar a opção desejada).
  3. Em Advanced Options, selecione a opção I2C.
  4. Selecione a opção Enable.
  5. O I²C está habilitado. Para voltar ao terminal  / sair da configuração, selecione a opção Finish.

Preparação: baixar bibliotecas para o display OLED

Para baixar as bibliotecas necessárias para utilizar o display OLED na Raspberry Pi, execute (na ordem informada) os comandos abaixo no terminal. É necessário aqui que sua Raspberry Pi Zero W tenha acesso à Internet.

sudo apt-get update
sudo apt-get install build-essential python-dev python-pip
sudo pip install RPi.GPIO
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: baixar fonte TTF para display

No projeto, irá ser utilizada para exibição de informações no display uma fonte TTF que simula um display de 7 segmentos. O resultado final fica bem bacana! Para isso, faça o seguinte procedimento:

  1. Acessando a Raspberry PI Zero W (com interface gráfica, ou seja, utilizando-a como um computador), baixe o arquivo compactado da fonte clicando aqui.
  2. Descompacte o arquivo em qualquer pasta da sua Raspberry PI Zero W.
  3. Na pasta em que ficará o projeto, coloque somente o arquivo .TTF (advanced_pixel_lcd-7.ttf)

Se quiser outras fontes, esse site tem um monte delas. É só escolher, baixar e usar!

Preparação: biblioteca PSUTIL

A biblioteca PSUTIL é uma biblioteca Python capaz de obter informações do computador ao qual está rodando (no nosso caso, na Raspberry PI).  As informações possíveis de serem obtidas são diversas:  uso de CPU, uso de disco, memória RAM utilizada e livre, usuários logados e muito mais. Para mais informações sobre ela, visite este site.

Para instala-la na Raspberry PI Zero W, utilize o comando abaixo:

sudo pip install psutil

Circuito esquemático Raspberry Pi Zero W com display Oled

Veja abaixo o circuito esquemático do projeto.

Circuito Raspberry Pi Zero W com display OLED
Figura 1 – circuito esquemático do projeto

Código-fonte

Abaixo está o código-fonte do projeto que mostra as informações da CPU da Raspberry Pi Zero W com display OLED:

import time
import Adafruit_SSD1306
import Image
import ImageDraw
import ImageFont
import subprocess
import psutil

#Variaveis globais
# Raspberry Pi - configuracao dos pinos:
RST = 24 #embora nao utilizado de fato, eh preciso defini-lo para a biblioteca funcionar

# Configura uso do display OLED de 128x64 (comunicacao I2C)
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)


#Funcao: escreve uma informacao (e seu titulo / classificacao) no display OLED
#Parametros: Informacao e seu titulo e informacoes do display
#Retorno: nenhum
def EscreveInformacaoDisplayOLED(TituloInformacao,Informacao,draw,width,height):
    global image

    #desenha um retangulo preto em todo o display (garante que o display sera apagado)
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    #Fonte do titulo: fonte ttf que simula display 7 segmentos, com tamanho 8
    font_titulo = ImageFont.truetype('advanced_pixel_lcd-7.ttf', 8)

    #Fonte da informacao: fonte ttf que simula display 7 segmentos, com tamanho 12
    font_info = ImageFont.truetype('advanced_pixel_lcd-7.ttf', 16)

	
    #escreve titulo da informacao e informacao
    top = 10
    draw.text((0, top), TituloInformacao, font=font_titulo, fill=255)
    draw.text((0, top+40), Informacao, font=font_info, fill=255)

    #atualiza buffer do display com informacoes a serem escritas
    disp.image(image)
    disp.display()
    return

#Funcao: obtem frequencia do processador e a escreve no display
#Parametros: informacoes do display
#Retorno: nenhum
def FreqProcessador(draw, width, height):
    #obtem informacao da freq do processador
    cpuinfo_cur_freq = "cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq"
    cpufreq = subprocess.check_output(cpuinfo_cur_freq, shell=True)
    cpufreqGhz = str(float(cpufreq)/1000000)+"GHz"
    print "Frequencia do processador: "+cpufreqGhz
    EscreveInformacaoDisplayOLED("Frequencia",cpufreqGhz,draw,width,height)
    return

#Funcao: obtem temperatura do processador e a escreve no display
#Parametros: informacoes do display
#Retorno: nenhum
def TempProcessador(draw, width, height):
    #obtem informacao da freq do processador
    cur_tempcpu = "cat /sys/class/thermal/thermal_zone0/temp"
    tempcpu = subprocess.check_output(cur_tempcpu, shell=True)
    cputempCelsius = str(float(tempcpu)/1000)+"C"
    print "Temperatura do processador: "+cputempCelsius
    EscreveInformacaoDisplayOLED("Temperatura",cputempCelsius,draw,width,height)
    return

#Funcao: obtem uso percentual da CPU e o escreve no display
#Parametros: informacoes do display
#Retorno: nenhum
def UsoCPU(draw, width, height):
    #obtem informacao da freq do processador
    cur_uso_cpu = psutil.cpu_percent()
    uso_cpu_percentual = str(cur_uso_cpu)+"%"
    print "Uso percentual da CPU: "+uso_cpu_percentual
    EscreveInformacaoDisplayOLED("Uso de CPU",uso_cpu_percentual,draw,width,height)
    return
	
	
#------------------------------------------------------
#   PROGRAMA PRINCIPAL Display Oled com Raspberry Pi
#------------------------------------------------------
#Inicializa biblioteca de comunicacao com display e o limpa
disp.begin()
disp.clear()
disp.display()

#obtem altura e largura totais do display
width = disp.width
height = disp.height

#Preparacoes necessarias para apagar e desenhar na tela
image = Image.new('1', (width, height)) #imagem binaria (somente 1's e 0's)
draw = ImageDraw.Draw(image)

#laco principal
while True:
	#Mostra a frequencia do processador por 3 segundos
        FreqProcessador(draw,width,height)
	time.sleep(3)

	#Mostra a temperatura do processador por 3 segundos
	TempProcessador(draw,width,height)
	time.sleep(3)

	#Mostra o uso percentual da CPU por 3 segundos
        UsoCPU(draw,width,height)
	time.sleep(3)

Salve este código-fonte como InfoDispOLED.py e rode-o com o seguinte comando:

sudo python InfoDispOLED.py

Projeto em ação!

Abaixo você confere o projeto do monitor de informações da Raspberry Pi Zero W com display OLED em ação.

Gostou deste post sobre Raspberry Pi Zero W com display OLED? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

3 Comentários

  1. Olá, gostaria de saber se fica muito complicado mostrar outras informações, como o status da conexão via Eth0 e Eth1 (no meu caso, possuo uma placa de rede na USB)

    1. Edmilson, boa tarde.

      Infelizmente esse tipo de informação nunca precisei ler, portanto não sei te responder como obtê-las.

      Atenciosamente,
      Pedro Bertoleti

  2. Olá, tenho um projeto em que preciso monitorar os 4 núcleos do raspberry . Você pode me indicar um projeto?
    Obrigado.

    Marco Antônio Gomes