Setelah sebelumnya dibahas tentang dasar menulis dan membaca data pada EEPROM internal Arduino, pada tutorial belajar Arduino kali ini akan membahas tentang bagaimana menulis dan membaca data string dalam EEPROM internal Arduino. Untuk data string yang akan digunakan, dimasukkan dengan menggunakan feature komunikasi serial dengan komputer, yakni bisa dengan Serial Monitor pada Arduino IDE.
Source Code
Berikut ini adalah source code (sketch) Arduino, menulis dan membaca data string dalam EEPROM Arduino.
/*
Program menulis dan membaca string
Arduino internal EEPROM
Loki Lang
*/
#include <EEPROM.h>
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 511;
boolean eeprom_is_addr_ok(int addr)
{
return ((addr >= EEPROM_MIN_ADDR) && (addr <= EEPROM_MAX_ADDR));
}
boolean eeprom_write_bytes(int startAddr, const byte* array, int numBytes)
{
int i;
if
(!eeprom_is_addr_ok(startAddr) || !eeprom_is_addr_ok(startAddr + numBytes))
{
return false;
}
for(i = 0; i < numBytes; i++) {
EEPROM.write(startAddr + i, array[i]);
}
return true;
}
boolean eeprom_write_string(int addr, const char* string)
{
int numBytes;
numBytes = strlen(string) + 1;
return eeprom_write_bytes(addr, (const byte*)string, numBytes);
}
boolean eeprom_read_string(int addr, char* buffer, int bufSize)
{
byte ch;
int bytesRead;
if(!eeprom_is_addr_ok(addr))
{
return false;
}
if(bufSize == 0)
{
return false;
}
if(bufSize == 1) {
buffer[0] = 0;
return true;
}
bytesRead = 0;
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
while( (ch != 0x00) && (bytesRead < bufSize) && ((addr + bytesRead) <= EEPROM_MAX_ADDR) )
{
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
}
if((ch != 0x00) && (bytesRead >= 1))
{
buffer[bytesRead - 1] = 0;
}
return true;
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
const int bufSize = 15;
char buf[bufSize];
String langString;
char langStringChar[bufSize];
while(Serial.available() > 0)
{
Serial.println("Masukkan string:");
langString = Serial.readString();
langString.toCharArray(langStringChar, bufSize);
strcpy(buf, langStringChar);
eeprom_write_string(0, buf);
Serial.println("String disimpan di alamat EEPROM");
delay(1000);
Serial.println("Tampilkan string dari alamat EEPROM:");
eeprom_read_string(0, buf, bufSize);
Serial.println(buf);
}
}
Program menulis dan membaca string
Arduino internal EEPROM
Loki Lang
*/
#include <EEPROM.h>
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 511;
boolean eeprom_is_addr_ok(int addr)
{
return ((addr >= EEPROM_MIN_ADDR) && (addr <= EEPROM_MAX_ADDR));
}
boolean eeprom_write_bytes(int startAddr, const byte* array, int numBytes)
{
int i;
if
(!eeprom_is_addr_ok(startAddr) || !eeprom_is_addr_ok(startAddr + numBytes))
{
return false;
}
for(i = 0; i < numBytes; i++) {
EEPROM.write(startAddr + i, array[i]);
}
return true;
}
boolean eeprom_write_string(int addr, const char* string)
{
int numBytes;
numBytes = strlen(string) + 1;
return eeprom_write_bytes(addr, (const byte*)string, numBytes);
}
boolean eeprom_read_string(int addr, char* buffer, int bufSize)
{
byte ch;
int bytesRead;
if(!eeprom_is_addr_ok(addr))
{
return false;
}
if(bufSize == 0)
{
return false;
}
if(bufSize == 1) {
buffer[0] = 0;
return true;
}
bytesRead = 0;
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
while( (ch != 0x00) && (bytesRead < bufSize) && ((addr + bytesRead) <= EEPROM_MAX_ADDR) )
{
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
}
if((ch != 0x00) && (bytesRead >= 1))
{
buffer[bytesRead - 1] = 0;
}
return true;
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
const int bufSize = 15;
char buf[bufSize];
String langString;
char langStringChar[bufSize];
while(Serial.available() > 0)
{
Serial.println("Masukkan string:");
langString = Serial.readString();
langString.toCharArray(langStringChar, bufSize);
strcpy(buf, langStringChar);
eeprom_write_string(0, buf);
Serial.println("String disimpan di alamat EEPROM");
delay(1000);
Serial.println("Tampilkan string dari alamat EEPROM:");
eeprom_read_string(0, buf, bufSize);
Serial.println(buf);
}
}
Untuk sebuah alamat EEPROM secara default mampu menyimpan data dengan jenis data integer atau character, karena itu perlu dilakukan proses mengubah jenis data dari string menjadi deretan (array) character. Karena data yang dimasukkan dari Serial Monitor Arduino IDE berupa string, untuk itu digunakan function readString(), tidak dengan function read() yang digunakan untuk input data integer atau character saja. Dalam contoh source code (sketch) Arduino tersebut, ukuran array character ialah 15. Dengan kata lain menampung 15 character untuk satu string. Kemudian string yang telah diubah ke array character tersebut, disimpan dalam alamat EEPROM. Tutorial belajar menulis dan membaca string pada EEPROM Arduino ini berdasarkan hasil modifikasi source code (sketch) yang ada di Arduino Playground. Berikut link untuk sumber Arduino Playground.
Saat ini di Indonesia board Arduino Uno R3 dapat diperoleh dengan mudah di kota-kota besar. Board Arduino Uno R3 dijual dengan harga murah. Membuat perkembangan Arduino kian pesat. Bila ada sesuatu yang belum jelas dan ingin tahu lebih dalam seputar project Arduino, pemrograman, dan elektronika, bisa bertanya pada bagian comment.