BANCO DE DADOS sd card!

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!

:astonished:

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? :slight_smile:

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?

:roll_eyes:

bubulindo:
Tipo SQL?
Mas queres algo funcional? Ou apenas prova de conceito?

Sim, funcional!

:roll_eyes:

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!

:wink:

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 !

:slight_smile:

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?

:roll_eyes:

Kotch:
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

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. :smiley:
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!! :slight_smile:

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?