Arduino

технологии

Работа с модулем памяти AT24C256

При программировании Arduino часто возникает необходимость долговременного энергонезависимомо хранения данных. Это могут быть настройки вашего приложения, журнал событий или что-то другое. на многих платах, таких, как Arduino Uno или Arduino Nano, под хранение таких данных выдел раздел в 1кБ. Но этого часто бывает недостаточно. Даже на Arduino Mega памяти не сильно больше - 4кБ.

Есть 2 вариант.

Первый: подключить модуль для работы с sd-картами. Это удобно тем, что, можно поменять флешку или легко переписать данные на компьютер. Но бывают случаи, когда такой модуль не подходит из-за его достаточно большого размера и энергозатрат.

Второй вариант: использование модуля памяти AT24C256. Он очень маленький, дешевый и позволяет хранить 32кБ. Для многих задач этого объема вполне достаточно.

Купить модуль можно в двух вариантах: отдельную микросхему или же небольшую плату:

AT24C256    AT24C256 Board

Подключается модуль к контактам SCL и SDA и работает по протоколу I2C. Напомню, пины для подключения будут разными в зависимости от модели платы:

Плата Пин SDA Пин SCL
Uno, Nano A4 A5
Mega2560 20 21
Leonardo 2 3
Due 20, SDA1 21, SCL1

VCC подключаем к +5V, а GND - к соответствующего пину на плате Arduino.

Для работы с модулем будем использовать библиотеку Wire.

#include <Wire.h>    
 
#define disk1 0x50 // Адрес чипа 24LC256
 
void setup(void)
{
  Serial.begin(9600);
  Wire.begin();  
 
  unsigned int address = 0;
 
  writeEEPROM(disk1, address, 123);
  Serial.print(readEEPROM(disk1, address), DEC);
}
 
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data) 
{
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));
  Wire.send((int)(eeaddress & 0xFF));
  Wire.send(data);
  Wire.endTransmission();
 
  delay(5);
}
 
byte readEEPROM(int deviceaddress, unsigned int eeaddress) 
{
  byte rdata = 0xFF;
 
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));
  Wire.send((int)(eeaddress & 0xFF));
  Wire.endTransmission();
 
  Wire.requestFrom(deviceaddress,1);
 
  if (Wire.available()) rdata = Wire.receive();
 
  return rdata;
}

void loop()
{
}

В начале мы задаем константу с адресом модуля. По-умолчанию при подключении одного модуля, он будет иметь адрес 0x50. Есть возможность подключения нескольких модулей (адреса будут 0x51, 0x52 и т.д.).

Далее, в ячейку памяти с адресом 0 мы записываем 1 байт со значением 123, после чего считываем его.

Так как адресация двухбайтовая, то в функциях записи и чтение мы передаем адрес в виде двух байт - старшей и младшей его части. Также стоит обратить внимание, что в конце функции записи writeEEPROM() стоит задержка в 5 миллисекунд - это требуемая для правильной работы микросхемы задержка между функциями записи.

Ссылки на покупку модуля у проверенных мной продавцов: 1, 2 и 3