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
Contents
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
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 |
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);
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
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