Didalam sebuah mikontroler atau modul arduino kita dapat mengakses memori yang tidak terhapus meski power dimatikanmemori tersebut bernama eeprom (Electrically Erasable Programmable Read-Only Memory) . Tiap2 modul mikrokontroler memiliki sejumlah kapasitas memori eeprom yang berbeda beda.
Apabila memori internal ini dirasa masih kurang bisa menggunakan ic tambahan yaitu ic memori eksternal seperti ic buatan pabrikan atmel AT24C02, AT24C04, AT24C08, AT24C16, AT24C32, AT24C64, AT24C128, AT24C256 dst . Jenis memori eksternal tersebut tergantung berapa kapasitas didalamnya. Misalnya AT24C02 berarti memiliki kapasitas 2 KiloByte.
Berikut cara mengakses ic eksternal eeprom tersebut menggunakan komunikasi i2c . Dengan komunikasi i2c ini, dalam satu jalur i2c bisa dihubungkan dengan banyak device i2c seperti ic eeprom eksternal ini secara paralel dengan membedakan masing2 device dengan address yang berbeda
Pertama kita definiskan dulu yaitu alamat devicenya.
Device Adress (Alamat Device)
Alamat device ini bergantung pada port A1. Jika A1=0(GND) maka alamatnya juga 0. Jika A1=1(VCC) maka alamat devicenya juga 1.
Di dalam contoh projek ini kita menggunakan ic eeprom eksternal AT24C02 diakses oleh arduino mega, program ini device ic ini saya hubungkan Port A dengan 0V, maka device ic nya yaitu 0x50.
Sedangkan untuk menulis data ke ic eeprom eksternal ini kita sesuai dengan protokol untku baca tulis via komunikasi i2c. Untuk
Operasi Write (tulis)
BYTE WRITE: untuk memilih data di memori EEPROM diperlukan 17-bit word alamat. Alamat ini terdiri dari bit P0 pada device adrress (alamat device), dan kemudian iikuti MSB dan LSB word alamat kemudian baru datanya.
Operasi Read (baca)
secara prinsip, operasi baca ini sama dengan operasi tulis, hanya saja bit R/W diberi logika 1.
Sedangkan untuk pemrogramannya karena kita mencontohkan menggunakan arduino mega dan ditulis dengan bahasa c pada code editor arduino yaitu sebagai berikut:
//untuk tulis ke ic eeprom eksternal
void eeprom_i2c_write(byte address, byte from_addr, byte data) {
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.write(data);
Wire.endTransmission();
}
//ini untuk baca dari ic eeprom eksternal
byte eeprom_i2c_read(int address, int from_addr) {
byte result;
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.endTransmission();
Wire.requestFrom(address, 1);
if(Wire.available())
result= Wire.read();
Wire.endTransmission();
return result;
}
Prinsip kerja dari contoh projek ini yaitu terdiri dari 2 tombol up dan down untuk menaikkan nilai yang dapat dilihat pada barled, kemudian ada switch untuk menyimpan posisi led tersebut dan lokasi simpannya sesuai dengan tombol “store1-store10” . Untuk write pada eeprom switch store harus pada posisi ditekan dan tombol store1-10 ditekan sekali. sedangkan untuk membaca eeprom yaitu posisi switch store lepas dan tombol store1-10 ditekan maka akan tampil nilai led sesuai yang telah disimpat sebelumnya.
Berikut skema rangkaian:
Sebagai catatan untuk pin SCK pada eeprom harus dihubungkan dengan pin SCL (pin 21) arduino mega dan pin SDA pada eeprom harus dihubungkan dengan pin SDA (pin 20) arduino mega. Dan dipasang pullup resistor pada masing2 jalur teresebut sebesar 10K .
Sedangkan program lengkapnya sebagai berikut:
#include <Wire.h>
#define DEVICE_ADDRESS 0x50 // I2C Buss address of 24C02 A2=A1=A0 = GND
#define tekan LOW
#define lepas HIGH
#define off LOW
#define on HIGH
byte count1,count2;
int count;
byte flag=0;
int ledPin[] = {2,3,4,5,6,7,8,9,10,11,12,13};
int button[] = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12};
int buttonState[]={0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup() {
Wire.begin();
Serial1.begin(9600);
for (int i=0;i<12;i++)
{
pinMode(ledPin[i], OUTPUT);
}
for (int i=0;i<13;i++)
{
digitalWrite(button[i], INPUT_PULLUP);
pinMode(button[i], INPUT);
}
count=0;
}
void loop() {
for (int i=0;i<13;i++)
buttonState[i] = digitalRead(button[i]);
if(buttonState[0]==tekan && flag==0)
{
flag=1;
count++;
if(count>4095)count=0;
display(count);
}
if(buttonState[1]==tekan && flag==0)
{
flag=1;
count--;
if(count>4095)count=4095;
display(count);
}
if(buttonState[0]==lepas && buttonState[1]==lepas && flag==1)
{
flag=0;
}
if(buttonState[2]==tekan)
{
for(int i=0;i<10;i++)
{
if(buttonState[3+i]==tekan)
{
count1=(byte)(count >> 8); //MSB
count2=(byte)(count & 0xFF);//LSB
eeprom_i2c_write(DEVICE_ADDRESS,i*2,count1);
delay(10);
eeprom_i2c_write(DEVICE_ADDRESS,i*2+1,count2);
delay(10);
}
}
}
for(int i=0;i<10;i++)
{
if(buttonState[3+i]==tekan)
{
count1=eeprom_i2c_read(DEVICE_ADDRESS, i*2);
delay(10);
count2=eeprom_i2c_read(DEVICE_ADDRESS, i*2+1);
delay(10);
count=(int)count1*256+count2;
display(count);
}
}
}
void display(unsigned int number)
{
for (int i =0;i<12;i++)
{
if (bitRead(number, i)==1)
{
digitalWrite(ledPin[i], on);
}
else
{
digitalWrite(ledPin[i], off);
}
}
}
void eeprom_i2c_write(byte address, byte from_addr, byte data) {
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.write(data);
Wire.endTransmission();
}
byte eeprom_i2c_read(int address, int from_addr) {
byte result;
Wire.beginTransmission(address);
Wire.write(from_addr);
Wire.endTransmission();
Wire.requestFrom(address, 1);
if(Wire.available())
result= Wire.read();
Wire.endTransmission();
return result;
}
Untuk demo video sebagai berikut:
Untuk file program bisa diunduh disini : https://drive.google.com/file/d/1LuM7YRnbXz2E96kQENbzx1lt3wgwV0cl/view?usp=sharing
Jika ada saran dan kritik bisa hubungi kami via wa
0896-7901-7407 atau klik wa.me/6289679017407
Terima kasih 🙂