To querendo fazer um banco de dados em arquivo texto num sd card,
Alguém ja fez um?
Alguém teria um exemplo?
Ideias são bem-vindas!
Obrigado!
To querendo fazer um banco de dados em arquivo texto num sd card,
Alguém ja fez um?
Alguém teria um exemplo?
Ideias são bem-vindas!
Obrigado!
Tipo SQL?
Mas queres algo funcional? Ou apenas prova de conceito?
O grande problema que tens nessa implementacão é o facto de quereres fazer um arquivo de texto. Isso implica um sistema de ficheiros e mais trabalho para o Arduino...
Se quisesses fazer uma base de dados onde não estavas limitado por um sistema de ficheiros (e estarias apenas a usar o cartão SD como memória), terias menos problemas, mas mesmo assim não sei quão bem funcionaria pois tinha de ir ler e escrever dados no cartão. :\
Queres especificar um pouco mais o que pretendes para a malta fazer aqui uma masturbacão mental sobre o assunto?
Opzzz, obrigado pelo interesse!
Preciso ler um cartao RFID e associar ao número deste cartão, algumas variaveis; algumas númericas outras strings e talvez lógicas
pensei em usar um array, mas deveria ser um array multidimensional e como são muitos cartões, 500 ou mais, talvez uma eeprom externa, uma flash memory, sei lá!
As vezes após a leitura do rfid apenas devo ler o conteúdo referente ao cartão, outras vez preciso alterar uma ou mais variaveis!
Olhei "rapidamente" a SD.h parece ser prática, não testei nada ainda!
Alguma ideia?
bubulindo:
Tipo SQL?
Mas queres algo funcional? Ou apenas prova de conceito?
Sim, funcional!
Obrigado!
Tendo em conta a aplicacão, acho que desenvolver algo para ser similar a SQL ia ser um fardo sem grande proveito, acho...
É essencial ter ficheiros para leres os dados no PC? Ou serve poder alterar os dados no cartão através do Arduino?
O esquema de dados está já definido? Ou pode ir mudando? Se já estiver completamente definido, definir uma matriz no cartão será a forma mais simples, se tiveres de preparar para adicionar campos, a coisa muda completamente de figura, mas acho que deva ser possível de fazer. Bastará, digo eu, deixar X espaco como sobressalente na estrutura de dados e eventualmente adicionar campos e alterar o espaco sobressalente.
Algo assim:
struct {
unsigned char RF_code[10]; //assumi um tamanho. Não sei quanto é. Mas isto pode também ser a chave primária
char primeiro_nome[13]; //ajustar tamanho do nome?
char ultimo_nome[13]; //ajustar?
unsigned long ultimo_acesso; //usar um timestamp para ver quando o cartão foi usado pela última vez //Ponderar usar 64 bits...
unsigned long numero_acesso; //numero de acessos deste cartão.
unsigned char sobressalente[16];//usado para dar um registo com tamanho de 60 bytes.
}
Se precisasses de outro campo (que coubesse dentro dos 16 bits), farias:
struct {
unsigned char RF_code[10]; //assumi um tamanho. Não sei quanto é. Mas isto pode também ser a chave primária
char primeiro_nome[13]; //ajustar tamanho do nome?
char ultimo_nome[13]; //ajustar?
unsigned long ultimo_acesso; //usar um timestamp para ver quando o cartão foi usado pela última vez //Ponderar usar 64 bits...
unsigned long numero_acesso; //numero de acessos deste cartão.
unsigned char autorizado; //usar isto como um bool, se 1 está autorizado a entrar, se estiver a 0, não está
unsigned char sobressalente[15];//usado para dar um registo com tamanho de 60 bytes.
}
Isto em principio não alteraria a localizacão dos dados na memória.
Depois poderias armazenar isto como um array, dando-te assim uma matriz mais simples de aceder.
Depois terias sim de criar uma funcão que serializasse e vice versa estes dados para gravar e ler do cartão. Um dos problemas que eu antevejo com isto é o tempo de pesquisa... ir buscar o numero do cartão vai demorar-te imenso tempo porque segundo sei os numeros de série dos cartões RFID não estão por ordem... Então terias de correr todo o array de numeros para ver se o cartão estava autorizado ou não.
Talvez pudesses melhorar isso usando um tipo inteiro (32 ou 64 bits) para o numero do cartão em vez do array... e isso facilitaria imenso as comparacões. :\
A SD.h, na realidade implementa um sistema FAT...
Uma maneira que talvez seja "rápida" (é algo a testar) seria criar um ficheiro para cada cartão em que o nome do ficheiro seria o código RFID... o problema aí será talvez que a biblioteca SDFat apenas aceita nomes com 8 bytes...
bubulindo:
A SD.h, na realidade implementa um sistema FAT...Uma maneira que talvez seja "rápida" (é algo a testar) seria criar um ficheiro para cada cartão em que o nome do ficheiro seria o código RFID... o problema aí será talvez que a biblioteca SDFat apenas aceita nomes com 8 bytes...
Hummm, interessante, gostei desta ideia!
O ficheiro seria o número do cartão e os arquivos dentro dos ficheiros seriam os nomes das variaveis e o conteúdo dos arquivos seriam o conteúdo das variaveis, aí fica facil pra incluir ou excluir variaveis, basta apagar arquivos, muito bom; só tem que testar o acesso se seria rápido tipo pra 500 rfid, se perder um ou dois segundos pra mim está ótimo!
Obrigado pela luz no fim do túnel, quando terminar posto aqui o resultado!
Hmmm, um ou dois segundos... 500 cartões...
Como disse, o código da RFID quantos caracteres tem?
Existe a possibilidade das RFID serem programadas para um numero série em especifico? Isso reduziria a complexidade do projecto para um nível incrívelmente simples uma vez que apenas terias de verificar se os digitos superiores conformavam com o que tinhas definido e ver se existia um registo com o numero dos restantes digitos.
bubulindo:
Hmmm, um ou dois segundos... 500 cartões...Como disse, o código da RFID quantos caracteres tem?
Existe a possibilidade das RFID serem programadas para um numero série em especifico? Isso reduziria a complexidade do projecto para um nível incrívelmente simples uma vez que apenas terias de verificar se os digitos superiores conformavam com o que tinhas definido e ver se existia um registo com o numero dos restantes digitos.
os que tenho já são definidos pelo fabricante e tem um formato assim e não são sequencia
0000145934 002,14862
a ideia seria usar apenas os ultimos 5 ou seja (14862)
estou fazendo testes com o tempo de pesquisa, vou criar uns 100 diretorios e mandar pesquisar por um deles.
o tamanho máximo do nome dos diretório é 8 digitos (string), eu acho que vai "dar" bem legal !
O que eu referia era ficheiros em vez de directórios.
O problema em usar apenas os últimos 5 digitos ´€ que podes ter vários (imensos...) cartões com os mesmos últimos digitos. :\
Se calhar terás de ter uma funcão que ao registar um cartão novo veja se esse número já existe. :\
bubulindo:
O que eu referia era ficheiros em vez de directórios.
O problema em usar apenas os últimos 5 digitos ´€ que podes ter vários (imensos...) cartões com os mesmos últimos digitos. :\
Se calhar terás de ter uma funcão que ao registar um cartão novo veja se esse número já existe. :\
OK!
Putz estou quase desistindo do MALDITO SD Card, funcionou por apenas meia duzias de vezes, nao consigo mais ler o conteúdo do cartao.
eu já tinha testado esta lib SD.h a uns anos atrás e funcionava bem.
Já testei em 5 placas diferentes de Arduino, o card funciona direto no computador, portanto nao é nele o problema
retirei o shield e montei direto no protoboard, mesmo assim nao consegue inicializar o cartao! :0
Kotch:
Putz estou quase desistindo do MALDITO SD Card, funcionou por apenas meia duzias de vezes, nao consigo mais ler o conteúdo do cartao.
eu já tinha testado esta lib SD.h a uns anos atrás e funcionava bem.
Já testei em 5 placas diferentes de Arduino, o card funciona direto no computador, portanto nao é nele o problema
retirei o shield e montei direto no protoboard, mesmo assim nao consegue inicializar o cartao! :0
Pronto, voltou a funcionar, a bagaça!
100 diretório com 5 arquivos em cada diretório= 500 arquivos
110 arquivos no diretório raiz
total 610 arquivos
tempo médio para pesquisar um file, abrir, gravar um dado e fechar = +- 1 segundo
Tá bom não Bubulindo?
Kotch:
100 diretório com 5 arquivos em cada diretório= 500 arquivos
110 arquivos no diretório raiz
total 610 arquivostempo médio para pesquisar um file, abrir, gravar um dado e fechar = +- 1 segundo
Isto mostrando o inicio da operação e fim, na porta serial (DEBUG), isto será inibido pois não preciso desta informação aí o tempo será menor.
8)
ok... imaginemos 700 ms.
500 * 700ms = 350 segundos...
350/60 ~= 6 minutos.
Se isto for para controlo de entradas, prepara-te para ter pessoas a berrar que o sistema não funciona. Obviamente que isto é a pior situacão possível, mas mesmo se olhares para um valor mediano de 3 minutos ainda me parece exagerado. Mas eu sei pouco sobre onde vai ser implementado.
Achas que 3 minutos é aceitável para o sítio onde isto vai ser implementado?
Não ligues a isto... devia deixar de escrever em Fóruns logo após acordar.
Testaste com vários ficheiros?
Eu diria que a prova de fogo para esta aplicacão seria fazeres um programinha simples para pesquisar e fazer as operacões que normalmente fará em todos os ficheiros do cartão (os tais 500) e guardar os tempos para cada um deles.
Isto pode ser um pouco problemático em termos de memória talvez, então talvez consigas fazer uma média para garantir que o tempo médio de acesso seria mais ou menos 1 segundo.
bubulindo:
ok... imaginemos 700 ms.500 * 700ms = 350 segundos...
350/60 ~= 6 minutos.
Achas que 3 minutos é aceitável para o sítio onde isto vai ser implementado?Testaste com vários ficheiros?
Eu diria que a prova de fogo para esta aplicacão seria fazeres um programinha simples para pesquisar e fazer as operacões que normalmente fará em todos os ficheiros do cartão (os tais 500) e guardar os tempos para cada um deles.
Isto pode ser um pouco problemático em termos de memória talvez, então talvez consigas fazer uma média para garantir que o tempo médio de acesso seria mais ou menos 1 segundo.
Nao entendi esta sua conta, mas tudo bem.
Sim fiz um programa pra fazer buscas no diretorio do cartao em 600 files , procurar, abrir, escrever e fechar e o tempo medio pa qualquer acesso foi em torno de quase um segundo.
E é pra acesso mesmo a aplicação, não pode falhar, XD
Repara qeu eu risquei o que tinha escrito e meti o porquê. LOL
Não percebi que ia pesquisar o ficheiro no meio dos 500, daí a conta estapafúrdia.
1 segundo é muito bom e ainda melhor, podes adicionar dados ao cartão com um computador directo no cartão sem usar o Arduino. Talvez tenhas de ter cuidado com os caracteres que usas (para não usares extended ascii), mas isso é uma preocupacão menor.
Bom trabalho!!
Boa noite amigos!
estou desenvolvendo a mesma ideia do caro amigo Kotch,
Kotch seria possível postar o codigo Fonte ?
grato pela atenção!
Bom dia,
Você pode disponibilizar a rotina de ler e gravar os arquivos no SD?
Leio o conteúdo das TAG's RFID e armazeno em uma variável,
estou usando a função SD.exists(var); sendo que var é do tipo String no caso var = TAG + ".txt";
só que a função não aceita variáveis String,
podem de dar uma luz?