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

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.

Faça seu comentário

Acesse sua conta e participe

7 Comentários

  1. Pedro, tudo bem? Não estou conseguindo rodar :/

    Fiz todos os passos certinho, porém recebo sempre o mesmo erro:

    Traceback (most recent call last):
    File “display.py”, line 83, in
    disp.begin()
    File “/usr/local/lib/python2.7/dist-packages/Adafruit_SSD1306/SSD1306.py”, line 148, in begin
    self._initialize()
    File “/usr/local/lib/python2.7/dist-packages/Adafruit_SSD1306/SSD1306.py”, line 247, in _initialize
    self.command(SSD1306_DISPLAYOFF) # 0xAE
    File “/usr/local/lib/python2.7/dist-packages/Adafruit_SSD1306/SSD1306.py”, line 129, in command
    self._i2c.write8(control, c)
    File “/usr/local/lib/python2.7/dist-packages/Adafruit_GPIO/I2C.py”, line 114, in write8
    self._bus.write_byte_data(self._address, register, value)
    File “/usr/local/lib/python2.7/dist-packages/Adafruit_PureIO/smbus.py”, line 256, in write_byte_data
    self._device.write(data)
    IOError: [Errno 121] Remote I/O error

    1. Aparentemente, uma das duas coisas aconteceu:

      – algo deu errado com a instalação da biblioteca python-smbus
      – você esqueceu de habilitar a I²C no raspi-config

      Verifique se você habilitou a I²C, reinstale a biblioteca python-smbus e tente novamente. Fique atento se alguma mensagem de erro aparece ao instalar a biblioteca python-smbus.

  2. Bom trabalho Pedro.
    Estou procurando alguém para desenvolver um projeto com a raspberry zero e, de um terminal tela touché, para ser usado em rede Modbus com PLC mestre.
    Preciso que tenha 10 I/OS.
    POIS tenho sensores e controle de motor. Vc.
    Você topa um desafio.

    1. Angelo, obrigado pelo elogio.

      Agradeço o convite mas, infelizmente, eu não tenho disponibilidade no momento para trabalhar como free-lancer.

      Atenciosamente,
      Pedro Bertoleti

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

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