Tutorial Modul Micro SD dengan Arduino UNO

By | October 25, 2023
927 Views

Tutorial Modul Micro SD dengan Arduino UNO – Secara internal Arduino UNO mempunyai storage persisten yang bernama EPROM dengan kapasitas terbatas yaitu hanya 1 kb saja. Nah apabila kalian ingin menggunakannya program untuk logger yang harus menyimpan data per jam/harian tentu butuh kapasitas storage yang cukup dan mudah diakses ataupun sebagai file configuration untuk mengatur nilai kerja pada arduino uno.

Modul Micro SD mempunyai banyak kelebihan salah satunya punya kapasitas yang besar dan mudah dicopot untuk kemudian data tersebut dibaca lagi di komputer, harganya cukup pun sangat murah yaitu sekitar Rp. 7 ribuan saja untuk modulnya sedangkan Micro SD nya bisa kalian beli sendiri sesuai kapasitas yang diperlukan.

Modul Micro SD TF Card Shield SPI Module Adapter Writer Reader

Modul Micro SD TF Card merupakan modul yang bekerja menggunakan SPI dan bekerja pada voltase 5 Volt jadi pastikan kalau menggunakan NodeMCU bisa menggunakan pin VIN. Ukuranya cukup kecil jadi mudah ditempatkan pada papan.

Control Interface Module

  • GND : negatif power supply
  • VCC : positif power supply
  • MISO, MOSI, SCK : SPI bus
  • CS : chip select signal pin

Fitur dan spesifikasi

  • Mendukung pembacaan kartu memori SD Card biasa (<=2G) maupun SDHC card (high-speed card) (<=32G)
  • Tegangan operasional dapat menggunakan tegangan 5V atau 3.3V
  • Arus operasional yang digunakan yaitu 80mA (0.2~200mA)
  • Menggunakan antarmuka SPI
  • Pada modul ini sudah terdapat 4 lubang baut guna untuk pemasangan pada rangkaian lainnya
  • Ukuran modul yaitu 42 x 24 x 12 mm

 

Modul Micro SD Card

Atau bisa beli disini Fortuna Jogja Oiya pastikan Micro SD nya sudah kalian format FAT32 ya.

Wiring Modul Micro SD dengan Arduino UNO

Wiring menggunakan SPI sehingga akan menggunakan Pin 13 tentu nanti kita tidak bisa uji coba output dengan BUILTIN LED di arduino ya!

ARDUINO UNO PIN MICROSD CARD MODULE PIN
GND GND
5V VCC
12 MISO
11 MOSI
13 SCK
4 CS
See also  Mengatur Kecepatan motor DC tanpa kehilangan daya dengan PWM

Pin 4 digunakan untuk CS yaitu mengakses modul SD Card nya, kalian bebas saja sih menggunakan pin manapun

 

Membaca Keberadaan SD Card

Untuk saat ini kalian tidak perlu install library karena biasanya sudah default ada yaitu SD.h dan SPI.h. Berikut Tutorial Modul Micro SD dengan Arduino UNO untuk membaca keberadaan SD Card. (oiya saya sudah mengisi 1  file dengan nama coba.txt

#include <SD.h>
#include <SPI.h>

#define pin 4

Sd2Card card;
SdVolume volume;
SdFile root;

File myFile;

void setup(){
  //set up untuk komunikasi serial melalui serial monitor
  Serial.begin(9600);
  Serial.print("\nInitializing SD card...");
  Serial.println();
  //untuk memastikan sd card terbaca
  if (!card.init(SPI_HALF_SPEED, pin)) {
    Serial.println("inisialisasi gagal. Hal untuk memeriksa:");
    Serial.println("* Apakah kartu sudah dimasukkan?");
    Serial.println("* Apakah pengkabelan sudah benar?");
    Serial.println("* Anda mengubah pin chipselect yang menyesuaikan dengan module?");

  } else {
      Serial.println("Cek Wiring dan Format Micro SD  nya");
  }

  // Mencetak jenis kartu
  Serial.print("\nTipe Micro SD : ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("tidak diketahui"); }

  if (!volume.init(card)) {
    Serial.println("tidak bisa menemukan FAT16 / partisi FAT32. \ Pastikan telah diformat kartu");
  }

  // Mencetak jenis dan ukuran volume FAT-jenis pertama
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();
  volumesize *= volume.clusterCount();
  volumesize /= 2;   
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  Serial.println("\nFile yang ditemukan pada kartu (nama, tanggal dan ukuran dalam bytes): ");

  root.openRoot(volume);

  root.ls(LS_R | LS_DATE | LS_SIZE);
  
}



void loop(void) {
  delay(1000);
  
}

Berikut hasilnya

Initializing SD card...
Cek Wiring dan Format Micro SD  nya

Tipe Micro SD : SDHC

Volume type is FAT32
Volume size (bytes): 3864064
Volume size (Kbytes): 3773
Volume size (Mbytes): 3

File yang ditemukan pada kartu (nama, tanggal dan ukuran dalam bytes): 
SYSTEM~1/     2023-10-23 09:41:36
  WPSETT~1.DAT  2023-10-23 09:41:38 12
  INDEXE~1      2023-10-23 09:41:38 76
COBA.TXT      2023-10-24 21:58:00 5

 

Menyimpan data dan Membaca File

Untuk menyimpan data dalam bentuk plain text ya yaitu format *.txt yang bisa dibuka dengan notepad. Tentu dalam menyimpan yang banyak kalian bisa membuat format tertentu misalkan pakai separator seperti berikut

data1, 1
data2, 2
data3, 3
data4, 4

Yang kalian perlu perhatikan yaitu setiap kali setelah akses wajib close.

#include <SD.h>
#include <SPI.h>

#define pin 4

File myFile;
String namaFile = "data.txt";

void tulis(String data){

  Serial.println("Buka file di kartu microSD");
  if (!SD.begin(pin)) { //tergantung di pin chipselect yang digunakan
    Serial.println("Gagal baca microSD!");
    return;
  }
  Serial.println("Sukses baca kartu microSD!");

  //SD.remove(namaFile);
  myFile = SD.open(namaFile, FILE_WRITE); //menulis File coba.txt

  // jika file sudah berhasil dibuka maka tulis data dimulai
  if (myFile) {
    Serial.println("mencoba nulis data di file coba.txt");
    myFile.println(data);
    // tutup file
    myFile.close();
    Serial.println("SELESAI!");
  } else {
    // jika gagal print error
    Serial.println("GAGAL TULIS "+namaFile);
  }
}

void baca(){
  
  Serial.println("Open file on MicroSD card...");
  if (!SD.begin(pin)) {
    Serial.println("Failed read open Microsd card!");
    return;
  }
 
  // Buka File 
  myFile = SD.open(namaFile);  
  
  String pesan;
  if (myFile){ 
    Serial.println("membaca file: "+namaFile);
    while(myFile.available()){
      pesan = myFile.readString();
      Serial.println(pesan);

    }   
    
    myFile.close();
    Serial.println("done!"); 
  } else {
    // jika gagal print error
    Serial.println("failed open");
    
    }
  
}


void setup(){
  //set up untuk komunikasi serial melalui serial monitor
  Serial.begin(9600);
  
}


int i = 1;
void loop(void) {
  delay(1000);

  String pesan = "data"+String(i)+","+String(i);
  //Serial.println(pesan);
  tulis(pesan);
  delay(2000);
  baca();
  i++;
}

Hasilnya

Buka file di kartu microSD
Sukses baca kartu microSD!
mencoba nulis data di file coba.txt
SELESAI!
Open file on MicroSD card...
membaca file: data.txt
data1,1
data1,1
data2,2

File data.txt akan terus terisi, agar bisa dimulai dari awal lagi tidak append kalian gunakan SD.remove(namaFile);

See also  Jam Digital dengan Relay Time Clock RTC DS1307

Membaca String dengan Parser

Pada kasus diatas, kita menggunakan modul micro SD card untuk menyimpan data, nah bagaimana menggunakan sebagai pengaturan ke arduino uno? misalkan untuk membuat saklar otomatis untuk pompa air penyiraman tanaman yaitu

  • double WAKTU_TUNGGU = 100;
  • double WAKTU_KERJA = 5;

Artinya kita ingin menyalakan skalar jika sudah mencapai waktu 100 detik dan nyala saklar selama 5 detik. Format data disimpan dalam file coba.txt dengan isi sebagai berikut akan saya isi dengan 30, 5 artinya akan nyala pada detik 30 selama 5 detik saja

30,5

nanti kita parser dengan function berikut

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;
 
  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  } 
 
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

dan membuat function saklar, kita anggap punya pompa pada PIN 5

void saklar(bool aktif){
  if(aktif){
    digitalWrite(pompa, HIGH);
    Serial.println("HIGH");
  }else{
    digitalWrite(pompa, LOW);
    Serial.println("LOW");
  }
}

Berikut detailnya yaitu file akan dibaca pada saat setup saja untuk menghindari membaca file secara terus menerus yang akan menghemat umur pemakaian micro SD. Seumpa terjadi kegagalan baca maka kita juga bisa memberikan nilai defaultnya yaitu

  • double WAKTU_TUNGGU = 100;
  • double WAKTU_KERJA = 5;

 

#include <SD.h>
#include <SPI.h>

#define pin 4
#define pompa 5


File myFile;

String namaFile = "coba.txt";


double WAKTU_TUNGGU = 100;
double WAKTU_KERJA = 5;
double INCREMENT = 1;
bool AKTIF = false;



void saklar(bool aktif){
  if(aktif){
    digitalWrite(pompa, HIGH);
    Serial.println("HIGH");
  }else{
    digitalWrite(pompa, LOW);
    Serial.println("LOW");
  }
}

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;
 
  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  } 
 
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void baca(){  
  Serial.println("Open file on MicroSD card...");
  if (!SD.begin(pin)) {
    Serial.println("Failed read open Microsd card!");
    return;
  } 
  // Buka File 
  myFile = SD.open(namaFile);   
  String buff;
  if (myFile){ 
    Serial.println("membaca file: "+namaFile);
    while(myFile.available()){
      buff = myFile.readString();
    }
    WAKTU_TUNGGU = getValue(buff, ',', 0).toDouble();
    WAKTU_KERJA = getValue(buff, ',', 1).toDouble();
    myFile.close();
  } else {

    Serial.println("failed open");
    //buatnilai default
    WAKTU_TUNGGU = 3*60*60;
    WAKTU_KERJA = 10;

  }
  
}



void setup(){
  //set up untuk komunikasi serial melalui serial monitor
  Serial.begin(9600);
  pinMode(pompa, OUTPUT);
  saklar(AKTIF);
  baca();
}



void loop(void) {
  delay(1000);
  saklar(AKTIF);
  if (INCREMENT==WAKTU_TUNGGU){
    AKTIF = true;
  }
  if (INCREMENT==(WAKTU_TUNGGU+WAKTU_KERJA)){
    AKTIF = false;
    INCREMENT = 0;
  }
  Serial.println("INCREMENT: "+String(INCREMENT)+" WAKTU_TUNGGU: "+String(WAKTU_TUNGGU)+" WAKTU_KERJA: "+String(WAKTU_KERJA));
  INCREMENT = INCREMENT +1;
}

Hasilnya

OW
INCREMENT: 25.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
LOW
INCREMENT: 26.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
LOW
INCREMENT: 27.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
LOW
INCREMENT: 28.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
LOW
INCREMENT: 29.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
LOW
INCREMENT: 30.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
HIGH
INCREMENT: 31.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00
HIGH
INCREMENT: 32.00 WAKTU_TUNGGU: 30.00 WAKTU_KERJA: 10.00

Nah dengan cara ini kalian bisa mengatur pompa melalui file micro sd, misalkan ingin nyala dalam 1 hari sekali selama 60 detik, pakai nilai

  • WAKTU_TUNGGU = 60 detik x 1440 menit = 86400 detik
  • WAKTU_KERJA = 5
See also  Pengertian dan Penggunaan Modul I2C: Memahami Komunikasi Serial Antar-Perangkat

Pengaturan dalam bentuk *.ini

Selain dalam bentuk separator diatas yang tentunya terbatas! kalian bisa menggunakan format *.ini yang lebih luwes seperti contoh berikut

[network]
ip address = 192.168.10.3

[user]
name = Isaac Asimov
id = 1234
righthanded = Yes

[calibration]
k1 = 1.234
k2 = 567.8

Kalian bisa menggunakan library