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″.
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:
- Uma placa Raspberry Pi Zero W
- Uma fonte para Raspberry Pi (recomendado: 5V/2A)
- Um display I²C OLED 0.96″ (da cor que você quiser)
- Barra de pinos 2×40 180 graus
- Jumpers fêmea-fêmea
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:
- Em algum terminal Linux da Raspberry (seja por acesso SSH ou local), execute o seguinte comando:
sudo raspi-config
- 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).
- Em Advanced Options, selecione a opção I2C.
- Selecione a opção Enable.
- 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:
- 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.
- Descompacte o arquivo em qualquer pasta da sua Raspberry PI Zero W.
- 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.
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.
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
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.
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.
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
Olá, tenho um projeto em que preciso monitorar os 4 núcleos do raspberry . Você pode me indicar um projeto?
Obrigado.
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)
Edmilson, boa tarde.
Infelizmente esse tipo de informação nunca precisei ler, portanto não sei te responder como obtê-las.
Atenciosamente,
Pedro Bertoleti