



Hoje vamos aprender a gravar dados e ler informações usando um cartão Micro SD com Arduino. Vários shields para cartões SD estão disponíveis no mercado para conectar esses práticos cartões de memória ao Arduino. Nesse artigo, vamos usar o Micro SD Card Adapter conectado a um Arduino Uno.
O cartão micro SD com Arduino permite o desenvolvimento de dataloggers. Dispositivos que armazenam dados coletados de sensores e outros informações para análise e construção de gráficos.
Os cartões SD e micro SD diferem apenas em tamanho, como o próprio nome sugere. Ambos são cartões com memórias Flash integradas. O tamanho da memória varia muito e hoje já é possível encontrar cartões com dezenas de GB. Para conhecer mais sobre a memória Flash e sua história, acesse esse artigo sobre história das mídias.
A figura abaixo mostra o SD card adapter que vamos usar em nosso projeto. Também existem shields específicos de datalogger integrados com RTC(Real Time Clock) para aplicações de telemetria e monitoramento de sensores.

O módulo é eficiente e compacto. Além de prático de usar e integrar em sistemas de hardware e controle, foi desenvolvido tendo em vista otimizar o trabalho de projetistas, estudantes e hobistas na construção de sistemas de datalogger e armazenamento de dados.
Basicamente, o módulo possui uma entrada para cartões Micro SD com todos os 6 pinos de interface disponibilizados para comunicação com Arduino. Por meio dos pinos SPI(protocolo de comunicação usado para ler e escrever dados na memória Flash do cartão), podemos ligar o Arduino e enviar informações para serem armazenadas. Também é possível fazer procedimentos de leitura para apresentar os dados gravados em mostradores como displays ou na interface serial.
A interface SPI que permite ler e gravar dados na memória Flash é baseada em 6 canais:
| Pino | Descrição | Outros nomes |
| CS | Slave Select | SS, nCS, nSS |
| SCK | System Clock | SCLK, CLK |
| MOSI | Master Our Slave In | SDO, DO, SO |
| MISO | Master In Slave Out | SDI, DI,SI |
| VCC | Alimentação positiva | |
| GND | Terra |

As especificações do módulo são as seguintes:
Pelo fato de o cartão SD poder ser retirado e inserido sempre que necessário para transferir os arquivos para o computador e plotar gráficos para análise, o módulo é ideal para desenvolvimento de dataloggers.
As aplicações de dataloggers são diversas. Qualquer sistema no qual seja necessário armazenar dados para análise futura são candidatos a receberam a integração de um datalogger. Dentre as aplicações, podemos citar:
Para este projeto, vamos desenvolver o seguinte:
" Fazer a leitura de um sensor ultrassônico e gravar as leituras de distâncias(entre o sensor e um obstáculo) fornecidas pelo sensor em um cartão micro SD"
Materiais necessários para o projeto de um Datalogger
Um ponto importante é que apesar de a alimentação do Módulo adaptador ser 5V, os sinais MISO, MOSI e SCK são de 3.3V. Ou seja, é necessário utilizar um CI para converter os níveis lógicos, ou então, usar três divisores de tensão para fazer abaixar os sinais de 5V do Arduino para 3.3V do lado do cartão SD. A solução com divisores de tensão, por ser mais simples e prática será a adotada em nosso projeto.
Dito isso e de posse de todos os componentes, podemos montar o circuito conforme a figura abaixo:
Caso ainda não conheça o funcionamento e implementação de projetos com sensores ultrassônicos, visite esse post exclusivo e saiba tudo sobre o sensor HC-SR04 e como fazer projetos com ele.
Vamos entender o software desenvolvido que faz a gravação no cartão. Veja o código abaixo:
#include <SPI.h>
#include <SD.h>
#include <stdlib.h>
//Variaveis para cartao SD
const int CS = 4;
char dataString[7];
File meuArquivo;
//Variaveis para sensor ultrassonico
int PinTrigger = 3;//Pino usado para disparar os pulsos do sensor
int PinEcho = 2;//pino usado para ler a saida do sensor
float TempoEcho=0;
const float VelocidadeSom_mpors = 340;//em metros por segundo
const float VelocidadeSom_mporus = 0.000340;//em metros por microsegundo
void setup()
{
// configura pino de Trigger como saída e inicializa com nivel baixo
pinMode(PinTrigger,OUTPUT);
digitalWrite(PinTrigger,LOW);
pinMode(PinEcho,INPUT);// configura pino ECHO como entrada
pinMode(CS, OUTPUT);
Serial.begin(9600);
delay(100);
Serial.print("Inicializando cartao SD...");
if (!SD.begin(CS))
{
Serial.println("Falha na Inicializacao!");
return;
}
Serial.println("Inicializacao terminada");
}
void loop()
{
float val;
//Envia pulso para o disparar o sensor
DisparaPulsoUltrassonico();
//Mede o tempo de duracao do sinal no pino de leitura(us)
TempoEcho = pulseIn(PinEcho, HIGH);
val = CalculaDistancia(TempoEcho);
//adiciona a ultima leitura a string de gravacao
dtostrf(val,5,2,dataString);
if (meuArquivo = SD.open("log.txt",FILE_WRITE))
{
Serial.println("Gravou");
Serial.println(val);
//Escreve no cartao SD por meio do objeto meuArquivo
meuArquivo.println(dataString);
meuArquivo.close();
}
else
{
// se o arquivo nao abrir, mostra msg de erro
Serial.println("Erro ao abrir log.txt");
}
delay(2000);
}
//Funcao para enviar o pulso de trigger
void DisparaPulsoUltrassonico()
{
// Para fazer o HC-SR04 enviar um pulso ultrassonico, nos temos
// que enviar para o pino de trigger um sinal de nivel alto
// com pelo menos 10us de duracao
digitalWrite(PinTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(PinTrigger, LOW);
}
//Funcao para calcular a distancia em metros
float CalculaDistancia(float tempo_us)
{
return ( (tempo_us* VelocidadeSom_mporus) / 2 );
}
Você também pode conferir o código completo e atualizado visitando o repositório desse post no GitHub da Eletrogate.
Para esse projeto precisamos adicionar três bibliotecas:
As duas primeiras são para gravar o cartão SD. A última é para podermos utilizar a função dtostr(), que converte um float para uma string. Para gravar o cartão declaramos um array de caracteres e um objeto do tipo FILE, que chamamos de meuArquivo.
As demais variáveis são relativas ao sensor ultrassônico e às configurações de IOs. Para conhecer as funções e como funciona a parte do software relativo ao sensor ultrassônico, acesse esse artigo.
Na função void Setup() nós inicializamos a porta serial e o cartão SD por meio da função SD.begin(CS), em que CS é o pino no qual está ligado o sinal de ChipSelect do cartão.
Na função void loop() o procedimento consiste em monitorar a saída do sensor HC-SR04, ler os seus valores e salvá-los no cartão SD em um arquivo .txt com o nome log.txt. Após ler o sensor nós convertemos o valor para um conjunto de caracteres por meio da função dtostr() e logo em seguida nós abrimos o arquivo log.txt com a função SD.Open() e escrevemos a string no arquivo por meio da função meuArquivo.println(). Após o procedimento de escrita nós fechamos o arquivo com a função SD.close().
Veja como ficou o resultado final:


Arquivo log.txt:


Neste exemplo nós fizemos um simples datalogger para monitorar os sinais de um sensor ultrassônico. Todas as leituras do sensor, que foram feitas a uma taxa de 2 segundos, são gravadas no cartão micro SD por meio do protocolo SPI. O adaptador pode ser facilmente integrado em qualquer sistema eletrônico. O cartão micro SD pode ser facilmente retirado e levado para qualquer outro lugar para que os dados sejam usados para plotar gráficos e construir tabelas.
Não se esqueça de aproveitar esse artigo e ler o post sobre sensor ultrassônico. Até a próxima!
|
Hoje vamos aprender a gravar dados e ler informações usando um cartão Micro SD com Arduino. Vários shields para cartões SD estão disponíveis no mercado para conectar esses práticos cartões de memória ao Arduino.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200
Respostas de 11
muito bom! parabéns!!
Por acaso tem como fazer um datalogger do sensor ultrassônico na qual marca somente os momentos em q ele foi ativado a uma distância menor que 20cm?
Olá, Tiago! Obrigado pelo seu comentário, que bom que o artigo te ajudou!
É possível fazer esse datalogger sim. Nesse caso, você tem que fazer uma pequena modificação no código. Um exemplo é modificar a condição do if dentro da função void loop. Ficaria mais ou menos assim:
if (meuArquivo = SD.open(“log.txt”,FILE_WRITE) && val < X) sendo que X é valor que você quer definir como limiar para fazer as gravações. Assim, a condição somente será verdadeira se o arquivo for aberto corretamente e se a distância determinada pelo sensor for menor do que X.
Lembre-se que a função CalculaDistancia() faz o cáculo da distância em metros. Assim, use os valores de X convertidos para metros, ou modifique a função para retornar os valores em centímetros.
Espero que tenha ajudado,
Abraço
olá Vitor , infelizmente não funcionou :
if (meuArquivo = SD.open(“log.txt”,FILE_WRITE) && val < X)
botei X= 0.2 ( =2 cm)
no match for 'operator='(operand types are SDLib::File' and 'bool')
Olá, Tiago!
Tente separar os ifs:
if( val < X)
if( meuArquivo = SD.open("log.txt",FILE_WRITE) )
.
.
.
O erro foi que o sinal de = não é um operador lógico. Ao colocar o && o compilador interpretou dessa forma.
A função SD.open retorna falso caso o arquivo log.txt não possa ser aberto, e se o arquivo abrir corretamente, retorna um objeto com referência ao arquivo aberto, daí a ideia de usar "=" ao invés de "==", para atribuir a referência à meuArquivo.
Acho que separando deve compilar sem problemas.
ok!
Obrigado pela atenção Victor!
tem como ser no arduino nano?
Grande Maciel, a princípio tem como sim!
O Nano possui I/Os digitais suficientes para ligar o módulo SD e o sensor ultrassônico. Não cheguei a gravar esse programa com o Nano mas como as bibliotecas SD.h e SPI.h são nativas da IDE Arduino, acredito que não tem problemas.
Encontrei um exemplo ráido que usa o Nano(fique atento aos níveis lógicos da interface com o SD, nem sempre o pessoal faz a conversão 5 para 3.3):
http://lab.dejaworks.com/arduino-nano-sd-card-connection/
Abraço
Obrigado Vitor!
Muito obrigado Vitor!!
Por acaso vc tem algum tutorial pra inserir o DS3231 Real Time Clock module cm hc-SR04 e o cartao SD?
Vc tendo esse tutorial vou encomendar uns dispositivos pra começar a montar aki….ab!
Bom dia Tiago,
Veja esse tutorial com o RTC DS3231 no Blog da Eletrogate:
https://blog.eletrogate.com/rtc-real-time-clock-ds1302-1307-e-3231/
Atenciosamente.
Obrigado José!