Arduino Utilizando VBA No Excel
Arduino Utilizando VBA No Excel
ÍNDICE DE CONTEÚDO
Fig
ura 1 - Planilha para controle do Arduino UNO.
Aba de desenvolvimento
Para começar a desenvolver a aplicação proposta, deve-se habilitar a barra de ferramentas
de desenvolvedor no Microsoft Excel. Sendo assim, torna-se necessário que o leitor acesse o
menu Arquivo (File), selecione o item opções (Options) e em seguida no item personalizar
faixa de opções (Customize Ribbon) para então marcar a caixa de seleção adequada para o
aparecimento da aba de desenvolvimento(Developer).
Figura
3 - Inserindo um botão
Após a seleção da ferramenta de criação dos botões, deve-se selecionar a área
correspondente na planilha e arrastar o mouse para obter o botão com o tamanho desejado.
Fig
ura 10 - Criação de regras para mostrar os estados das saídas
A formulação de regras pode ser feita acessando o item Formatação
condicional(Conditional Formatting) contido na aba Página Inicial (Home). Neste momento
deve-se selecionar a opção de criação de uma nova regra (New Rule) para então optar pelo
tipo de regra desejada (neste caso foi utilizada a regra formatar somente células que
contenham (Format only cells that contain)).
Em seguida deve-se especificar o texto (na primeira lista de seleção na parte referente à
edição da regra é necessário que o leitor selecione a opção Texto Específico (Specific Text))
que, caso esteja presente na célula, desencadeará mudança de cor da mesma (aqui foi
estabelecido que quando houver a palavra HIGH em uma determinada célula existente na
região citada (coluna R), a mesma deverá ser colorida com a cor verde).
Repare que o procedimento para os casos em que as células estiverem escritas comLOW é
exatamente o mesmo.
Figura 11 - Resultado final.
Histórico de dados de acionamento do Arduino no Excel
utilizando VBA
Sabe-se que uma das coisas mais importantes para qualquer tipo de controle de processos é
a realização do registro de uma série de dados essenciais e que podem ser utilizados para
auxiliar nas tomadas de decisão por parte das pessoas responsáveis pela eficiência de um
determinado processo.
Propõe-se neste artigo uma continuação do conteúdo pelo qual introduziu-se a utilização
do VBA com o Microsoft Excel para realizar o controle das saídas digitais de um Arduino
UNO. Sendo assim, o objetivo do presente material consiste em compartilhar uma maneira
pela qual pode-se elaborar um registro histórico para os valores das saídas digitais citadas.
Depois de conferir o conteúdo deste artigo, o leitor poderá obter um resultado semelhante
ao apresentado na figura 1.
2 Sheets("Gráficos").Range("m4") = Time()
Observe que a maneira descrita para a realização do preenchimento do históricopossui um
caráter manual, de modo que, para que o mesmo seja preenchido linha por linha
automaticamente, torna-se necessário a criação de um procedimento dinâmico. Para isso é
necessário criar uma variável que percorra as células adequadas inserindo os valores
correspondentes do painel de estados no histórico de dados.
A variável citada será denominada RangeDinamico e pode ser criada da seguinte maneira:
1 Dim RangeDinamico As Range
Para preencher a linha adequada do histórico, é necessário descobrir qual foi a última linha
preenchida para então completar a linha posterior, isto pode ser feito escolhendo uma
célula como ponto de partida, no caso a célula L3 (correspondente ao campo Data,
no cabeçalho), de modo que, a partir desta testa-se as células imediatamente abaixo para
verificar qual é a próxima célula não escrita (esta estará contida na linha a ser preenchida).
Set RangeDinamico = Sheets("Gráficos").Range("l3")
Do
If IsEmpty(RangeDinamico) = False Then
Set RangeDinamico = RangeDinamico.Offset(1, 0)
End If
Loop Until IsEmpty(RangeDinamico) = True
Para que as novas funcionalidades deste botão sejam implementadas, deve-se alterar a
programação do mesmo utilizando as porções de códigos descritas anteriormente, além
disso, uma pequena modificação deve ser realizada para o caso onde a saída esteja em um
determinado estado e o botão que leva a mesma para este mesmo estado seja apertado.
Neste caso, ignora-se o acionamento do botão, já que não houve alteração de estado,
portanto, não há motivo para atualizar o histórico (segundo o critério de atualização
utilizado).
Desta maneira o código do botão HIGH da saída do pino 2 deve ser alterado primeiramente
conforme apresentado abaixo. Note que a alteração do estado do botão somente ocorrerá
quando o estado desejado for diferente do estado atual.
Sub Button3_Click()
If (Range("24") = "LOW") Then
Put #1, , "a"
Range("r24") = "HIGH"
End If
Finalmente, para inserir os dados no histórico a partir do clique deste botão de controle,
basta completar a programação do mesmo com as porções de código mostradas
anteriormente.
Sub Button3_Click()
Dim RangeDinamico As Range
Put #1, , "a"
If (Range("r24") = "LOW") Then
Range("r24") = "HIGH" 'Escreve no painem de estados
Set RangeDinamico = Sheets("Gráficos").Range("l3")
Do
If IsEmpty(RangeDinamico) = False Then
Set RangeDinamico = RangeDinamico.Offset(1, 0)
End If
Loop Until IsEmpty(RangeDinamico) = True
RangeDinamico = Date
RangeDinamico.Offset(0, 1) = Time()
RangeDinamico.Offset(0, 2) = Sheets("Embarcados").Range("r26")
RangeDinamico.Offset(0, 3) = Sheets("Embarcados").Range("r24")
RangeDinamico.Offset(0, 4) = Sheets("Embarcados").Range("r22")
RangeDinamico.Offset(0, 5) = Sheets("Embarcados").Range("r20")
RangeDinamico.Offset(0, 6) = Sheets("Embarcados").Range("r18")
RangeDinamico.Offset(0, 7) = Sheets("Embarcados").Range("r16")
RangeDinamico.Offset(0, 8) = Sheets("Embarcados").Range("r14")
RangeDinamico.Offset(0, 9) = Sheets("Embarcados").Range("r12")
RangeDinamico.Offset(0, 10) = Sheets("Embarcados").Range("r10")
RangeDinamico.Offset(0, 11) = Sheets("Embarcados").Range("r8")
RangeDinamico.Offset(0, 12) = Sheets("Embarcados").Range("r6")
RangeDinamico.Offset(0, 13) = Sheets("Embarcados").Range("r4")
End If
Note que este procedimento deve ser realizado para todos os outros botões de controle (no
caso de o leitor utilizar a alteração de um estado qualquer como parâmetro para a
atualização do histórico).
Para encerrar este conteúdo, note que na figura anterior também existe um botão para
limpar o histórico. Além de cumprir esta função, o botão em questão ainda realiza o registro
da primeira linha com os estados atuais para que o histórico possua um ponto de partida.
Este procedimento pode ser realizado criando-se o botão (como já apresentado) e inserindo
no mesmo o seguinte código em VBA.
Sub botao_apagar()
Dim tabela As Range
Set tabela = Range("l3").CurrentRegion
tabela.Offset(1, 0).Resize(tabela.Rows.Count - 1, tabela.Columns.Count).Select
Selection.ClearContents
PreencherHist
End Sub
Este código começa com a declaração da variável tabela e em seguida esta é associada a
célula L3 (esta é a célula onde está localizado o campo Data no histórico). Posteriormente,
na próxima linha de códigos seleciona-se a célula imediatamente abaixo do campo Data e a
partir da mesma seleciona-se os demais dados da tabela (deixando somente o cabeçalho
fora da seleção) e por fim, a função Selection.ClearContents() é a responsável por apagar
toda a região selecionada. Observe que após estes procedimentos, chama-se a função para
preenchimento da primeira linha do histórico (a função PreencherHist equivale ao código
utilizado anteriormente para preencher uma linha do mesmo).
Seguindo os passos demonstrados neste artigo será possível obter um resultado semelhante
ao da figura 5 (idêntica à figura 1).
Figura 5
- Resultado da aplicação proposta.
Criação de gráficos para o histórico de dados do Arduino no Excel utilizando VBA
Qual é o objetivo deste artigo?
No artigo anterior foi possível apresentar para o leitor uma ideia de como elaborar
um histórico de dados cujo objetivo consiste em armazenar os estados de todas as saídas
digitais do Arduino UNO em um determinado instante.
Neste material, será dada uma espécie de continuação do conteúdo anterior, onde será
abordada uma maneira de representar os estados de uma determinada saída ao longo do
tempo por meio de um gráfico, que por sua vez, apresentará a variação da mesma entre os
níveis alto e baixo.
Após a leitura deste o conteúdo e do anterior, o leitor poderá obter um resultado
semelhante ao apresentado na figura 1.
Figura 4 -
Criação de gráfico de dispersão.
Em seguida, deve-se clicar sobre o gráfico e definir um nome para o mesmo conforme a
figura 5.
Figura 5 - Definição
do nome para o gráfico.
Para selecionar os dados basta clicar com o botão direito sobre o gráfico e em seguida na
opção selecionar data (select data). Neste momento será aberta uma janela onde o usuário
deve especificar onde estarão os dados para compor o gráfico desejado.
A especificação dos mesmos deve ser feita da seguinte forma: Primeiramente seleciona-se a
coluna cujo cabeçalho contém o campo Hora, digita-se ";" e em seguida seleciona-se a
coluna cujo cabeçalho contém o elemento PINO 2.
F
igura 6 - Seleção dos dados.
O resultado desta seleção está apresentado na figura 7
Figura 2 - Painel de acionamento do PWM
Os dados que serão enviados pela comunicação serial possuem o seguinte formato:
Figura 3 -
String passada do Microsoft Excel para o Arduino UNO
O código abaixo descreve justamente o funcionamento do botão responsável por fazer com
que a saída digital do pino 11 seja acionada utilizando o PWM.
1 Dim pwm As String
2
3 pwm = Range("L12")
4 pwm = "p" & "1" & pwm
5 Range("C10") = Range ("L12")
6
7 Put #1, , pwm
Primeiramente, declara-se a variável pwm como uma variável do tipo String. Em seguida,
esta é preenchida com o valor contido na célula L12 (célula onde o usuário deve inserir o
valor desejado para ser utilizado como parâmetro na função analogWrite()).
Na terceira linha deste código realiza-se a concatenação dos caracteres p e 1 (aqui existente
na condição de caractere) com string contida na variável pwm, para que a mensagem a ser
enviada esteja com o formato descrito na figura 3.
Por fim, registra-se o valor encontrado na célula L12 na célula C10 (contida no painel de
estados (apresentado na figura 4), para conter o valor atual do pwm que está sendo
utilizado) e envia-se através da o conjunto de caracteres pela porta serial.
Figura 4 - Painel de estados
Desenvolvimento do código do Arduino UNO
No código do Arduino UNO deve-se primeiramente declarar 3 variáveis que serão utilizadas
para realizar o acionamento proposto. Uma destas deve ser do
tipo char(denominada comando), para conter os caracteres recebidos através da
porta COMpela função Serial.read(). Por outro lado, deve-se ter uma variável do
tipo String (denominada pwm) que será preenchida com os caracteres da
variável comandoe uma variável do tipo int, chamada valor, utilizada no acionamento da
saída digital existente no pino 11 por meio da função analogWrite().
1 char comando;
2 String pwm;
3 int valor;
Posteriormente, na função setup(), inicializa-se a interface de comunicação através da porta
serial e além disso declara-se os pinos que serão utilizados como saídas (como o exemplo
será dado utilizando apenas o pino 11, somente este está sendo declarado).
1 void setup()
2{
3 Serial.begin(9600);
4 pinMode(11,OUTPUT);
5}
O procedimento realizado pelo código inserido dentro da função loop() é análogo ao
realizado no primeiro artigo desta série, onde, primeiramente, verifica-se a existência de
algum byte no buffer da porta serial para ser lido e, caso exista, a variável comando recebe o
caractere em questão.
Se o conteúdo da variável comando for a letra p, o Arduino UNO deve entender que
o Microsoft Excel requisitou um pedido de acionamento de uma saída digital
utilizando PWM. Em seguida, limpa-se a variável do tipo string pwm e lê-se o
próximo byte do conjunto de dados que foi enviado (note que esta segunda leitura identifica
qual porta deve ser acionada neste caso, a saída presente no pino 11).
Posteriormente utiliza-se um laço for para ler os próximos 3 bytes, ou seja, 3 caracteres
existentes no buffer da porta COM, de modo que, a cada leitura, adiciona-se estes
caracteres à variável do tipo string pwm. Por fim, após a execução total do laço, utiliza-se a
função toInt() para transformar o conteúdo da variável pwm em um número inteiro e este é
armazenado na variável valor, que por sua vez é utilizada para o acionamento da porta
correspondente por meio da função analogWrite().
void loop() {
if (Serial.available()>0)
{
comando = Serial.read();
switch (comando)
{
case 'p':
delay(50);
pwm = "";
comando = Serial.read();
switch (comando)
{
case '1':
for ( int i = 0; i < 3; i++)
{
comando = Serial.read();
pwm += comando;
}
valor = pwm.toInt();
analogWrite(11,valor);
break;
}
}
}
}
No meio do código é possível encontrar a função delay() sendo utilizada, pois comprovou-se
experimentalmente que, caso esta não estivesse presente, o Arduino UNO não conseguiria
realizar as leituras dos dados recebidos através da porta COMcorretamente.
Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos
dar sugestões, críticas ou elogios.