- Aquisição de dados para o Excel utilizando Arduino
- Código de aquisição de dados para Excel utilizando Arduino
Qual é o objetivo deste artigo?
No artigo anterior, demonstrou-se como obter e utilizar uma ferramenta bastante simples para realizar a aquisição de dados provenientes do Arduino UNO pelo Microsoft Excel. Sendo assim, este artigo visa cumprir a tarefa de explicar de maneira bastante breve o código e propor algumas alterações no mesmo para ampliar a sua funcionalidade.
Alteração do código
O primeiro passo para realizar as alterações descritas anteriormente consiste em entender o que o código anterior fazia e o que esta sendo proposto neste. No primeiro artigo desta série é possível notar que o autor realiza a aquisição de duas informações provenientes do Arduino UNO, de modo que, a primeira consiste na leitura do pino de entrada analógica A0 e a segunda consiste na leitura de um valor “aleatório” que utiliza um dos pinos de entrada analógica como fonte. Neste conteúdo, o código será modificado para realizar a leitura das 6 portas de entradas analógicas existentes no Arduino UNO.
Ao abrir o código disponibilizado pelo desenvolvedor, o leitor pode perceber a declaração de duas variáveis, responsáveis por conter os valores das leituras mencionadas.
1 2 |
float a0; float rnd; |
A primeira modificação a ser realizada é a substituição destas duas variáveis por outras que possuem o papel de conter os valores das leituras das 6 entradas analógicas.
1 2 3 4 5 6 |
float ent_analog0; float ent_analog1; float ent_analog2; float ent_analog3; float ent_analog4; float ent_analog5; |
Em seguida, já dentro da função loop(), percebe-se que o desenvolvedor utilizou as funções adequadas para a obtenção das informações desejadas.
1 2 |
a0 = (float)analogRead(0) / 1023.0 * 5.0; rnd = (float)random(0, 1000) / 1023.0 * 5.0; |
Para utilizar este código da maneira proposta neste artigo, torna-se necessário remover estas duas linhas e inserir as funções necessárias para obter o funcionamento desejado.
1 2 3 4 5 6 |
ent_analog0 = (float)analogRead(0) / 1023.0 * 5.0; ent_analog1 = (float)analogRead(1) / 1023.0 * 5.0; ent_analog2 = (float)analogRead(2) / 1023.0 * 5.0; ent_analog3 = (float)analogRead(3) / 1023.0 * 5.0; ent_analog4 = (float)analogRead(4) / 1023.0 * 5.0; ent_analog5 = (float)analogRead(5) / 1023.0 * 5.0; |
Para prosseguir, o leitor deve abrir o arquivo do Microsoft Excel cedido pelo desenvolvedor (citada no artigo anterior, chamada Arduino_Excel_21.xls) e criar uma nova planilha (aqui, esta chama-se Embarcados), conforme a figura a seguir.
Construção da planilha e organização dos dados
Neste momento, será ensinado para o leitor como deve-se proceder para obter uma planilha de aquisição de dados semelhante a apresentada na figura 2.
O primeiro item a ser elaborado será a tabela contendo os valores atuais das entradas analógicas, conforme a figura a seguir.
Para criar este elemento, deve-se apenas utilizar os dados obtidos através das leituras das entradas analógicas e alocar os mesmos nas células desejadas no Microsoft Excel. A realização deste procedimento é dada pela função write(“nome_da_planilha”, “Célula”, “dado”, “Número_de_casas_decimais”).
1 2 3 4 5 6 |
myExcel.write("Embarcados", "C5", ent_analog0, 2); myExcel.write("Embarcados", "C6", ent_analog1, 2); myExcel.write("Embarcados", "C7", ent_analog2, 2); myExcel.write("Embarcados", "C8", ent_analog3, 2); myExcel.write("Embarcados", "C9", ent_analog4, 2); myExcel.write("Embarcados", "C10", ent_analog5, 2); |
O próximo passo consiste em criar um gráfico e relaciona-lo a esta tabela recém-criada, para isto, basta selecionar as duas colunas da tabela, clicar em Inserir e, em seguida, na opção de gráfico desejada (aqui foi utilizado um gráfico de colunas).
Após algumas configurações, como por exemplo, a escolha de cores, tamanho das barras e nomeação dos eixos, é possível obter um gráfico semelhante a este:
O último elemento da planilha de aquisição de dados proposta consiste em uma tabela onde, ao longo do tempo, são registrados os valores das informações obtidas por meio das entradas analógicas.
A função responsável por fazer este tipo de registro é a writeIndexed(“Nome_da_planilha”, “linha”, “Coluna”, “dado”, “casas_decimais” (quando necessário)). A utilização desta função é mais adequada para preencher as células, quando existe um certo dinamismo necessário para o registro das informações. Repare que a variável idx é a responsável por determinar a linha em que os dados obtidos em um determinado instante serão registrados, bem como para identificar numericamente a linha em questão.
Os elementos %date% e %time% contém as informações relativas à data e ao horário em que determinado dado foi registrado e as variáveis ent_analog0/1/2/3/4/5 guardam justamente os valores obtidos através das entradas analógicas.
1 2 3 4 5 6 7 8 9 |
myExcel.writeIndexed("Embarcados", idx+14, 2, idx); myExcel.writeIndexed("Embarcados", idx+14, 3,"%date%"); myExcel.writeIndexed("Embarcados", idx+14, 4,"%time%"); myExcel.writeIndexed("Embarcados", idx+14, 5, ent_analog0, 2); myExcel.writeIndexed("Embarcados", idx+14, 6, ent_analog1, 2); myExcel.writeIndexed("Embarcados", idx+14, 7, ent_analog2, 2); myExcel.writeIndexed("Embarcados", idx+14, 8, ent_analog3, 2); myExcel.writeIndexed("Embarcados", idx+14, 9, ent_analog4, 2); myExcel.writeIndexed("Embarcados", idx+14, 10, ent_analog5, 2); |
Note que para esta tabela ser preenchida automaticamente, torna-se necessário que a variável idx seja incrementada, fazendo assim com que as linhas sejam preenchidas sucessivamente de cima para baixo.
1 |
idx++; |
Para que esta tabela fosse preenchida com um número finito de linhas, optou-se por limpar a mesma (através da função Clear(“Nome_da_Planilha”, “Intervalo” (este intervalo corresponde à área que deve ser apagada, o primeiro valor corresponde à primeira célula enquanto o último, esta relacionado com a última célula)) após o preenchimento de suas 30 linhas (aqui o leitor pode decidir por aumentar ou reduzir o número de linhas e até mesmo retirar esta limitação, tendo em mente que cada planilha do Microsoft Excel possui uma quantidade determinada de linhas).
1 2 3 4 5 |
if (idx > 29) { myExcel.clear("Embarcados","B14:J43"); idx = 0; } |
Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Caso queira reproduzir este conteúdo, confira o código na íntegra, apresentado abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#include <rExcel.h> long idx = 0; int outputTiming = 1000; float ent_analog0; float ent_analog1; float ent_analog2; float ent_analog3; float ent_analog4; float ent_analog5; rExcel myExcel; void setup() { Serial.begin(115200); delay(1000); myExcel.clearInput(); } void loop() { static unsigned long loopTime = 0; static unsigned long time1 = 0; int ret; loopTime = millis(); if ((loopTime - time1) >= outputTiming) { time1 = loopTime; ent_analog0 = (float)analogRead(0) / 1023.0 * 5.0; ent_analog1 = (float)analogRead(1) / 1023.0 * 5.0; ent_analog2 = (float)analogRead(2) / 1023.0 * 5.0; ent_analog3 = (float)analogRead(3) / 1023.0 * 5.0; ent_analog4 = (float)analogRead(4) / 1023.0 * 5.0; ent_analog5 = (float)analogRead(5) / 1023.0 * 5.0; myExcel.write("Embarcados", "C5", ent_analog0, 2); myExcel.write("Embarcados", "C6", ent_analog1, 2); myExcel.write("Embarcados", "C7", ent_analog2, 2); myExcel.write("Embarcados", "C8", ent_analog3, 2); myExcel.write("Embarcados", "C9", ent_analog4, 2); myExcel.write("Embarcados", "C10", ent_analog5, 2); myExcel.writeIndexed("Embarcados", idx+14, 2, idx); myExcel.writeIndexed("Embarcados", idx+14, 3,"%date%"); myExcel.writeIndexed("Embarcados", idx+14, 4,"%time%"); myExcel.writeIndexed("Embarcados", idx+14, 5, ent_analog0, 2); myExcel.writeIndexed("Embarcados", idx+14, 6, ent_analog1, 2); myExcel.writeIndexed("Embarcados", idx+14, 7, ent_analog2, 2); myExcel.writeIndexed("Embarcados", idx+14, 8, ent_analog3, 2); myExcel.writeIndexed("Embarcados", idx+14, 9, ent_analog4, 2); myExcel.writeIndexed("Embarcados", idx+14, 10, ent_analog5, 2); idx++; if (idx > 29) { myExcel.clear("Embarcados","B14:J43"); idx = 0; } } } |
Bom dia tudo bem?
Gostaria de saber onde consigo baixar a biblioteca rExcel.h?
Desde já obrigado!
Quando você baixa o aplicativo, a biblioteca é inserida automaticamente no seu Arduino IDE
Olá Daniel
Fiz uma aplicação em Delphi, para receber os dados do Arduino, por uma célula de carga. Mas, prefiro o excel para tratar os dados. Como poderia colocar essas variáveis?
Olá amigo, gostaria de saber se dentro dessa interface desenvolvida, consigo manipular o código para eu também possa enviar comandos para o arduino pela planilha? (alem de receber dados do arduino também possa envia-los) Obrigado!
a0 = (float)analogRead(0) / 1023.0 * 5.0;
rnd = (float)random(0, 1000) / 1023.0 * 5.0;
também fiquei na dúvida no código acima
Outra dúvida é que no meu TCC vou utilizar entradas digitais e quero escrever uma nova linha no excel sempre que uma entrada mudar de valor e não com um tempo determinado, há alguma maneira de fazer isso?
Olá Daniel! Parabéns pelo post. Já tenho familiaridade com o VBA Excel, mas estou iniciando no Arduino. Tenho uma dúvida quanto à biblioteca rExcel.h utilizada no código. De onde ela foi extraída?
Também tenho essa dúvida
Exatamente o que gostaria de saber também!
a0 = (float)analogRead(0) / 1023.0 * 5.0;
por qual motivo o 1023 é multiplicado por 5 qual significado
Olá, gostei do projeto, mas o que seria o (“Embarcados”,”B14:J43″)?
É a sequência de células da planilha “Embarcados”.
Magnífico desarrollo. Enhorabuena!