Go Down

Topic: BANCO DE DADOS sd card! (Read 5245 times) previous topic - next topic

Kotch

To querendo fazer um [font=Verdana]banco de dados em arquivo texto num sd card[/font],

Alguém ja fez um?
Alguém teria um exemplo?

Ideias são bem-vindas!

Obrigado!

:smiley-eek:
????????????????????

bubulindo

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? :)
This... is a hobby.

Kotch

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?

:smiley-roll:
????????????????????

Kotch


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


Sim, funcional!

:smiley-roll:

Obrigado!
????????????????????

bubulindo

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:

Code: [Select]

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:
Code: [Select]

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. :\

This... is a hobby.

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...
This... is a hobby.

Kotch


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!

;)

????????????????????

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.
This... is a hobby.

Kotch


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 !

:)

????????????????????

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. :\

This... is a hobby.

Kotch


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?

:smiley-roll:
????????????????????

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)
????????????????????

bubulindo

#13
Mar 09, 2013, 11:49 pm Last Edit: Mar 10, 2013, 02:08 am by bubulindo Reason: 1
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.

This... is a hobby.

Kotch


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. :D
E é pra acesso mesmo a aplicação, não pode falhar,  XD



8)
????????????????????

Go Up