Módulo de cartão SD no Arduino: datalogger em CSV com data e hora do RTC
Guia do módulo de cartão SD no Arduino: ligação SPI, formatação em FAT32, registro de sensores em CSV com data e hora do RTC, SD_MMC no ESP32, Pico e como resolver o erro initialization failed.
Um módulo de cartão SD para Arduino é uma plaquinha pequena e barata que permite salvar em um cartão micro SD, como arquivos, as leituras de temperatura, umidade, distância ou localização dos seus sensores. É o jeito mais fácil de montar um datalogger (registrador de dados) que mede por dias ou até meses sem nenhum computador ligado: o Arduino faz as leituras, o módulo grava cada uma como uma nova linha em um arquivo CSV no cartão e, depois, você coloca o cartão no computador e monta um gráfico com os dados no Excel. O módulo se comunica por SPI e funciona com poucas linhas de código usando a biblioteca SD, que já vem com a Arduino IDE.
Neste guia você vai aprender, passo a passo, como o módulo funciona, a diferença entre os módulos de 5 V e de 3,3 V, a ligação SPI no Arduino Uno, no Mega, no ESP32 e no Raspberry Pi Pico, como formatar o cartão em FAT32, como gravar e ler arquivos e como manter um registro em CSV com data e hora usando um módulo RTC. Também falamos da interface rápida SD_MMC do ESP32, do uso de cartão SD no Pico com MicroPython e de como resolver o famoso erro “initialization failed”.

O que é um módulo de cartão SD e como ele funciona?
Cartões SD funcionam com 3,3 V e podem se comunicar de duas formas: o modo SD nativo, que é rápido, e o modo SPI, mais simples. Microcontroladores como o Arduino conversam com o cartão por SPI. A função do módulo é deixar os dois eletricamente compatíveis: o regulador reduz os 5 V para os 3,3 V de que o cartão precisa, e um CI conversor de nível lógico (geralmente um 74LVC125A) converte os sinais de 5 V do Arduino para os 3,3 V que o cartão suporta. Por dentro, o cartão é formado por blocos de 512 bytes, enquanto conceitos como arquivos, pastas e nomes de arquivo ficam por conta do sistema de arquivos FAT. A biblioteca SD faz todo esse trabalho pesado para você; basta abrir um arquivo, gravar nele e fechá-lo.
| Característica | Valor |
|---|---|
| Interface | SPI (MISO, MOSI, SCK, CS) |
| Alimentação (módulo micro SD com regulador) | 4,5–5,5 V, regulador de 3,3 V na placa |
| Nível de sinal | Compatível com 3,3 V e 5 V (graças ao conversor de nível lógico) |
| Cartões suportados | micro SD (até 2 GB) e micro SDHC (4–32 GB) |
| Sistema de arquivos | FAT16 ou FAT32 |
| Corrente | Alguns mA em repouso, até 100 mA durante a gravação |
| Nome de arquivo (biblioteca SD do Arduino) | Formato 8.3: até 8 caracteres no nome + 3 na extensão |
Módulo de cartão SD de 5 V ou de 3,3 V: qual comprar?
| Tipo de módulo | Alimentação | Nível de sinal | Indicado para |
|---|---|---|---|
| Módulo micro SD com regulador (74LVC125A) | 5 V | 3,3 V e 5 V | Uno, Nano, Mega; ESP32 e Pico quando alimentado com 5 V |
| Módulo de cartão SD tamanho padrão (pinos +5 e +3.3) | 5 V ou 3,3 V | A maioria não tem um conversor de nível de verdade | Placas de 3,3 V; pouco confiável com sinais de 5 V |
| Módulo micro SD sem regulador (só o slot) | Só 3,3 V | Só 3,3 V | ESP32, Raspberry Pi Pico |
| Placas com slot integrado (como a ESP32-CAM) | Pela própria placa | 3,3 V | Usado diretamente com SD_MMC |
Se você usa um Arduino Uno, Nano ou Mega, escolha um módulo micro SD com regulador e conversor de nível, como o da foto, e ligue o VCC ao pino 5V. O ESP32 e o Pico funcionam com 3,3 V; você também pode usar o mesmo módulo com eles, mas ainda deve alimentá-lo com 5 V (VIN no ESP32, VBUS no Pico quando ele está alimentado pela USB). Como o conversor de nível é alimentado com 3,3 V, o sinal MISO que volta para o microcontrolador já sai em 3,3 V. Módulos sem regulador vão direto no pino 3V3; se você precisar usar um deles com um Arduino de 5 V, coloque um divisor de tensão de 1 kΩ + 2 kΩ em cada uma das linhas MOSI, SCK e CS, ou use um conversor de nível lógico. Você pode conferir os valores dos resistores com a calculadora de divisor de tensão.
Ligação do módulo de cartão SD: pinos SPI
| Pino do módulo | Arduino Uno / Nano | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| GND | GND | GND | GND | GND |
| VCC | 5V | 5V | VIN (5 V) | VBUS (5 V) |
| MISO | D12 | D50 | GPIO 19 | GP16 |
| MOSI | D11 | D51 | GPIO 23 | GP19 |
| SCK | D13 | D52 | GPIO 18 | GP18 |
| CS | D10 | D53 | GPIO 5 | GP17 |
MISO, MOSI e SCK precisam ir para os pinos de SPI por hardware em todas as placas; já o CS (chip select) pode ser qualquer pino digital, desde que você passe o mesmo número para SD.begin() no código. Nos shields prontos, o CS costuma ser o D4 ou o D10. Você pode ligar vários dispositivos ao mesmo barramento SPI: todos compartilham MISO, MOSI e SCK, e cada um tem o seu próprio pino CS. Explicamos em detalhes como o SPI funciona em comunicação SPI. Para ver onde ficam os pinos na sua placa, use a ferramenta Pinagem.
Preparando o cartão SD: formatação em FAT32
- Tamanho do cartão: escolha um cartão micro SDHC entre 4 e 32 GB. A biblioteca SD do Arduino suporta cartões SDSC (até 2 GB) e SDHC; os cartões SDXC de 64 GB ou mais vêm formatados em exFAT, que essa biblioteca não consegue ler.
- Sistema de arquivos: formate o cartão em FAT32 (FAT16 também funciona em cartões de 2 GB ou menos). NTFS e exFAT não funcionam.
- Windows: clique com o botão direito no cartão no Explorador de Arquivos, escolha Formatar e selecione FAT32 como sistema de arquivos e o tamanho da unidade de alocação padrão. O Windows não oferece FAT32 para cartões maiores que 32 GB.
- macOS: selecione o cartão no Utilitário de Disco, clique em Apagar e escolha MS-DOS (FAT) como formato e Registro Mestre de Inicialização (Master Boot Record) como esquema.
- A opção mais segura: o programa gratuito SD Card Formatter, da SD Association, formata o cartão de acordo com o padrão oficial e elimina a maioria dos erros estranhos.
- Partição única: o cartão deve ter só uma partição. Cartões usados antes em um Raspberry Pi ou em uma câmera podem ainda ter várias partições; apague-as antes de formatar.
Primeiro teste passo a passo: gravando e lendo o cartão SD
- Coloque o cartão formatado no módulo e ligue o módulo ao Arduino seguindo a tabela acima.
- A biblioteca SD já vem com a Arduino IDE, então não há nada para instalar; basta incluir SPI.h e SD.h no início do sketch.
- Carregue o código abaixo e abra o Monitor Serial a 9600 baud.
- Se aparecer “tamam” (OK, em turco) e o conteúdo do arquivo, o cartão e a ligação estão certos. Uma nova linha é acrescentada ao TEST.TXT toda vez que a placa liga.
- Quando você tirar o cartão e colocá-lo no computador, pode abrir o TEST.TXT em qualquer editor de texto.
1#include <SPI.h>
2#include <SD.h>
3
4const int CS_PIN = 10; // modülün CS pini / module CS pin
5
6void setup() {
7 Serial.begin(9600);
8 Serial.print(F("SD kart baslatiliyor... "));
9 if (!SD.begin(CS_PIN)) { // kart başlatılamadı / card init failed
10 Serial.println(F("initialization failed"));
11 while (true); // burada dur / stop here
12 }
13 Serial.println(F("tamam"));
14
15 File dosya = SD.open("TEST.TXT", FILE_WRITE); // yoksa oluşturur, sona ekler / creates it, appends
16 if (dosya) {
17 dosya.println(F("Merhaba BlueGrays!"));
18 dosya.close(); // tamponu karta yazar / flushes the buffer to the card
19 Serial.println(F("TEST.TXT yazildi"));
20 } else {
21 Serial.println(F("TEST.TXT acilamadi")); // dosya açılamadı / could not open file
22 }
23
24 dosya = SD.open("TEST.TXT"); // okumak için aç / open for reading
25 if (dosya) {
26 Serial.print(F("Boyut (bayt): "));
27 Serial.println(dosya.size());
28 while (dosya.available()) {
29 Serial.write(dosya.read()); // içeriği seri porta yaz / print contents to serial
30 }
31 dosya.close();
32 }
33}
34
35void loop() {
36}| Função | O que faz |
|---|---|
| SD.begin(cs) | Inicializa o cartão; retorna true se der certo |
| SD.open("NOME.TXT", FILE_WRITE) | Abre o arquivo para gravação; cria o arquivo se ele não existir e acrescenta no final se já existir |
| SD.open("NOME.TXT") | Abre o arquivo para leitura (FILE_READ) |
| file.print() / println() (gravar) | Grava um texto ou um número no arquivo |
| file.flush() | Grava no cartão os dados do buffer sem fechar o arquivo |
| file.close() | Grava no cartão os dados restantes e fecha o arquivo |
| file.available() / read() (leitura) | Verifica se ainda há bytes para ler / lê um byte |
| SD.exists() / SD.remove() / SD.mkdir() (verificar / apagar / criar pasta) | Verifica se um arquivo existe / apaga um arquivo / cria uma pasta |
Registro de sensores em CSV com data e hora do RTC
O formato de arquivo mais prático para um datalogger é o CSV (valores separados por vírgula): cada linha é uma medição, cada coluna é um valor e a primeira linha traz os títulos das colunas. Para saber quando cada leitura foi feita, você deve acrescentar a data e a hora em todas as linhas. A millis() só informa há quanto tempo o Arduino está ligado e volta a zero toda vez que ele reinicia, por isso usamos um módulo RTC (relógio de tempo real) com bateria tipo moeda. O RTC continua contando o tempo mesmo com o Arduino desligado. O DS1307 é barato, mas pode atrasar ou adiantar alguns segundos por dia, enquanto o DS3231 desvia só cerca de um minuto por ano graças ao seu cristal com compensação de temperatura. Comparamos os dois em módulos de relógio RTC.

O circuito: o módulo SD vai nos pinos SPI, como na tabela acima, o módulo RTC vai no barramento I2C (no Uno, SDA = A4, SCL = A5, VCC = 5V) e o pino de dados do sensor DHT22 vai no D2; se você estiver usando o sensor sem placa, coloque um resistor de 10 kΩ entre o pino de dados e o VCC. Instale as bibliotecas RTClib (Adafruit) e DHT sensor library pelo Gerenciador de Bibliotecas. Para os detalhes da ligação do sensor, veja sensor de temperatura e umidade DHT11 e DHT22.
1#include <SPI.h>
2#include <SD.h>
3#include <Wire.h>
4#include <RTClib.h>
5#include <DHT.h>
6
7const int CS_PIN = 10; // SD modülü CS / SD module CS
8const unsigned long ARALIK = 10000; // 10 saniyede bir kayıt / log every 10 seconds
9
10RTC_DS1307 rtc; // DS3231 için RTC_DS3231 / RTC_DS3231 for a DS3231
11DHT dht(2, DHT22); // veri pini D2, DHT11 de olur / data pin D2, DHT11 also works
12unsigned long sonKayit = 0;
13
14void setup() {
15 Serial.begin(9600);
16 dht.begin();
17 if (!rtc.begin()) {
18 Serial.println(F("RTC bulunamadi")); // RTC yok / RTC not found
19 while (true);
20 }
21 if (!rtc.isrunning()) { // saat hiç kurulmamış / clock never set
22 rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // derleme anına kur / set to compile time
23 }
24 if (!SD.begin(CS_PIN)) {
25 Serial.println(F("SD kart hatasi")); // SD başlatılamadı / SD init failed
26 while (true);
27 }
28 if (!SD.exists("VERI.CSV")) { // yeni dosyaya başlık satırı / header row for a new file
29 File f = SD.open("VERI.CSV", FILE_WRITE);
30 if (f) {
31 f.println(F("tarih,saat,sicaklik_C,nem_yuzde"));
32 f.close();
33 }
34 }
35}
36
37void loop() {
38 if (millis() - sonKayit < ARALIK) return; // zamanı gelmedi / not time yet
39 sonKayit = millis();
40
41 float t = dht.readTemperature();
42 float h = dht.readHumidity();
43 if (isnan(t) || isnan(h)) { // sensör okunamadı / sensor read failed
44 Serial.println(F("DHT okuma hatasi"));
45 return;
46 }
47
48 DateTime simdi = rtc.now();
49 char ts[8], hs[8], satir[48];
50 dtostrf(t, 1, 1, ts); // AVR'de sprintf %f desteklemez / AVR sprintf has no %f
51 dtostrf(h, 1, 1, hs);
52 snprintf(satir, sizeof(satir), "%04d-%02d-%02d,%02d:%02d:%02d,%s,%s",
53 simdi.year(), simdi.month(), simdi.day(),
54 simdi.hour(), simdi.minute(), simdi.second(), ts, hs);
55
56 File f = SD.open("VERI.CSV", FILE_WRITE); // sona ekle / append
57 if (f) {
58 f.println(satir);
59 f.close(); // her kayıtta kapat: güç kesilse de veri kalır / close every time so data survives a power cut
60 Serial.println(satir);
61 } else {
62 Serial.println(F("VERI.CSV acilamadi"));
63 }
64}A cada 10 segundos, o código lê a temperatura e a umidade, pega a data e a hora do RTC e acrescenta uma linha como 2026-11-04,14:05:30,23.5,45.2 ao final do VERI.CSV. Como o arquivo é fechado depois de cada registro, os dados gravados até ali não se perdem nem com uma queda de energia. Nas placas AVR, a sprintf() não aceita números de ponto flutuante (%f), por isso os valores primeiro são convertidos em texto com dtostrf(). Como a temporização usa millis() em vez de delay(), você também pode fazer outras coisas no loop(). Se o RTC nunca foi acertado, o relógio é ajustado para o momento em que o código foi compilado. Se você usa um DS3231, basta escrever RTC_DS3231 no lugar de RTC_DS1307 e verificar lostPower() no lugar de isrunning().
Quanto espaço isso ocupa? Uma linha tem cerca de 31 bytes. Gravando a cada 10 segundos, são 8.640 linhas por dia, ou cerca de 260 KB; em um ano, dá uns 95 MB. Ou seja, nesse ritmo um cartão de 8 GB dura décadas. O limite real não é o cartão, e sim a alimentação: se o projeto vai rodar com pilhas ou bateria, calcule antes quanto tempo elas vão durar com a calculadora de autonomia da bateria.
Abrindo os dados do cartão SD no Excel
- Desligue a alimentação do Arduino, tire o cartão do módulo e coloque-o no computador.
- Copie o VERI.CSV para o computador; trabalhar com uma cópia é mais seguro do que trabalhar direto no cartão.
- Abra uma pasta de trabalho em branco no Excel e escolha o arquivo em Dados > De Texto/CSV.
- Na janela de visualização, selecione Vírgula como delimitador e clique em Carregar; as colunas são separadas em data, hora, temperatura e umidade.
- Selecione as colunas de temperatura e umidade e adicione um gráfico de linhas pela guia Inserir para ver como elas variam ao longo do tempo.
1// Excel'de ondalık ayırıcı virgülse / if Excel uses a decimal comma
2// Bu iki fonksiyonu kayıt kodunda loop()'un üstüne ekle / add these two functions above loop() in the logging sketch
3void noktayiVirgulYap(char *s) {
4 for (; *s; s++) {
5 if (*s == '.') *s = ','; // 23.5 -> 23,5
6 }
7}
8
9void excelSatiri(char *satir, size_t boyut, const DateTime &simdi, char *ts, char *hs) {
10 noktayiVirgulYap(ts);
11 noktayiVirgulYap(hs);
12 snprintf(satir, boyut, "%04d-%02d-%02d;%02d:%02d:%02d;%s;%s", // ayırıcı ; / separator ;
13 simdi.year(), simdi.month(), simdi.day(),
14 simdi.hour(), simdi.minute(), simdi.second(), ts, hs);
15}
16
17// loop() içinde snprintf satırının yerine / in loop(), replace the snprintf line with:
18// excelSatiri(satir, sizeof(satir), simdi, ts, hs);
19// Başlık satırı da / header row too: tarih;saat;sicaklik_C;nem_yuzdeSe você prefere enviar as leituras ao vivo para o Excel enquanto o Arduino está ligado ao computador, sem tirar o cartão, dê uma olhada nos métodos Data Streamer e PLX-DAQ em enviar dados do Arduino para o Excel. Já o cartão SD é indispensável em projetos que funcionam em campo, longe de qualquer computador.
Usando cartão SD com o ESP32 (SPI)
O core Arduino do ESP32 vem com a sua própria biblioteca SD, que funciona quase do mesmo jeito, mas há três diferenças importantes: os caminhos dos arquivos começam com / (“/olcumler.csv”), nomes de arquivo longos são permitidos e FILE_WRITE sobrescreve o arquivo do zero. Para acrescentar dados no final, você precisa usar FILE_APPEND; se levar o código do Uno sem mudanças, os dados antigos serão apagados toda vez que a placa ligar. Os pinos SPI padrão são SCK 18, MISO 19 e MOSI 23, e o GPIO 5 costuma ser usado como CS. Também dá para ler o tipo e o tamanho do cartão com uma única linha:
1#include <SPI.h>
2#include <SD.h>
3
4const int CS_PIN = 5; // VSPI: SCK 18, MISO 19, MOSI 23 / default VSPI pins
5const char *DOSYA = "/olcumler.csv"; // yol / ile başlar / path starts with /
6
7void setup() {
8 Serial.begin(115200);
9 if (!SD.begin(CS_PIN)) { // varsayılan SPI hızı 4 MHz / default SPI clock 4 MHz
10 Serial.println("Card Mount Failed");
11 return;
12 }
13 uint8_t tur = SD.cardType();
14 if (tur == CARD_NONE) {
15 Serial.println("Kart takili degil"); // kart yok / no card inserted
16 return;
17 }
18 Serial.printf("Kart tipi: %s\n", tur == CARD_SDHC ? "SDHC" : (tur == CARD_SD ? "SDSC" : "MMC"));
19 Serial.printf("Boyut: %llu MB\n", SD.cardSize() / (1024 * 1024));
20
21 if (!SD.exists(DOSYA)) { // uzun dosya adı serbest / long file names are fine
22 File f = SD.open(DOSYA, FILE_WRITE); // FILE_WRITE dosyayı sıfırlar / FILE_WRITE truncates
23 if (f) {
24 f.println("sure_s,isik_ham");
25 f.close();
26 }
27 }
28}
29
30void loop() {
31 File f = SD.open(DOSYA, FILE_APPEND); // ESP32'de sona ekleme / append on ESP32
32 if (f) {
33 f.printf("%lu,%d\n", millis() / 1000, analogRead(34)); // GPIO34'teki LDR / LDR on GPIO34
34 f.close();
35 }
36 delay(5000);
37}O código grava a cada 5 segundos o valor bruto (0–4095) de um LDR ligado ao GPIO 34. No ESP32 você nem precisa de um módulo RTC para ter a hora real: dá para conectar ao Wi-Fi, pegar a hora de um servidor NTP e acrescentar a data e a hora em cada linha com getLocalTime(). Se os fios forem longos ou o cartão estiver instável, reduza a velocidade do SPI: SD.begin(5, SPI, 1000000) inicia o cartão a 1 MHz. Em um registrador alimentado por bateria, usar deep sleep entre as leituras multiplica a autonomia.
ESP32 SD_MMC: a interface SD rápida e a ESP32-CAM
Além do SPI, o ESP32 também tem um controlador SDMMC que fala o protocolo rápido do próprio cartão. No modo de 4 bits, a biblioteca SD_MMC é várias vezes mais rápida que o SPI, o que a torna ideal para arquivos grandes, como fotos ou áudio. No ESP32 clássico os pinos são fixos: CLK GPIO 14, CMD GPIO 15, D0 GPIO 2, D1 GPIO 4, D2 GPIO 12, D3 GPIO 13, e essas linhas precisam de resistores de pull-up de 10 kΩ. No modo de 1 bit só CLK, CMD e D0 são usados; é mais lento, mas libera os GPIO 4, 12 e 13. O slot micro SD da placa ESP32-CAM está ligado a esses pinos, e usar o modo de 1 bit impede que o LED de flash no GPIO 4 pisque a cada acesso ao cartão.
1#include "FS.h"
2#include "SD_MMC.h"
3
4void setup() {
5 Serial.begin(115200);
6 // 1-bit mod: yalnız CLK 14, CMD 15, D0 2 / 1-bit mode: only CLK 14, CMD 15, D0 2
7 if (!SD_MMC.begin("/sdcard", true)) {
8 Serial.println("SD_MMC baglanamadi"); // kart bağlanamadı / mount failed
9 return;
10 }
11 Serial.printf("Bos alan: %llu MB\n", (SD_MMC.totalBytes() - SD_MMC.usedBytes()) / (1024 * 1024));
12
13 File f = SD_MMC.open("/gunluk.txt", FILE_APPEND);
14 if (f) {
15 f.println("ESP32-CAM acildi"); // açılış kaydı / boot log line
16 f.close();
17 }
18}
19
20void loop() {
21}Cartão SD com o Raspberry Pi Pico (MicroPython)
No MicroPython, os cartões SD são controlados pelo driver sdcard.py do micropython-lib. Se você tem o mpremote no computador, instale-o com mpremote mip install sdcard, ou copie o arquivo para o Pico com o Thonny. O cartão é montado como a pasta /sd com os.mount() e, a partir daí, você o usa com os comandos comuns de arquivo do Python (open, write). O código abaixo lê o sensor de temperatura interno do Pico e grava uma linha CSV a cada 10 segundos. Se você está começando com o Pico, leia antes O que é o Raspberry Pi Pico?.
1from machine import Pin, SPI, ADC
2import os, time
3import sdcard # micropython-lib sürücüsü / micropython-lib driver
4
5spi = SPI(0, baudrate=1000000, sck=Pin(18), mosi=Pin(19), miso=Pin(16))
6sd = sdcard.SDCard(spi, Pin(17, Pin.OUT)) # CS = GP17; kart yoksa OSError / OSError if no card
7os.mount(os.VfsFat(sd), "/sd") # kart artık /sd klasörü / the card is now the /sd folder
8
9sensor = ADC(4) # dahili sıcaklık sensörü / internal temperature sensor
10DOSYA = "/sd/pico_log.csv"
11
12if "pico_log.csv" not in os.listdir("/sd"): # yeni dosyaya başlık / header for a new file
13 with open(DOSYA, "w") as f:
14 f.write("tarih,saat,sicaklik_C\n")
15
16while True:
17 v = sensor.read_u16() * 3.3 / 65535
18 t = 27 - (v - 0.706) / 0.001721 # RP2040 veri sayfası formülü / RP2040 datasheet formula
19 y, ay, g, sa, dk, sn = time.localtime()[:6]
20 with open(DOSYA, "a") as f: # "a" = sona ekle / append
21 f.write("{:04d}-{:02d}-{:02d},{:02d}:{:02d}:{:02d},{:.1f}\n".format(y, ay, g, sa, dk, sn, t))
22 print(sa, dk, sn, t)
23 time.sleep(10) # 10 saniye bekle / wait 10 secondsO Pico não tem relógio com bateria: quando está conectado ao Thonny, o relógio é acertado automaticamente pelo computador, mas funcionando sozinho ele começa em 1º de janeiro de 2021. Para ter data e hora precisas, você pode acrescentar um módulo DS3231 ou, no Pico W, pegar a hora da internet via NTP. Se não houver cartão no slot ou a ligação estiver errada, o driver gera OSError: no SD card (nenhum cartão SD). Se você programa o Pico pela Arduino IDE (core arduino-pico), pode usar a mesma abordagem da biblioteca SD; os pinos SPI0 padrão são os da tabela, e basta escrever SD.begin(17) para o CS.
Como evitar perda de dados: alimentação, frequência de gravação e vida útil do cartão
- Nada chega ao cartão sem close() ou flush(): a biblioteca primeiro junta os dados em um buffer de 512 bytes. Se você mantém o arquivo aberto o tempo todo, chame flush() a cada poucas linhas.
- Não tire o cartão durante a gravação: puxar o cartão ou cortar a alimentação no meio de uma gravação pode corromper o sistema de arquivos. Acrescentar um botão que para o registro e um LED que mostra que o registro está ativo é um bom hábito.
- Mantenha a alimentação firme: o cartão consome até 100 mA durante a gravação. Um capacitor de 10–100 µF entre o VCC e o GND do módulo reduz as quedas de tensão e os erros aleatórios de gravação.
- Não abra e feche com muita frequência: se você faz dezenas de leituras por segundo, abrir e fechar o arquivo a cada linha fica lento; guarde as leituras na RAM e grave em lotes de 10–20 linhas.
- Vida útil do cartão: os cartões SD espalham internamente as gravações por células diferentes (nivelamento de desgaste, ou wear leveling), então um registrador que grava algumas linhas por minuto não desgasta o cartão por anos. Mesmo assim, escolha um cartão de uma marca conhecida.
- Divida o arquivo: abrir um arquivo separado para cada dia (por exemplo, 20261104.CSV) mantém os arquivos pequenos e, se algo der errado, você perde só os dados daquele dia.
Ideias de projetos com módulo de cartão SD
- Registrador de estação meteorológica: grave temperatura, umidade e pressão a cada hora com um BME280 e monte o gráfico de uma estação do ano inteira.
- Diário de irrigação de plantas: grave as leituras do sensor de umidade do solo e os momentos em que a bomba liga para estudar o seu padrão de rega.
- Registrador de rotas GPS: salve em CSV o seu percurso de bicicleta ou de trilha com um GPS NEO-6M e depois mostre-o em um mapa.
- Registro de acesso por cartão: grave em um arquivo cada cartão lido por um leitor RFID RC522, junto com a data e a hora.
- Monitor de consumo de energia: meça e registre a corrente que um aparelho consome ao longo do dia com um sensor de corrente ACS712.
- Player de MP3: o DFPlayer Mini toca arquivos de áudio do seu próprio slot micro SD; o Arduino só envia os comandos.
Erros comuns e como resolvê-los
| Sintoma | Causa provável | Solução |
|---|---|---|
| “initialization failed” (falha na inicialização) | Nenhum cartão no slot, ligação errada ou o pino CS não bate com o código | Confira se MISO, MOSI e SCK estão nos pinos de SPI por hardware e se o número do CS em SD.begin() está certo |
| “initialization failed” (ligação correta) | Um módulo com regulador está alimentado com 3,3 V, ou a alimentação está fraca | Alimente o módulo com 5 V, encurte os fios, coloque um capacitor entre VCC e GND |
| “Could not find FAT16/FAT32 partition” (partição FAT16/FAT32 não encontrada) | O cartão está formatado em exFAT ou NTFS; cartão SDXC de 64 GB ou mais | Formate em FAT32 um cartão de até 32 GB |
| O arquivo não abre (“error opening”) | O nome do arquivo não segue a regra 8.3, ou o arquivo anterior não foi fechado | Use um nome curto como VERI.CSV e feche todos os arquivos com close() |
| O arquivo está vazio ou faltam as últimas linhas | A alimentação foi cortada antes de close() ou flush() serem chamadas | Feche o arquivo depois de cada registro ou chame flush() regularmente |
| O cartão SD para de funcionar quando outro dispositivo SPI é adicionado | O CS do outro dispositivo está flutuando, ou o módulo não libera a linha MISO | Coloque todos os pinos CS como OUTPUT e HIGH no início do setup(); se precisar, use um módulo que libere a MISO |
| O Uno trava ou se comporta de forma estranha | Falta de RAM: a biblioteca SD usa cerca de 650 bytes e o buffer de um display OLED, 1 KB | Coloque os textos dentro de F(); se precisar, passe para um Mega ou um ESP32 |
| No ESP32, os dados antigos são apagados a cada inicialização | O arquivo é aberto com FILE_WRITE | Use FILE_APPEND para acrescentar no final |
| “Card Mount Failed” (falha ao montar o cartão) no ESP32 | Alimentação, ligação, velocidade de SPI alta demais ou falta de pull-ups com SD_MMC | Reduza a velocidade do SPI para 1 MHz; teste o modo de 1 bit com SD_MMC |
Um módulo de cartão SD transforma um projeto que só mede em um aparelho que guarda registros, e alguns dias de dados reais dizem muito mais do que uma leitura isolada jamais diria. No app BlueGrays você encontra o registrador de temperatura com ESP32, DHT22, RTC DS1307, micro SD e OLED, relógios digitais com RTC e projetos de temperatura e umidade, todos com esquema do circuito e código passo a passo.
Perguntas frequentes
Qual o tamanho de cartão SD que o Arduino aceita?
A biblioteca SD padrão do Arduino suporta cartões SDSC e SDHC formatados em FAT16 ou FAT32, ou seja, cartões de até 32 GB. Os cartões SDXC de 64 GB ou mais vêm com exFAT e não podem ser lidos por essa biblioteca. Para um datalogger, um cartão de 4–16 GB é mais do que suficiente.
Por que o meu cartão SD dá “initialization failed”?
As causas mais comuns são o pino CS errado, MISO, MOSI ou SCK fora dos pinos de SPI por hardware, um cartão formatado em algo diferente de FAT32 e um módulo com regulador alimentado com 3,3 V. Rode primeiro o exemplo CardInfo e depois teste fios mais curtos e a alimentação do módulo com 5 V.
O módulo de cartão SD funciona com 3,3 V?
Os módulos sem regulador funcionam direto com 3,3 V e servem para o ESP32 ou o Pico. Os módulos micro SD com regulador e conversor de nível precisam de 4,5–5,5 V; se eles forem alimentados com 3,3 V, o cartão não recebe tensão suficiente. Você pode alimentar esses módulos pelo VIN no ESP32 ou pelo VBUS no Pico.
Como abrir no Excel um arquivo CSV do Arduino gravado no cartão SD?
Copie o arquivo para o computador e importe-o no Excel em Dados > De Texto/CSV, escolhendo vírgula como delimitador. Se o seu Excel usa vírgula decimal, como no português do Brasil, os números podem aparecer errados; nesse caso, converta as colunas usando a localidade Inglês (Estados Unidos) ou use ponto e vírgula como separador no código.
Com que frequência o Arduino pode gravar no cartão SD?
Gravar algumas linhas por segundo não é problema, mas abrir e fechar o arquivo a cada linha leva tempo. Para medições rápidas, guarde os dados na RAM e grave em lotes, ou mantenha o arquivo aberto e chame flush() regularmente. Em ritmos lentos, como um registro por minuto, abrir, gravar e fechar toda vez é o método mais seguro.
Posso usar um módulo de cartão SD junto com RFID ou um display TFT?
Sim. Os dispositivos SPI compartilham as linhas MISO, MOSI e SCK, e cada um usa o seu próprio pino CS. Se der problema, coloque todos os pinos CS como OUTPUT e HIGH no início do setup(). O conversor de nível de alguns módulos micro SD baratos nunca libera a linha MISO; nesse caso, use um módulo que libere ou um segundo barramento SPI no ESP32.
Projetos para montar depois desta leitura
Ver todos os projetos
Temperatura e umidade com DHT11
Qual é a temperatura do seu quarto? O ar está úmido ou seco? O sensor DHT11 mede a temperatura e a umidade, e o Arduino mostra os valores em um display LCD de duas linhas, atualizando a cada poucos se

Registrador de temperatura com ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
Monte um registrador de temperatura com data e hora usando ESP32! Leia a temperatura e a umidade do DHT22 a cada minuto, obtenha a hora real do DS1307 RTC e grave os dados em CSV no cartão microSD. O OLED exibe a temperatura atual em letras grandes, a porcentagem de umidade, a data e a hora e o contador de registros. O arquivo /temp_log.csv no cartão SD pode ser aberto no Excel, Google Sheets ou pandas do Python para análise — ideal para monitorar estufas, acompanhar a temperatura de casa ou…

Relógio digital com ESP32 e RTC DS1307 (I2C + LCD)
Neste projeto, exibimos a hora e a data em um display LCD I2C 16x2 usando o módulo de relógio de tempo real (RTC) DS1307. O DS1307 é um RTC com bateria de reserva que mantém a hora mesmo quando o ESP32 é desligado. Os dois módulos compartilham o mesmo barramento I2C (SDA/SCL), permitindo aprender a controlar vários dispositivos com apenas dois fios de sinal. Você aprenderá na prática o protocolo de comunicação I2C, o funcionamento dos módulos RTC e a exibição de dados dinâmicos em um LCD.

Temperatura e umidade com ESP32 e DHT22 (com display LCD)
Este projeto mede a temperatura e a umidade do ambiente com um sensor DHT22 e exibe os dados em tempo real em um LCD I2C 16x2. Os dados são lidos do sensor pelo protocolo de um fio (one-wire) com a biblioteca Adafruit DHT. Este projeto serve de base para estações meteorológicas IoT, automação residencial ou sistemas de monitoramento ambiental em estufas. A comunicação com o DHT22 é feita pelo pino GPIO 4 do ESP32.

ESP32 em sono profundo — Economia de bateria (OLED + contador na RAM RTC)
O modo de sono profundo do ESP32 reduz o consumo de corrente para ~10 µA ao desligar a CPU e a maioria dos periféricos, sendo essencial para dispositivos IoT alimentados por bateria. Neste projeto, usamos três fontes de despertar: um temporizador (15 segundos), um pino externo (EXT0 — botão no GPIO 33) e toque (T0/GPIO 4). As variáveis marcadas com RTC_DATA_ATTR são preservadas durante o sono profundo, mantendo os contadores de inicializações e de despertares por temporizador e botão.

Hora exata pela internet com ESP32 e NTP
O ESP32 se conecta ao Wi-Fi e obtém a hora exata com precisão de milissegundos de servidores NTP (Network Time Protocol). Com a função configTzTime(), o fuso horário configurado (TRT, UTC+3 neste exemplo) é aplicado automaticamente, e as mudanças nos países que adotam horário de verão são gerenciadas automaticamente por uma string POSIX TZ. A hora é exibida tanto no Monitor Serial quanto em um LCD I2C opcional.

Relógio, calendário e estação meteorológica de matriz de pontos (MAX7219, DS1307)
Um painel com texto em rolagem para sua mesa ou parede que mostra, em sequência, a hora, a data e as condições do ambiente. No display LED 8x32, você vê primeiro a temperatura em Celsius e Fahrenheit,

Relógio RTC DS1302 com display LCD
Um pequeno relógio de mesa que mantém a hora mesmo quando falta energia. O módulo de relógio DS1302 mantém a hora graças à sua própria pilha; a cada segundo, o Arduino lê essa informação e exibe a hor
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

