При программировании Arduino часто возникает необходимость долговременного энергонезависимомо хранения данных. Это могут быть настройки вашего приложения, журнал событий или что-то другое. на многих платах, таких, как Arduino Uno или Arduino Nano, под хранение таких данных выдел раздел в 1кБ. Но этого часто бывает недостаточно. Даже на Arduino Mega памяти не сильно больше - 4кБ.
Есть 2 вариант.
Первый: подключить модуль для работы с sd-картами. Это удобно тем, что, можно поменять флешку или легко переписать данные на компьютер. Но бывают случаи, когда такой модуль не подходит из-за его достаточно большого размера и энергозатрат.
Второй вариант: использование модуля памяти AT24C256. Он очень маленький, дешевый и позволяет хранить 32кБ. Для многих задач этого объема вполне достаточно.
Купить модуль можно в двух вариантах: отдельную микросхему или же небольшую плату:
Подключается модуль к контактам 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