Olá galera! estou quase terminando a construção do seguidor solar em dois eixos, em breve estarei postando! Mas no momento, preciso de ajuda numa outra coisa: eu tenho um circuito elétrico cuja corrente variará ao longo de um tempo, gostaria de saber como eu faço para armazenar (com arduino) todas essas variações como se fosse o data-log e se possível exibisse na tela essas variações... para que no final do período eu possa selecionar os valores e jogar num programa, como o excel para gerar gráfico. Abraços.

Exibições: 12138

Responder esta

Respostas a este tópico

Oi Márlison,

O ATMega que é o coração do Arduíno é um minicomputador no sentido mais técnico, possui um processador e memória num único componente.

Num computador normal você armazenaria estes dados num arquivo ou num banco de dados, no Arduíno o mais fácil seria manter estes dados em memória num array. Este array deveria ter uma tamanho limitado. Para querer plotar um gráfico você provavelmente vai querer registrar a hora que cada evento ocorreu, se for este o caso então vc provavelmente usará um array bidimensional, e terá que definir como guardar a hora inicial uma vez que o arduíno não tem um relógio.

Neste cenário quando você chegasse ao fim do array você poderia voltar ao inicio dele e começar a sobrescrever as posições. Exemplo: chegou no item 2000 do array (ultimo item), no 2001 sobrescreve a posição 0.

Se você quiser fazer algo mais avançado e salvar estes dados de maneira mais persistente, você pode usar a biblioteca de micro banco de dados para o arduino no link abaixo. Nunca usei mas pelo que entendi ela salva mini registros na EEPROM do Arduino e permite adicionar uma EEPROM externa se quiser armazenar uma quantidade grande de dados.

Biblioteca Banco de Dados pra Arduino

Existem diversas soluções pra teu problema, a mais simples é guardar os dados na memoria e pra recuperar os dados do arduino você pode pegar pela serial, num formato de texto separado por ponto e virgula (CSV), daí importar pro Excel é fácil.

Veja aí se estas informações fazem sentido pra você. Se precisar de uma ajuda me avisa e a gente bate um papo.

Abs,

Luciano

Olá Luciano!

Achei interessante a solução que você propôs no final: armazenar os dados na memória e depois recuperar os dados pela serial! Ainda não fiz nada parecido, você poderia me ajudar nessa empreitada!? eu nunca trabalhei com a programação associada ao armazenamento de dados, não sei que biblioteca usar... Eu conecto meu circuito a um dos pinos analógicos e ele vai armazenar os dados de corrente com os intervalos de coleta que eu quiser!? precisava coletar dados da corrente em intervalos de 3minutos ao longo de 12 horas, o que corresponde a 240 medidas! o arduino rev3 possui memória de armazenamento suficiente!? enfim, como vc pode ver, sou leigo no assunto, portanto peço sua ajuda e compreensão!

Att,

Márlison de Sá

Luciano,

vc teria algum exemplo de código para coleta de dados dessa natureza!? vc falou que eu posso capturar os dados através da serial... como isso é feito!? vc pode ajudar nesse passo-a-passo!?

Att

Márlison

Oi Márlison,

Posso ajudar sim, alias meu interesse maior é programação e adoraria trabalhar num projeto a 4 (ou mais mãos). Esta semana em particular eu estarei bem atarefado e talvez não consiga dedicar muito tempo mas o Almir já deu um bom caminho. Obrigado Almir! :-)

Você tem algum prazo pra entregar este projeto? Porque se você estiver com tranquilidade de tempo podemos dar uma olhada nisso com mais tranquilidade. Esta semana poderíamos fazer o esqueleto do programa e depois ir preenchendo o resto.

Questões importantes:

1 - Qual os objetivos do seu projeto? (o que ele faz)

2 - O que você deseja obter/exibir com estas medições ? (Isso é importante para gente saber quanto de dados armazenar e se vale a pena fazer um preprocessamento destes dados)

Acho que é isso, se quiser podemos marcar um bate-papo pela net hoje, ou qualquer dia dessa semana. Me manda uma mensagem aqui pelo Lab e a gente marca. Semana que vem acho que até podemos marcar alguma coisa no laboratório mesmo.

Um abraço,

Luciano

Luciano olha esse código abaixo e vê se ele faz isso.Acho que faz.

Ok Luciano, Muito Obrigado!

(Agradeço a todos que estão colaborando. Almir, Obrigado!)

Vou definir as questões importantes:

1 -  O que é o projeto?

O projeto é um circuito (painél solar + resistência) cuja corrente variará ao longo de 12 horas!

2 - O que eu quero?

Quero saber como essa corrente variou ao longo dessas 12 horas (com coleta de dados de 3 em 3 minutos, ou seja 240 dados)?

3 - Como pretendo fazer isso!?

Conecto com um jumper o circuito a um dos pinos analógicos do arduino e executo um código (que ainda não tenho) que mande o arduino coletar dados de corrente ao longo de 12 horas.

4 - E depois?

Procuro os dados que o arduino coletou (que eu ainda não sei para onde ele mandaria), copio e colo num programa gerador de gráfico como o Excel!

 

A ideia é essa... Mas não sei se poderia ser feito com essa simplicidade! rs

 

Att Márlison

//Codigo saindo do forno quentinho

 

/*
Mensagem:Elohim  Yehovah é o nome do Santo
Autor:Almir Bispo
Data:03/11/2012
Funcao:Escrever e ler eeprom em periodos determinados pelo comando_temp
Versão:Sem testar
*/
#include <EEPROM.h>
void setup ()
{
   Serial.begin(9600);
  while (!Serial) { ; }
  // send an intro:
  Serial.println();
}


void loop ()
{
int posicao;
int periodo;//periodo é o valor em minutos de intervalo
int c_p;
int tam_memoria;
int  comando_temp;//define temporizacao
int comando_func;//define funcao
//===campos lidos
char valor_lido;
char ocorrencia;
String msg;

tam_memoria=512/2;//tamanho da memoria
if (comando_temp!=0 && comando_func!=0)
{
//muda periodo-(lista de valorores para comando:1=periodo 1 min,2=2 min,3= 3 min) onde os dados serão gravados
if (comando_temp==1){periodo==1;}//1 min
if (comando_temp==2){periodo==2;}//2min
if (comando_temp==3){periodo==3;}//3min
if (comando_temp==4){periodo==60;}//1 hora
if (comando_temp==5){periodo==60*6;}//6 horas
//comandos de escrita na memoria=6 e leitura=7
if (comando_func==1)//inicia escrita na memoria
{
c_p=0;

for (posicao=tam_memoria;;c_p++)
{
int   valor_ADC = analogRead(A0)/4;// 8 bits (1024/4)=(0-255)
//formato da tabela [valor|periodo]
EEPROM.write(c_p,valor_ADC);//campo do valor da leitura
EEPROM.write(c_p+(tam_memoria+1),(periodo));//campo do periodo
delay((periodo*60)*1000);// a cada 3 minutos (periodo)
}//for write
}//if 1

if (comando_func==2)
{
  c_p=0;
  for (posicao=tam_memoria;;c_p++)
  {
  //formato da tabela [valor|periodo]
valor_lido=EEPROM.read(c_p);//campo do valor da leitura
ocorrencia=EEPROM.read(c_p+(tam_memoria+1));//campo do periodo

msg=String(valor_lido)+";"+String(ocorrencia)+"\n";
//Serial.print(valor_lido);
//Serial.println(ocorrencia);
  }//for read
  Serial.println(msg);//escreve  apos leitura
}//if 2
}// se diferente de zero

}//loop

Anexos

Olá Almir! agradeço muito pela sua ajuda! Peço que me ajude em aspectos práticos: Então eu tenho o circuito cujo os valores de corrente variarão ao longo de 12 horas! então eu conecto o circuito a uma das portas analógicas do arduino executo o código e ele vai gravar os dados!? Aonde exatamente no código eu devo declarar o pino que eu vou conectar o circuito!? aonde ficará gravado os dados!? como eu acesso os mesmos!? Att Márlison

//Codigo saindo do forno quentinho

 

/*
Mensagem:Elohim  Yehovah é o nome do Santo
Autor:Almir Bispo
Data:03/11/2012
Funcao:Escrever e ler eeprom em periodos determinados pelo comando_temp
Versão:Sem testar
*/
#include <EEPROM.h>
void setup ()
{
   Serial.begin(9600);
  while (!Serial) { ; }
  // send an intro:
  Serial.println();
}


void loop ()
{
int posicao;
int periodo;//periodo é o valor em minutos de intervalo
int c_p;
int tam_memoria;
int  comando_temp;//define temporizacao
int comando_func;//define funcao
//===campos lidos
char valor_lido;
char ocorrencia;
String msg;

tam_memoria=512/2;//tamanho da memoria SE TIVER 512 BYTES,NÃO MUDA
if (comando_temp!=0 && comando_func!=0)
{
//muda periodo-(lista de valorores para comando:1=periodo 1 min,2=2 min,3= 3 min) onde os dados serão gravados

comando_temp=3;//A CADA 3 MIN FOI ESCOLHIDO
if (comando_temp==1){periodo==1;}//1 min
if (comando_temp==2){periodo==2;}//2min
if (comando_temp==3){periodo==3;}//3min
if (comando_temp==4){periodo==60;}//1 hora
if (comando_temp==5){periodo==60*6;}//6 horas ESCOLHA O NUMERO 5
//comandos de escrita na memoria=6 e leitura=7

comando_func=1;//ESCOLHEU A FUNÇÃO DE ESCRITA NA MEMORIA


if (comando_func==1)//inicia escrita na memoria
{
c_p=0;

for (posicao=tam_memoria;(posicao<c_p);c_p++)  //CORRIGE ISTO (POSICAO<C_P)
{
int   valor_ADC = analogRead(A0)/4;//<==AQUI VOCE ESCREVE O VALOR DO SEU PINO (A0)
//formato da tabela [valor|periodo]
EEPROM.write(c_p,valor_ADC);//campo do valor da leitura
EEPROM.write(c_p+(tam_memoria+1),(periodo));//campo do periodo
delay((periodo*60)*1000);// a cada 3 minutos (periodo) DURANTE 6 HORAS=120 GRAVAÇÕES
}//for write
}//if 1

if (comando_func==2)
{
  c_p=0;
  for (posicao=tam_memoria;(posicao<c_p);c_p++) //CORRIGE ISTO NO CODIGO ORIGINAL
  {
  //formato da tabela [valor|periodo]
valor_lido=EEPROM.read(c_p);//campo do valor da leitura
ocorrencia=EEPROM.read(c_p+(tam_memoria+1));//campo do periodo

msg=String(valor_lido)+";"+String(ocorrencia)+"\n";
//Serial.print(valor_lido);
//Serial.println(ocorrencia);
  }//for read
  Serial.println(msg);//escreve  apos leitura
}//if 2
}// se diferente de zero

}//loop

 

 

/*O CODIGO ESTÁ ADAPTADO PARA LEITURA A CADA 3 MIN NO PERIODO DE 6 HORAS

SE QUISER AUMENTAR PARA  12 HORAS LEMBRE DE DELAY (x 2000 AO INVES DE 1000)

PARA LER MEMORIA,COMANDO_FUNC=2;A MEMORIA ESTÁ EM "MSG"

FAZ TESTE USANDO PEQUENOS PERIODOS

*/

Um detalhe que te auxilia:

substitua:

msg=String(valor_lido)+";"+String(ocorrencia)+"\n";

por:

msg=String(msg)+String(valor_lido)+";"+String(ocorrencia)+"\n";

e nas partes que pede para corrigir ,retire essas partes "(posicao<c_p)"

 

Oi Almir, 

Agora olhei seu programa com calma, está ótimo. 100% da lógica que o Márlison pediu esta lá.

Só fiquei em dúvida quanto ao campo de "periodo", você pensou em guardar sempre o mesmo valor neste campo? Eu tinha imaginado de gravar os intervalos de tempo , por exemplo na coleta de 3 em 3 minutos : 0, 3, 6, 9, 12, ... 720. (720 minutos = 12 horas).

Caro amigo Luciano.

Você tem razão ! pode multiplicar PERIODO x C_P

e Gravar :EEPROM.write(c_p+(tam_memoria+1),(periodo*c_p))

Considerei que a memoria do microcontrolador possua 512 "espaços".

Na logica do codigo eu fiz uma separação dos espaço em dois setores.

A)O setor de 0 até 255 ele pode escrever os valores lido no ADC

B)O setor de (255+1,isto é,256 até 512) ele guarda o periodo em que o "valor" ADC foi lido.

o periodo é [1,2,3,4,5,6,7,8,9,].

Fiz isso para que ele tenha controle de data.Suponha que ele inicie as 00:00 (meia noite)

Se ele ler o periodo 7 ,significa que (7 X tempo definido por comando_temp,ou seja,7X3=21).O valor do espaço que tem perido 7 foi gravado no mminuto 21 apartir da zero hora.

Você pode controlar o tempo de intervalo no COMANDO_TEMP (veja os IFs)

Detalhe:O periodo maximo em que pode ser gravado são 6 horas.por causa do valor maximo da variavel (16bits/2)

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço