Komponen · 12 mnt baca

Modul Kartu SD Arduino: Data Logger CSV dengan Timestamp RTC

Panduan modul kartu SD Arduino: pengkabelan SPI, format FAT32, mencatat data sensor ke CSV dengan timestamp RTC, SD_MMC di ESP32, Pico, dan cara mengatasi “initialization failed”.

Modul kartu SD Arduino adalah board kecil dan murah yang memungkinkanmu menyimpan hasil pembacaan suhu, kelembapan, jarak, atau lokasi dari sensormu sebagai file di kartu micro SD. Ini cara paling mudah untuk membuat data logger yang mengukur selama berhari-hari, bahkan berbulan-bulan, tanpa komputer yang tersambung: Arduino melakukan pengukuran, modul menulis setiap hasil sebagai baris baru di file CSV pada kartu, lalu kamu tinggal mencolokkan kartu ke komputer dan membuat grafik datanya di Excel. Modul ini tersambung lewat SPI dan bekerja hanya dengan beberapa baris kode memakai library SD yang sudah ikut terpasang bersama Arduino IDE.

Di panduan ini kamu akan belajar langkah demi langkah cara kerja modul, perbedaan modul 5 V dan 3,3 V, pengkabelan SPI untuk Arduino Uno, Mega, ESP32, dan Raspberry Pi Pico, cara memformat kartu sebagai FAT32, cara menulis dan membaca file, serta cara membuat log CSV bertanda tanggal dan jam dengan modul RTC. Kita juga membahas antarmuka SD_MMC ESP32 yang cepat, memakai kartu SD di Pico dengan MicroPython, dan cara mengatasi error “initialization failed” yang sangat sering muncul.

Modul kartu micro SD Arduino
Modul kartu micro SD: slot kartu, regulator 3,3 V, chip level shifter, dan 6 pin (GND, VCC, MISO, MOSI, SCK, CS).

Apa itu modul kartu SD dan bagaimana cara kerjanya?

Kartu SD bekerja pada 3,3 V dan bisa berkomunikasi dengan dua cara: mode SD bawaan yang cepat dan mode SPI yang lebih sederhana. Mikrokontroler seperti Arduino berbicara dengan kartu lewat SPI. Tugas modul adalah membuat keduanya cocok secara listrik: regulatornya menurunkan 5 V menjadi 3,3 V yang dibutuhkan kartu, dan chip level shifter (biasanya 74LVC125A) mengubah sinyal 5 V dari Arduino menjadi 3,3 V yang aman untuk kartu. Di dalamnya, kartu terdiri dari blok-blok 512 byte, sedangkan konsep seperti file, folder, dan nama file diatur oleh sistem file FAT. Library SD mengerjakan semua bagian rumit ini untukmu; kamu cukup membuka file, menulis ke dalamnya, lalu menutupnya.

FiturNilai
AntarmukaSPI (MISO, MOSI, SCK, CS)
Catu daya (modul micro SD dengan regulator)4,5–5,5 V, regulator 3,3 V di board
Level sinyalKompatibel 3,3 V dan 5 V (berkat level shifter)
Kartu yang didukungmicro SD (sampai 2 GB) dan micro SDHC (4–32 GB)
Sistem fileFAT16 atau FAT32
ArusBeberapa mA ketika diam, sampai 100 mA ketika menulis
Nama file (library SD Arduino)Format 8.3: maksimal 8 karakter untuk nama + 3 untuk ekstensi

Modul kartu SD 5 V vs 3,3 V: mana yang sebaiknya kamu beli?

Jenis modulCatu dayaLevel sinyalPaling cocok untuk
Modul micro SD dengan regulator (74LVC125A)5 V3,3 V dan 5 VUno, Nano, Mega; ESP32 dan Pico jika diberi daya dari 5 V
Modul kartu SD ukuran penuh (pin +5 dan +3.3)5 V atau 3,3 VKebanyakan tidak punya level shifter sungguhanBoard 3,3 V; tidak andal dengan sinyal 5 V
Modul micro SD tanpa regulator (slot saja)Hanya 3,3 VHanya 3,3 VESP32, Raspberry Pi Pico
Board dengan slot bawaan (seperti ESP32-CAM)Dari board3,3 VDipakai langsung dengan SD_MMC

Kalau kamu memakai Arduino Uno, Nano, atau Mega, pilih modul micro SD dengan regulator dan level shifter seperti yang ada di foto, lalu sambungkan VCC ke pin 5V. ESP32 dan Pico bekerja pada 3,3 V; kamu juga bisa memakai modul yang sama dengan keduanya, tetapi tetap beri dayanya dari 5 V (VIN di ESP32, VBUS di Pico ketika diberi daya lewat USB). Karena level shifter diberi daya 3,3 V, sinyal MISO yang kembali ke mikrokontroler sudah bernilai 3,3 V. Modul tanpa regulator disambungkan langsung ke pin 3V3; kalau kamu terpaksa memakainya dengan Arduino 5 V, pasang pembagi tegangan 1 kΩ + 2 kΩ di masing-masing jalur MOSI, SCK, dan CS, atau pakai konverter level logika. Kamu bisa mengecek nilai resistornya dengan kalkulator pembagi tegangan.

Kesalahan yang paling sering terjadi adalah memberi daya 3,3 V ke modul micro SD yang punya regulator. Regulator AMS1117 di modul menurunkan sekitar 1 V, jadi hanya sekitar 2,3 V yang sampai ke kartu, dan biasanya kartu akan melaporkan initialization failed. Kebalikannya sama buruknya: memberi 5 V ke pin modul tanpa regulator bisa merusak kartu secara permanen. Baca tulisan di modul dan cek apakah ada regulatornya sebelum kamu menyambungkannya.

Pengkabelan modul kartu SD: pin SPI

Pin modulArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5 V)VBUS (5 V)
MISOD12D50GPIO 19GP16
MOSID11D51GPIO 23GP19
SCKD13D52GPIO 18GP18
CSD10D53GPIO 5GP17

MISO, MOSI, dan SCK harus masuk ke pin SPI hardware di setiap board; CS (chip select) boleh pin digital mana saja, asalkan kamu memberikan nomor yang sama ke SD.begin() di kodemu. Di shield siap pakai, CS biasanya D4 atau D10. Kamu bisa menyambungkan beberapa perangkat ke bus SPI yang sama: semuanya berbagi MISO, MOSI, dan SCK, dan masing-masing mendapat pin CS sendiri. Cara kerja SPI kami jelaskan secara detail di Apa Itu SPI?. Untuk melihat letak pin di board-mu, pakai alat diagram pin.

Menyiapkan kartu SD: memformat sebagai FAT32

  • Ukuran kartu: pilih kartu micro SDHC antara 4 dan 32 GB. Library SD Arduino mendukung kartu SDSC (sampai 2 GB) dan SDHC; kartu SDXC 64 GB ke atas datang dengan format exFAT, yang tidak bisa dibaca library ini.
  • Sistem file: format kartu sebagai FAT32 (FAT16 juga bisa untuk kartu 2 GB atau lebih kecil). NTFS dan exFAT tidak akan berfungsi.
  • Windows: klik kanan kartu di File Explorer, pilih Format, lalu pilih FAT32 sebagai sistem file dan ukuran allocation unit default. Windows tidak menawarkan FAT32 untuk kartu yang lebih besar dari 32 GB.
  • macOS: pilih kartu di Disk Utility, klik Erase, lalu pilih MS-DOS (FAT) sebagai format dan Master Boot Record sebagai skema.
  • Pilihan paling aman: alat gratis SD Card Formatter dari SD Association memformat kartu sesuai standar resmi dan membereskan sebagian besar error yang aneh.
  • Satu partisi: kartu sebaiknya hanya punya satu partisi. Kartu yang sebelumnya dipakai di Raspberry Pi atau kamera mungkin masih punya beberapa partisi; hapus semuanya sebelum memformat.
Library SD di Arduino Uno hanya menangani nama file pendek dalam format 8.3: nama maksimal 8 karakter dan ekstensi maksimal 3, tanpa spasi atau karakter khusus. DATA.CSV atau LOG01.TXT akan berfungsi, tetapi nama panjang seperti temperature-log.csv membuat SD.open() gagal tanpa pesan apa pun. Di ESP32 dan Pico kamu bisa memakai nama file panjang tanpa masalah.

Tes pertama langkah demi langkah: menulis ke kartu SD dan membacanya

  1. Masukkan kartu yang sudah diformat ke modul, lalu sambungkan modul ke Arduino sesuai tabel di atas.
  2. Library SD sudah ikut bersama Arduino IDE, jadi tidak ada yang perlu diinstal; kamu cukup menambahkan SPI.h dan SD.h di bagian atas sketch.
  3. Upload kode di bawah ini dan buka Serial Monitor pada 9600 baud.
  4. Kalau kamu melihat “tamam” (OK dalam bahasa Turki) dan isi file, berarti kartu dan pengkabelannya sudah benar. Setiap kali board menyala, satu baris baru ditambahkan ke TEST.TXT.
  5. Ketika kartu kamu lepas dan colokkan ke komputer, TEST.TXT bisa dibuka dengan editor teks apa pun.
C++ (Arduino IDE)
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}
FungsiKegunaannya
SD.begin(cs)Menginisialisasi kartu; mengembalikan true jika berhasil
SD.open("NAME.TXT", FILE_WRITE)Membuka file untuk ditulis; membuatnya jika belum ada, menambahkan di akhir jika sudah ada
SD.open("NAME.TXT")Membuka file untuk dibaca (FILE_READ)
file.print() / println() (menulis)Menulis teks atau angka ke file
file.flush()Menulis data di buffer ke kartu tanpa menutup file
file.close()Menulis sisa data ke kartu dan menutup file
file.available() / read() (membaca)Mengecek apakah masih ada byte untuk dibaca / membaca satu byte
SD.exists() / SD.remove() / SD.mkdir() (cek / hapus / folder)Mengecek apakah file ada / menghapus file / membuat folder

Mencatat data sensor ke CSV dengan timestamp RTC

Format file paling praktis untuk data logger adalah CSV (comma-separated values, nilai yang dipisahkan koma): setiap baris adalah satu pengukuran, setiap kolom satu nilai, dan baris pertama berisi judul kolom. Supaya tahu kapan setiap pembacaan diambil, kamu perlu menambahkan tanggal dan jam di setiap baris. millis() hanya memberi tahu berapa lama Arduino sudah berjalan dan kembali ke nol setiap kali board restart, jadi kita memakai modul RTC (real-time clock, jam waktu nyata) dengan baterai koin. RTC terus menghitung bahkan ketika Arduino dimatikan. DS1307 murah tetapi bisa meleset beberapa detik per hari, sedangkan DS3231 hanya meleset sekitar satu menit per tahun berkat kristalnya yang terkompensasi suhu. Keduanya kami bandingkan di modul jam RTC.

Modul jam RTC DS1307
Modul RTC DS1307 tersambung lewat I2C (SDA, SCL) dan terus menjaga waktu dengan baterai koinnya bahkan ketika Arduino mati.

Rangkaiannya: modul SD masuk ke pin SPI seperti pada tabel di atas, modul RTC ke bus I2C (di Uno SDA = A4, SCL = A5, VCC = 5V), dan pin data sensor DHT22 ke D2; kalau kamu memakai sensor tanpa modul, tambahkan resistor 10 kΩ di antara pin data dan VCC. Instal library RTClib (Adafruit) dan DHT sensor library dari Library Manager. Untuk detail pengkabelan sensornya, lihat sensor suhu dan kelembapan DHT11 dan DHT22.

C++ (Arduino IDE)
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}

Setiap 10 detik kode membaca suhu dan kelembapan, mengambil tanggal dan jam dari RTC, lalu menambahkan baris seperti 2026-11-04,14:05:30,23.5,45.2 ke akhir VERI.CSV. Karena file ditutup setelah setiap catatan, data yang sudah tersimpan tetap aman bahkan ketika listrik padam. Di board AVR, sprintf() tidak mendukung bilangan desimal (%f), jadi nilainya diubah dulu menjadi teks dengan dtostrf(). Karena pengaturan waktunya memakai millis() alih-alih delay(), kamu juga bisa mengerjakan hal lain di loop(). Kalau RTC belum pernah diatur, jamnya diatur ke momen ketika kode dikompilasi. Kalau kamu memakai DS3231, cukup tulis RTC_DS3231 alih-alih RTC_DS1307 dan cek lostPower() alih-alih isrunning().

Berapa banyak ruang yang dipakai? Satu baris kira-kira 31 byte. Mencatat setiap 10 detik menghasilkan 8.640 baris per hari, atau sekitar 260 KB; dalam setahun jumlahnya kira-kira 95 MB. Jadi dengan laju ini, kartu 8 GB cukup untuk puluhan tahun. Batas sebenarnya bukan kartunya, melainkan catu dayanya: kalau proyekmu akan berjalan dengan baterai, hitung dulu berapa lama baterainya akan bertahan dengan kalkulator umur baterai.

Membuka data kartu SD di Excel

  1. Putuskan daya Arduino, keluarkan kartu dari modul, lalu colokkan ke komputermu.
  2. Salin VERI.CSV ke komputermu; bekerja dengan salinan lebih aman daripada langsung di kartu.
  3. Buka workbook kosong di Excel dan pilih file lewat Data > From Text/CSV.
  4. Di jendela pratinjau, pilih Comma sebagai pemisah (delimiter) lalu klik Load; kolom-kolomnya akan terbagi menjadi tanggal, jam, suhu, dan kelembapan.
  5. Pilih kolom suhu dan kelembapan, lalu tambahkan grafik garis dari tab Insert untuk melihat perubahannya dari waktu ke waktu.
Kalau Excel-mu memakai koma sebagai pemisah desimal (seperti pada pengaturan bahasa Indonesia, Turki, Jerman, Prancis, Spanyol, atau Italia), nilai seperti 23.5 mungkin tidak dikenali sebagai angka dan bisa muncul sebagai teks, tanggal, atau angka yang salah. Ada dua solusi: klik Transform Data ketika mengimpor, lalu ubah kolom suhu dan kelembapan menjadi angka desimal memakai locale English (United States), atau ubah kode seperti di bawah supaya memakai titik koma sebagai pemisah kolom dan koma sebagai tanda desimal. Dengan cara kedua, kamu cukup mengklik dua kali file-nya dan Excel akan membagi kolom dengan sendirinya.
C++ (Arduino IDE)
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_yuzde

Kalau kamu lebih suka mengirim pembacaan secara langsung ke Excel selama Arduino tersambung ke komputer, tanpa mencabut kartu, coba lihat metode Data Streamer dan PLX-DAQ di mengirim data Arduino ke Excel. Sebaliknya, kartu SD wajib untuk proyek yang berjalan di lapangan, jauh dari komputer.

Memakai kartu SD dengan ESP32 (SPI)

Core Arduino untuk ESP32 punya library SD sendiri dan cara pakainya hampir sama, tetapi ada tiga perbedaan penting: path file diawali / ("/olcumler.csv"), nama file panjang diperbolehkan, dan FILE_WRITE menimpa file dari awal. Untuk menambahkan data di akhir, kamu harus memakai FILE_APPEND; kalau kode Uno kamu pindahkan begitu saja, data lamamu terhapus setiap kali board menyala. Pin SPI default-nya SCK 18, MISO 19, dan MOSI 23, dan GPIO 5 biasanya dipakai untuk CS. Kamu juga bisa membaca jenis dan ukuran kartu dengan satu baris:

C++ (Arduino IDE)
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}

Kode ini mencatat nilai mentah (0–4095) dari LDR yang tersambung ke GPIO 34 setiap 5 detik. Di ESP32 kamu bahkan tidak perlu modul RTC untuk waktu nyata: kamu bisa terhubung ke Wi-Fi, mengambil waktu dari server NTP, dan menambahkan timestamp di setiap baris dengan getLocalTime(). Kalau kabelmu panjang atau kartunya tidak stabil, turunkan kecepatan SPI: SD.begin(5, SPI, 1000000) memulai kartu pada 1 MHz. Pada logger bertenaga baterai, memakai deep sleep di antara pembacaan bisa melipatgandakan umur baterai.

SD_MMC ESP32: antarmuka SD yang cepat dan ESP32-CAM

Selain SPI, ESP32 juga punya kontroler SDMMC yang berbicara dengan protokol cepat milik kartu itu sendiri. Dalam mode 4-bit, library SD_MMC beberapa kali lebih cepat daripada SPI, sehingga ideal untuk file besar seperti foto atau audio. Di ESP32 klasik pinnya tetap: CLK GPIO 14, CMD GPIO 15, D0 GPIO 2, D1 GPIO 4, D2 GPIO 12, D3 GPIO 13, dan jalur-jalur ini butuh resistor pull-up 10 kΩ. Dalam mode 1-bit hanya CLK, CMD, dan D0 yang dipakai; memang lebih lambat, tetapi GPIO 4, 12, dan 13 jadi bebas. Slot micro SD di board ESP32-CAM tersambung ke pin-pin ini, dan memakai mode 1-bit mencegah LED flash di GPIO 4 berkedip setiap kali kartu diakses.

C++ (Arduino IDE)
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}
GPIO 12 adalah pin strapping yang menentukan tegangan memori flash ketika ESP32 booting. Dalam mode 4-bit, resistor pull-up di jalur D2 bisa membuat beberapa modul sama sekali tidak mau booting; kalau itu terjadi, pakai mode 1-bit. Di chip yang lebih baru seperti ESP32-S3, kamu bisa memilih pin dengan bebas lewat SD_MMC.setPins().

Kartu SD dengan Raspberry Pi Pico (MicroPython)

Di MicroPython, kartu SD ditangani oleh driver sdcard.py dari micropython-lib. Kalau di komputermu ada mpremote, instal dengan mpremote mip install sdcard, atau salin file-nya ke Pico dengan Thonny. Kartu di-mount sebagai folder /sd dengan os.mount(), lalu setelah itu kamu memakainya dengan perintah file Python biasa (open, write). Kode di bawah membaca sensor suhu bawaan Pico dan menulis satu baris CSV setiap 10 detik. Kalau kamu baru mengenal Pico, baca dulu Apa Itu Raspberry Pi Pico?.

MicroPython
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 seconds

Pico tidak punya jam dengan baterai cadangan: ketika tersambung ke Thonny, jamnya diatur otomatis dari komputermu, tetapi kalau berjalan sendiri, jamnya mulai dari 1 Januari 2021. Untuk timestamp yang akurat, kamu bisa menambahkan modul DS3231, atau di Pico W mengambil waktu dari internet lewat NTP. Kalau tidak ada kartu yang terpasang atau pengkabelannya salah, driver akan memunculkan OSError: no SD card. Kalau kamu memprogram Pico dengan Arduino IDE (core arduino-pico), kamu bisa memakai cara yang sama dengan library SD; pin SPI0 default-nya sesuai dengan tabel, dan kamu cukup menulis SD.begin(17) untuk CS.

Mencegah kehilangan data: daya, frekuensi penulisan, dan umur kartu

  • Tanpa close() atau flush(), tidak ada yang sampai ke kartu: library mengumpulkan data dulu di buffer 512 byte. Kalau file kamu biarkan terbuka terus, panggil flush() setiap beberapa baris.
  • Jangan cabut kartu ketika sedang menulis: mencabut kartu atau memutus daya di tengah penulisan bisa merusak sistem file. Menambahkan tombol untuk menghentikan pencatatan dan LED yang menunjukkan pencatatan sedang aktif adalah kebiasaan yang baik.
  • Jaga catu daya tetap kokoh: kartu menarik arus sampai 100 mA ketika menulis. Kapasitor 10–100 µF di antara VCC dan GND modul mengurangi penurunan tegangan dan error penulisan acak.
  • Jangan terlalu sering membuka dan menutup file: kalau kamu mengambil puluhan pembacaan per detik, membuka dan menutup file untuk setiap baris itu lambat; tampung pembacaan di RAM dan tulis sekaligus per 10–20 baris.
  • Umur kartu: kartu SD menyebarkan penulisan ke sel-sel yang berbeda di dalamnya (wear leveling), jadi logger yang menulis beberapa baris per menit tidak akan membuat kartu aus selama bertahun-tahun. Meski begitu, pilih kartu dari merek yang terkenal.
  • Pecah file-nya: membuka file terpisah untuk setiap hari (misalnya 20261104.CSV) membuat file tetap kecil, dan kalau ada masalah, kamu hanya kehilangan data hari itu.

Ide proyek dengan modul kartu SD

  • Logger stasiun cuaca: catat suhu, kelembapan, dan tekanan setiap jam dengan BME280 dan buat grafik untuk satu musim penuh.
  • Log penyiraman tanaman: catat pembacaan sensor kelembapan tanah dan momen-momen ketika pompa menyala untuk mempelajari pola penyiramanmu.
  • Logger rute GPS: simpan rute bersepeda atau hiking-mu sebagai CSV dengan GPS NEO-6M, lalu tampilkan di peta.
  • Log akses berbasis kartu: tulis setiap kartu yang dipindai dengan RFID RC522 ke file beserta tanggal dan jamnya.
  • Pemantau pemakaian energi: ukur dan catat arus yang ditarik sebuah perangkat sepanjang hari dengan sensor arus ACS712.
  • Pemutar MP3: DFPlayer Mini memutar file audio dari slot micro SD-nya sendiri; Arduino hanya mengirim perintah.

Kesalahan umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
“initialization failed”Tidak ada kartu, pengkabelan salah, atau pin CS tidak sesuai dengan kodePastikan MISO, MOSI, dan SCK ada di pin SPI hardware dan nomor CS di SD.begin() sudah benar
“initialization failed” (pengkabelan sudah benar)Modul dengan regulator diberi daya 3,3 V, atau catu dayanya lemahBeri daya modul dari 5 V, perpendek kabel, tambahkan kapasitor di antara VCC dan GND
“Could not find FAT16/FAT32 partition”Kartu diformat sebagai exFAT atau NTFS; kartu SDXC 64 GB atau lebihFormat kartu berukuran maksimal 32 GB sebagai FAT32
File tidak mau terbuka (“error opening”)Nama file melanggar aturan 8.3, atau file sebelumnya belum ditutupPakai nama pendek seperti VERI.CSV dan tutup setiap file dengan close()
File kosong atau baris terakhir hilangDaya terputus sebelum close() atau flush() dipanggilTutup file setelah setiap catatan atau panggil flush() secara rutin
Kartu SD berhenti bekerja ketika perangkat SPI lain ditambahkanCS perangkat lain mengambang, atau modul tidak melepaskan jalur MISOAtur setiap pin CS ke OUTPUT dan HIGH di awal setup(); jika perlu, pakai modul yang melepaskan MISO
Uno macet atau berperilaku anehRAM habis: library SD memakai sekitar 650 byte dan buffer layar OLED 1 KBBungkus teks dengan F(); jika perlu, pindah ke Mega atau ESP32
Di ESP32, data lama terhapus setiap kali bootingFile dibuka dengan FILE_WRITEPakai FILE_APPEND untuk menambahkan di akhir
“Card Mount Failed” di ESP32Catu daya, pengkabelan, kecepatan SPI yang tinggi, atau pull-up yang tidak ada di SD_MMCTurunkan kecepatan SPI ke 1 MHz; coba mode 1-bit di SD_MMC
Cara tercepat untuk melacak masalahnya adalah contoh File > Examples > SD > CardInfo di Arduino IDE. Kalau contoh ini menampilkan jenis kartu (SD1, SD2, atau SDHC) tetapi tidak menemukan partisi, masalahnya ada di format; kalau jenis kartunya pun tidak muncul, periksa pengkabelan dan catu dayanya.

Modul kartu SD mengubah proyek yang hanya mengukur menjadi perangkat yang menyimpan catatan, dan data nyata selama beberapa hari jauh lebih banyak bercerita daripada satu pembacaan saja. Di aplikasi BlueGrays kamu akan menemukan proyek Pencatat Data Suhu ESP32 dengan DHT22, RTC DS1307, micro SD, dan OLED, jam digital berbasis RTC, serta proyek suhu dan kelembapan, semuanya lengkap dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Kartu SD berukuran berapa yang bisa dipakai Arduino?

Library SD standar Arduino mendukung kartu SDSC dan SDHC yang diformat sebagai FAT16 atau FAT32, artinya kartu sampai 32 GB. Kartu SDXC 64 GB ke atas datang dengan exFAT dan tidak bisa dibaca library ini. Untuk data logger, kartu 4–16 GB sudah lebih dari cukup.

Kenapa kartu SD-ku menampilkan “initialization failed”?

Penyebab paling umum adalah pin CS yang salah, MISO, MOSI, atau SCK yang tidak tersambung ke pin SPI hardware, kartu yang diformat selain FAT32, dan modul beregulator yang diberi daya 3,3 V. Jalankan dulu contoh CardInfo, lalu coba kabel yang lebih pendek dan beri daya modul dari 5 V.

Apakah modul kartu SD bisa bekerja dengan 3,3 V?

Modul tanpa regulator berjalan langsung pada 3,3 V dan cocok untuk ESP32 atau Pico. Modul micro SD dengan regulator dan level shifter butuh 4,5–5,5 V; kalau diberi daya 3,3 V, kartunya tidak mendapat tegangan yang cukup. Kamu bisa memberi daya modul ini dari VIN di ESP32 atau VBUS di Pico.

Bagaimana cara membuka file CSV Arduino dari kartu SD di Excel?

Salin file ke komputermu dan impor di Excel lewat Data > From Text/CSV, lalu pilih koma sebagai pemisah. Kalau Excel-mu memakai koma desimal (seperti pengaturan bahasa Indonesia), angkanya bisa terlihat salah; dalam hal ini ubah kolomnya memakai locale English (United States) atau pakai titik koma sebagai pemisah di kodemu.

Seberapa sering Arduino bisa menulis ke kartu SD?

Menulis beberapa baris per detik tidak masalah, tetapi membuka dan menutup file untuk setiap baris butuh waktu. Untuk pengukuran cepat, tampung data di RAM lalu tulis sekaligus, atau biarkan file terbuka dan panggil flush() secara rutin. Untuk laju lambat seperti satu catatan per menit, buka-tulis-tutup setiap kali adalah cara paling aman.

Bisakah aku memakai modul kartu SD bersamaan dengan RFID atau layar TFT?

Bisa. Perangkat SPI berbagi jalur MISO, MOSI, dan SCK, dan masing-masing memakai pin CS sendiri. Kalau ada masalah, atur setiap pin CS ke OUTPUT dan HIGH di awal setup(). Level shifter di beberapa modul micro SD murah tidak pernah melepaskan jalur MISO; dalam hal ini pakai modul yang melepaskannya, atau bus SPI kedua di ESP32.

Lihat semua proyek
Suhu dan Kelembapan dengan DHT11
#55Menengah

Suhu dan Kelembapan dengan DHT11

Seberapa hangat kamarmu, dan apakah udaranya lembap atau kering? Sensor DHT11 mengukur suhu dan kelembapan, dan Arduino menulis nilainya di layar LCD dua baris, diperbarui setiap beberapa detik. Jika

4.7(47)
73
Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)
#144Mahir
Premium

Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)

Buat pencatat suhu bercap waktu dengan ESP32! Baca suhu/kelembapan DHT22 setiap menit, ambil waktu sebenarnya dari RTC DS1307, dan catat ke kartu microSD sebagai CSV. OLED menampilkan suhu langsung (font besar), kelembapan, cap waktu, dan penghitung catatan. File /temp_log.csv bisa dibuka di Excel, Google Sheets, atau Python pandas; cocok untuk rumah kaca, suhu kamar, data laboratorium, penyimpanan makanan, atau sarang lebah.

4.7(7)
12
Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)
#120Menengah
Premium

Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)

Di proyek ini, kita menampilkan waktu dan tanggal di layar LCD I2C 16x2 memakai modul jam real-time (RTC) DS1307. DS1307 adalah RTC berbaterai cadangan yang tetap menjaga waktu meskipun ESP32 dimatikan. Kedua modul berbagi bus I2C yang sama (SDA/SCL), sehingga kita belajar mengendalikan beberapa perangkat hanya dengan dua kabel sinyal. Lewat proyek ini kamu mendapat pengetahuan praktis tentang protokol komunikasi I2C, cara kerja modul RTC, dan tampilan data dinamis di LCD.

4.6(26)
40
Suhu dan Kelembapan DHT22 ESP32 (dengan Layar LCD)
#117Menengah

Suhu dan Kelembapan DHT22 ESP32 (dengan Layar LCD)

Proyek ini mengukur suhu dan kelembapan sekitar dengan sensor DHT22 dan menampilkan datanya secara real-time di LCD I2C 16x2. Data dibaca dari sensor dengan protokol satu kabel lewat library Adafruit DHT. Proyek ini menjadi dasar untuk stasiun cuaca IoT, otomasi rumah pintar, atau sistem pemantauan lingkungan di rumah kaca. Komunikasi dengan DHT22 dilakukan lewat pin GPIO 4 ESP32.

4.8(38)
56
Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)
#135Mahir
Premium

Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)

Mode Deep Sleep ESP32 menurunkan konsumsi arus hingga ~10 µA dengan mematikan CPU dan sebagian besar periferal, sehingga sangat penting untuk perangkat IoT bertenaga baterai. Di proyek ini, kita memakai tiga sumber bangun yang berbeda: timer (15 detik), pin eksternal (EXT0, tombol GPIO 33), dan sentuhan (T0/GPIO 4). Variabel yang ditandai RTC_DATA_ATTR dipertahankan selama deep sleep; penghitung boot, penghitung bangun karena timer, dan penghitung bangun karena tombol terus dilacak.

4.3(10)
16
Jam Real-Time dari Internet lewat NTP ESP32
#128Mahir
Premium

Jam Real-Time dari Internet lewat NTP ESP32

ESP32 tersambung ke Wi-Fi dan mengambil waktu nyata dengan presisi milidetik dari server NTP (Network Time Protocol). Berkat fungsi configTzTime(), zona waktu Turki (TRT, UTC+3) otomatis diterapkan, dan pergantian DST di negara yang memakai waktu musim panas otomatis diatur dengan string POSIX TZ. Waktunya ditampilkan di Serial Monitor sekaligus di LCD I2C opsional. configTzTime() memulai layanan SNTP; sinkronisasi ulang berkala terjadi selama koneksi tersedia.

4.5(13)
21
Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)
#85Menengah
Premium

Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)

Papan teks berjalan untuk meja atau dinding yang menampilkan waktu, tanggal, dan cuaca ruangan secara bergantian. Di layar LED 8x32, kamu pertama melihat suhu dalam Celsius dan Fahrenheit, lalu kelemb

5.0(50)
66
Jam RTC DS1302 dengan Layar LCD
#46Menengah
Premium

Jam RTC DS1302 dengan Layar LCD

Jam meja kecil yang tetap menjaga waktu meskipun listrik padam. Modul jam DS1302 menjaga waktu berkat baterai mungilnya sendiri; setiap detik Arduino membacanya lalu menulis waktu dan tanggal di baris

4.7(41)
51