Pular para o conteúdo principal

Electron para reTerminal

pir

Introdução

Este wiki explica como criar sua própria interface de usuário usando Electron. Electron é um framework de código aberto para criar aplicativos nativos de desktop (Windows, Mac, Linux) com tecnologias web como HTML, CSS e JavaScript. Isso significa que, se você consegue criar um site, você consegue criar um aplicativo de desktop!

Seguindo o guia abaixo, você será capaz de criar um aplicativo para controlar os pinos GPIO no reTerminal apenas clicando em botões no LCD. Então vamos começar!

Preparar Ambiente de Desenvolvimento

No reTerminal

Primeiro, vamos instalar Node.js junto com npm no reTerminal. npm é um gerenciador de pacotes para pacotes Node.js.

  • Passo 1. Acesse o reTerminal usando o LCD integrado, display externo ou SSH conforme explicado aqui

  • Passo 2. Atualize os pacotes

sudo apt update
sudo apt full-upgrade
  • Passo 3. Baixe o script para instalar o Node.js
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
  • Passo 4. Instale o Node.js
sudo apt install -y nodejs

Node.js agora está instalado no reTerminal. Para verificar se a instalação foi bem-sucedida, execute os seguintes comandos para verificar a versão do Node.js e do npm

node -v
npm -v

pir

No PC Host

Agora, vamos configurar o Microsoft Visual Studio Code para o nosso desenvolvimento.

Nota: Baixe o instalador que seja adequado para o seu sistema operacional

  • Passo 2. Clique na guia Extensions no menu de navegação à esquerda e digite remote development na caixa de pesquisa

pir

  • Passo 3. Selecione Remote Development e clique em Install

  • Passo 4. Pressione F1 no teclado, digite ssh e selecione Remote-SSH:Connect to Host...

pir

  • Passo 5. Digite o seguinte

Nota: pi é o nome de usuário e 192.xxx.xx.xx é o endereço IP do reTerminal

  • Passo 6. Insira a senha para o usuário

Agora você fez login com sucesso no reTerminal usando SSH e concluiu com êxito a preparação do ambiente de desenvolvimento

Aplicativo Electron Smart Light

Agora vamos criar um Aplicativo Electron Smart Light que pode ser usado para controlar o GPIO no reTerminal pressionando botões no LCD. Você pode então conectar relés ao GPIO e controlar também eletrodomésticos!

Conexões de Hardware

Nós conectaremos um LED ao GPIO 24 do reTerminal para fins de teste. Depois você pode adicionar um relé e controlar eletrodomésticos usando o GPIO!

pir

Nota: É necessário um resistor entre o pino GPIO e o LED, caso contrário o LED queimará.

Criar e Inicializar o Aplicativo

  • Passo 1. Abra o VSCode no PC Host e faça login no reTerminal via SSH conforme explicado anteriormente

  • Passo 2. Navegue até File > Open Folder... e selecione uma pasta de sua preferência no reTerminal

pir

  • Passo 3. Crie uma nova pasta e dê um nome a ela

pir

pir

  • Passo 4. Navegue até Terminal > New Terminal e navegue até a pasta recém-criada

pir

Nota: Aqui usamos cd para mudar o diretório

  • Passo 5. Digite o seguinte dentro desta janela de terminal para criar um arquivo package.json com as configurações necessárias para o nosso app Node.js
npm init

Nota: Continue pressionando ENTER para usar os valores padrão das respostas, mas defina o entry point: (index.js) como main.js e test command: como electron .(Use um espaço e um ponto depois de electron)

pir

Se você quiser alterar as configurações mais tarde, você pode acessar o arquivo package.json dentro da nossa pasta principal do aplicativo

pir

  • Passo 6. No terminal dentro do VSCode, digite o seguinte para instalar o Electron
npm install --save-dev electron

Você verá a seguinte saída se o Electron for instalado com sucesso

pir

Você também verá a pasta node_modules gerada com os pacotes necessários para executar o Electron

pir

Instalar módulo npm onoff

O módulo npm onoff permite acessar e controlar o GPIO no reTerminal usando o aplicativo Electron

  • Passo 1. Abra uma janela de terminal dentro do VSCode conforme explicado anteriormente e navegue até o nosso diretório principal do aplicativo

  • Passo 2. Digite o seguinte para instalar o módulo npm onoff

npm install onoff

Instalar e Executar módulo npm electron-rebuild

O módulo npm electron-rebuild recompila módulos nativos Node.js com a versão do Node.js que o seu projeto Electron está usando. Isso permite que você use módulos nativos Node.js em aplicativos Electron sem que a versão do Node.js do seu sistema corresponda exatamente (o que muitas vezes não é o caso e, às vezes, nem mesmo é possível)

  • Passo 1. Instale o módulo npm electron-rebuild
npm install --save-dev electron-rebuild
  • Passo 2. Execute o electron-rebuild
./node_modules/.bin/electron-rebuild

Nota: Sempre que você instalar um novo pacote npm, execute novamente o electron-rebuild

Criar o HTML (UI Básica)

Usaremos o arquivo HTML para criar a interface de usuário básica sem qualquer estilo. Este arquivo HTML é responsável por exibir os elementos da UI na tela.

Dentro do nosso diretório principal do aplicativo, crie um novo arquivo chamado index.html e copie os seguintes códigos

<!doctype html>
<html>
<head>
<!-- Specify the character encoding for the HTML document -->
<meta charset="UTF-8">
<!-- App title bar -->
<title>Test Application</title>
<!-- Load the material icons api -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<!-- Load the google fonts api -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<!-- Load style.css with UI styling -->
<link rel="stylesheet" href="style.css">
<!-- Embed JavaScript code -->
<script>
// Load ipcRenderer module
const { ipcRenderer } = require('electron');
// Function to turn ON the GPIO on button press
function buttonclick1()
{
// This will send 1 as a message to the main process with "msg" as the channel name
ipcRenderer.send("msg1",1)
}

// Function to turn OFF the GPIO on button press
function buttonclick2()
{
ipcRenderer.send("msg2",0)
}

// Function to close the app on button press
function buttonclick3()
{
ipcRenderer.send("close-me")
}
</script>
</head>
<body>
<!-- Application close button -->
<button class="button3" onclick="buttonclick3()">X</button>
<br>
<!-- Application heading -->
<h1>SMART LAMP</h1>
<!-- Lightbulb icon from the material icons api -->
<i class="material-icons">lightbulb</i>
<br>
<!-- Empty lines -->
<br>
<!-- ON button with class attribute for styling
and onclick attribute for button click event -->
<button class="button1" onclick="buttonclick1()">ON</button>
<br>
<button class="button2" onclick="buttonclick2()">OFF</button>
</body>
</html>

Nota: O módulo ipcRenderer é um EventEmitter. Ele fornece alguns métodos para que você possa enviar mensagens do processo de renderização (página web - html/css) para o processo principal (main.js). Você também pode receber respostas do processo principal.

Agora terminamos de criar o arquivo HTML.

Execute npm test para ver a seguinte saída

pir

Criar o CSS (Estilização)

Usaremos o arquivo CSS para adicionar diferentes estilos à interface de usuário criada usando o arquivo HTML

Dentro do nosso diretório principal do aplicativo, crie um novo arquivo chamado style.css e copie os seguintes códigos

/* Styling for the body of the app */
body {
background-color: rgb(141, 141, 141);
}

/* Styling for heading of the app */
h1 {
font-size: 60px;
text-align: center;
font-family: "Roboto", "Courier New", monospace;
color: rgb(255, 255, 255);
}

/* Styling for the light bulb */
.material-icons{
font-size: 250px;
color: rgb(204, 202, 71);
display: flex;
justify-content: center;
}

/* Styling for the ON button */
.button1 {
display: inline-block;
padding: 15px 25px;
font-size: 35px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(76, 175, 80);
border: none;
border-radius: 15px;
width: 20%;
margin:auto;
display:grid;
}

/* Button press effect for ON button */
.button1:active {
box-shadow: 0 5px rgb(104, 99, 99);
transform: translateY(4px);
}

/* Hover effect for ON button */
.button1:hover {background-color: rgb(62, 142, 65)}

/* Styling for OFF button */
.button2 {
display: inline-block;
padding: 15px 25px;
font-size: 35px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(207, 85, 85);
border: none;
border-radius: 15px;
width: 20%;
margin:auto;
display:grid;
}

/* Button press effect for OFF button */
.button2:active {
box-shadow: 0 5px rgb(104, 99, 99);
transform: translateY(4px);
}

/* Hover effect for OFF button */
.button2:hover {background-color: rgb(179, 44, 44)}

/* Styling for Close button */
.button3 {
padding: 8px 25px;
font-size: 20px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(179, 44, 44);
border: none;
width: 6%;
margin:auto;
display:grid;
float: right;
}

A saída final do aplicativo será a seguinte

pir

Criar o Javascript (Carregar e Executar o App)

Vamos usar o arquivo Javascript para criar a janela do aplicativo, carregar o arquivo HTML e adicionar a funcionalidade de GPIO.

Dentro do nosso diretório principal do app, crie um novo arquivo chamado main.js e copie os seguintes códigos

var Gpio = require('onoff').Gpio; //include onoff module to interact with the GPIO
var LED = new Gpio(24, 'out'); //initialize GPIO 24 as an output

// Include app, BrowserWindow and ipcMain module
const { app, BrowserWindow, ipcMain } = require('electron')
/* Use ipcMain module to receive the messages from the ipcRenderer module and
turn ON the GPIO*/
ipcMain.on("msg1",(event,data)=>{
LED.writeSync(data);
})

/* Use ipcMain module to receive the messages from the ipcRenderer module and
turn OFF the GPIO */
ipcMain.on("msg2",(event,data)=>{
LED.writeSync(data);
})

/* Use ipcMain module to receive the messages from the ipcRenderer module and
close the app */
ipcMain.on("close-me", (event, arg) => {
app.quit()
})

// Create application window
app.on('ready', function() {
var mainWindow = new BrowserWindow({
// Make the app fullscreen
"fullscreen": true,
webPreferences: {
// enable the communication between the main and rendered process
nodeIntegration: true,
contextIsolation: false
}
});
// Load the HTML page with CSS styling
mainWindow.loadFile('index.html');
});

Nota: O ipcMain fornece alguns métodos para que você possa receber as mensagens enviadas a partir do processo renderer (página web).

Testar o App

Você verá a saída assim que salvar o arquivo anterior porque ativamos o electron-rebuild. No entanto, se você tiver fechado o app, pode abri‑lo novamente usando npm test e ver a seguinte saída

pir

Preparar um Script para Executar o App

  • Passo 1. Abra a pasta Root que criamos antes e crie um novo arquivo .sh dentro dessa pasta

pir

  • Passo 2. Abra o arquivo criado e insira o seguinte
#!/bin/bash
cd $HOME/Desktop/testapp
DISPLAY=:0 npm test

Nota: Aqui $HOME/Desktop/testapp é a localização do projeto electron

  • Passo 3. Abra uma janela de terminal dentro do VSCode e navegue até o diretório raiz do app
example:
cd ~/Desktop/testapp
  • Passo 4. Torne o ledstart.sh um arquivo executável
sudo chmod +x ledstart.sh

Preparar um Arquivo Desktop para Iniciar o App

  • Passo 1. Abra a pasta Desktop e crie um novo arquivo .desktop dentro dessa pasta

pir

  • Passo 2. Abra o arquivo criado e insira o seguinte
[Desktop Entry]
Encoding=UTF-8
Name=LED Test
Comment=IconTest Link
Exec=/home/pi/Desktop/testapp/ledStart.sh
Type=Application
Categories=Application;Development;

Nota: Exec é a localização do script que criamos antes

  • Passo 3. Abra uma janela de terminal dentro do VSCode e navegue até o Desktop
example:
cd ~/Desktop
  • Passo 4. Torne o ledStart.desktop um arquivo executável
sudo chmod +x ledStart.desktop

Iniciar o App

Dê um clique duplo no arquivo LED Test na área de trabalho do LCD do reTerminal

Você verá a saída da seguinte forma

pir

Agora você pode clicar nos botões e verá o LED acender!

Depurar o App

Vamos passar pelo processo de depuração do seu app enquanto o desenvolve

  • Passo 1. Faça login no reTerminal via SSH usando o Microsoft Visual Studio Code como mencionado antes

  • Passo 2. Faça login no reTerminal via SSH usando um aplicativo SSH como o MobaXterm com recurso X11 server

Nota: X11 é necessário para encaminhar a tela do reTerminal e aparecer no PC

  • Passo 3. Depois de escrever todos os códigos no Microsoft Visual Studio Code para o reTerminal, navegue até o diretório principal do app e execute o seguinte
npm test

Por fim, você verá a saída exibida em uma nova janela. Se houver algum erro no código, eles serão exibidos na janela de terminal do MobaXterm.

FAQ

P: Como configurar atualizações automáticas no app à medida que o salvamos?

Para isso você pode configurar o recurso Hot Reload usando o módulo npm electron-reloader

  • Passo 1. Instale o electron-reloader
npm install --save-dev electron-reloader
  • Passo 2. Adicione a seguinte linha ao final do arquivo main.js
try {
require('electron-reloader')(module)
} catch (_) {}

Agora execute o arquivo uma vez usando npm test e o aplicativo será atualizado conforme você salvar os arquivos. Você não precisará executar npm test toda vez que mudar o conteúdo dentro do seu projeto.

Demo Bônus

Se você quiser experimentar uma demo mais interessante com Electron, pode conferir este repositório GitHub

pir

Recursos

Suporte Técnico & Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja o mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...