SDCard/microSD/kartu memori merupakan media penyimpanan yang banyak digunakan pada perangkat-perangkat elektronik untuk menyimpan foto, video, data dll. Dalam aplikasi arduino SDCard bisa dibaca/ditulis dalam protokol SPI, format yang didukung adalah FAT.
Dalam perancangan ini saya menggunakan file .txt yang tersusun sebagai database (contoh database jadwal bel sekolah), dan dibaca dengan arduino untuk kemudian dimasukkan kedalam tabel “jadwalBelajar”.
format yang digunakan adalah
Aktif | Waktu | Hari aktif | Minggu aktif | Kegiatan
Aktif
Sebagai status item/baris jadwal diaktifkan atau tidak(diabaikan)
isiannya Aktif, Tidak Aktif
Waktu
Format waktu jam:menit
Hari aktif
hari dimana item jadwal diaktifkan
isiannya: Senin, Selasa, Rabu, Kamis, Jum’at, Sabtu, Minggu atau kombinasinya dalam bentuk array didalam tanda ‘{‘ dan ‘}’
minggu aktif
isiannya kombinasi minggu bentuk array didalam tanda ‘{‘ dan ‘}’
Kegiatan
text Kegiatan
Skema:
sketch/program:
#include <avr/pgmspace.h> #include <SPI.h> #include <SD.h> struct Waktu { byte jam; byte menit; }; struct TabelMataPelajaran { byte aktif; Waktu waktu; byte hariAktif; byte mingguAktif; byte kegiatan; }; const PROGMEM char kegiatan[][21] = { "Jam Pelajaran 1\0 ", "Jam Pelajaran 2\0 ", "Jam Pelajaran 3\0 ", "Jam Pelajaran 4\0 ", "Jam Pelajaran 5\0 ", "Jam Pelajaran 6\0 ", "Jam Pelajaran 7\0 ", "Jam Pelajaran 8\0 ", "Jam Pelajaran 9\0 ", "Jam Pelajaran 10\0 ", "Jam Pelajaran 11\0 ", "Jam Pelajaran 12\0 ", "Jam Pelajaran 13\0 ", "Jam Pelajaran 14\0 ", "Jam Pelajaran 15\0 ", "Masuk\0 ", "Upacara\0 ", "Istirahat\0 ", "Selesai Istirahat\0 ", "Kepramukaan\0 ", "Khusus\0 ", "Pulang\0 ", "Pulang Jumat\0 ", "Pulang Sabtu\0 " }; const char namaHari[][7] PROGMEM = { "Minggu", "Senin\0", "Selasa", "Rabu\0 ", "Kamis\0", "Jum'at", "Sabtu\0" }; const char Aktifasi[][12] PROGMEM = { "Aktif\0 ", "Tidak aktif" }; #define hariAktifSenin 1<<6 #define hariAktifSelasa 1<<5 #define hariAktifRabu 1<<4 #define hariAktifKamis 1<<3 #define hariAktifJumat 1<<2 #define hariAktifSabtu 1<<1 #define hariAktifMinggu 1<<7 #define _hariAktif(Sen,Sel,Rab,Kam,Jum,Sab,Mgu) (Mgu<<7)|(Sen<<6)|(Sel<<5)|(Rab<<4)|(Kam<<3)|(Jum<<2)|(Sab<<1) #define _mingguAktif(Mgu1,Mgu2,Mgu3,Mgu4,Mgu5) (Mgu1<<7)|(Mgu2<<6)|(Mgu3<<5)|(Mgu4<<4)|(Mgu5<<3) #define _waktu(Jam, Menit) {Jam, Menit} #define Aktif 1 #define TidakAktif 0 TabelMataPelajaran jadwalBelajar[150]; Waktu waktu; File fileJadwal; char buffer[21]; void setup() { Serial.begin(9600); Serial.println("Membaca file txt dari SDCard/kartu memori kedalam struct menggunakan Arduino"); Serial.println("(Aplikasi Bel Sekolah)"); Serial.println("https://www.project.semesin.com"); } void loop() { if (!SD.begin(53)) { Serial.println("Gagal memulai kartu memori!"); } else { if (!SD.exists("Jadwal.txt")) { Serial.println("file Jadwal.txt tidak ditemukan"); } else { char c; byte index; String str; fileJadwal = SD.open("Jadwal.txt", FILE_READ); while(1) { c = fileJadwal.peek(); if(c == -1) { break; } else if(c == '/') { while(fileJadwal.read() != '\n'); continue; } else if((c == '\r') || (c == '\n') || (c == '\t') || (c == ' ')) { fileJadwal.read(); continue; } jadwalBelajar[index].aktif = ambilCSVAktif(fileJadwal); ambilCSVWaktu(&jadwalBelajar[index].waktu.jam,&jadwalBelajar[index].waktu.menit, fileJadwal); jadwalBelajar[index].hariAktif = ambilCSVHari(fileJadwal); jadwalBelajar[index].mingguAktif = ambilCSVMinggu(fileJadwal); jadwalBelajar[index].kegiatan = ambilCSVKegiatan(fileJadwal); copyFlashString(buffer, &Aktifasi[jadwalBelajar[index].aktif][0]); Serial.print(buffer); Serial.print('\t'); if(jadwalBelajar[index].waktu.jam < 10) Serial.print('0'); Serial.print(jadwalBelajar[index].waktu.jam); Serial.print(':'); if(jadwalBelajar[index].waktu.menit < 10) Serial.print('0'); Serial.print(jadwalBelajar[index].waktu.menit); Serial.print('\t'); Serial.print(jadwalBelajar[index].hariAktif,HEX); Serial.print('\t'); Serial.print(jadwalBelajar[index].mingguAktif,HEX); Serial.print('\t'); copyFlashString(buffer, &kegiatan[jadwalBelajar[index].kegiatan][0]); Serial.println(buffer); } fileJadwal.close(); } } while(1);//*** } byte ambilCSVAktif(File file) { String str = ambilCSVDariFile(file); for(byte i=0;i<sizeof(Aktifasi)/sizeof(Aktifasi[0]);i++) { copyFlashString(buffer, &Aktifasi[i][0]); if(str.equalsIgnoreCase((String)buffer)) { return i; } } } void ambilCSVWaktu(byte* jam, byte* menit, File file) { String str = ambilCSVDariFile(file); byte pos1 = str.indexOf(':'); *jam = str.substring(0,pos1).toInt(); *menit = str.substring(pos1+1).toInt(); } byte ambilCSVHari(File file) { String str = ambilCSVDariFile(file); for(byte i=0;i<sizeof(namaHari)/sizeof(namaHari[0]);i++) { copyFlashString(buffer, &namaHari[i][0]); if(str.equalsIgnoreCase((String)buffer)) { return 1<<(7-i); } } byte dataHari = 0; byte shift = 0x80; byte hari[7]; ambilCSVDariString(hari, str); for(byte i=0;i<sizeof(hari);i++) { if(hari[i]) { dataHari += shift; } shift >>= 1; } return dataHari; } byte ambilCSVMinggu(File file) { byte dataMinggu = 0; byte shift = 0x80; byte minggu[5]; String str = ambilCSVDariFile(file); ambilCSVDariString(minggu, str); for(byte i=0;i<sizeof(minggu);i++) { if(minggu[i]) { dataMinggu += shift; } shift >>= 1; } return dataMinggu; } byte ambilCSVKegiatan(File file) { String str = ambilCSVDariFile(file); for(byte i=0;i<sizeof(kegiatan)/sizeof(kegiatan[0]);i++) { copyFlashString(buffer, &kegiatan[i][0]); if(str.equalsIgnoreCase((String)buffer)) { return i; } } } String ambilCSVDariFile(File file) { String str = ""; char terminator = ','; while(1) { char c = file.peek(); if(c == '{') { terminator = '}'; file.read(); } else if(((c != terminator) && (c != '\r'))) { str += (char)file.read(); } else { file.read(); if(terminator == '}') { terminator = ','; } else if((terminator == ',') || (c == '\r')) { break; } } } str.trim(); return str; } void copyFlashString(char* buf, const char* alamat) { char c; while(c = pgm_read_byte(alamat++)) { *buf++ = c; } *buf = 0; } void ambilCSVDariString(byte *minggu, String str) { while(1) { int pos = str.indexOf(','); *minggu++ = str.substring(0,pos).toInt(); if(pos == -1) { break; } str = str.substring(pos+1); } }
contok keluaran serial monitor:
Contoh file jadwal.txt:
Jadwal.txt
Bel sekolah bluetooth dengan kontrol android : disini
pak klo brl sekolah yang ini, untuk output belnya di mana ?
Sketch diatas berfungsi menyalin file ‘data jadwal’ dari kartu memory kedalam RAM arduino untuk proses selanjutnya.
‘file jadwal’ dapat diambil dari beberapa sumber:
* Flash (konstant)
* Micro SD (contoh sketch diatas)
* Bluetooth
* Wifi.
proses pengolahan ‘data jadwal’ ini contohnya :
bel-sekolah-menggunakan-tabel-database-fleksibel-berbasis-arduino
gan, untuk mengurangi penggunaan memori pada arduino, bagaiman jika fungsi/class nya d masukin kedalam micro sd bisa ga ya gan ? soalnya saya pake uno r3
Fungsi/class merupakan bagian program yang termasuk ‘perintah/command’.
Arduino belum mendukung external program execution, jadi mustahil untuk dilakukan.
tapi jika ditanyakan menyimpan ‘data’ di external baru bisa, seperti dataflash, SDCard, external RAM, External EEPROM, I2C EEPROM dll.
Gan cara menggabungkan sketch nya bagaimana agar bisa baca file ‘data jadwal’ dari kartu memory yang terus dilanjutkan output.
Aplikasi bel sekolah banyak ragam sesuai kebutuhan, sketch yang ini hanya bagian pembacaan dari sdCard, bagian selanjutnya misalkan pengolahan / eksekusinya bisa masukin di loop.
contoh proses eksekusi :
https://www.project.semesin.com/2018/04/01/bel-sekolah-menggunakan-tabel-database-fleksibel-berbasis-arduino/
Kak kalo program mengetahui sdcard penuh gimanaa
belum coba
secara metris agak rumit, kira2 pesudonya :
1. hitung total cluster = total sector / sector per cluster
2. cari jumlah free cluster = 0
3. sisa (free disk space) = total cluster – jumlah free cluster