Доброго всем предновогоднего дня! Недавно столкнулся с задачей постоянной записи данных метеостанции в течение длительного времени. Самих данных-то немного: это температура, влажность и давление. Но поскольку они записываются для анализа в течение часов, дней, недель и месяцев, встроенной памяти Ардуино Nano (2кБ) не хватает. Сначала подумал о переделывании станции на ESP8266, чтобы писать данные через WiFi, но этот вариант не устроил необходимостью постоянно держать включенный компьютер. Вторым рассмотренным вариантом было подключение SD-накопителя, но он подключается через шину SPI, к которой уже подключен китайский TFT-дисплей 320х240 без вывода выбора устройства CS (точнее, он подключен к земле прямо на плате дисплея). Из-за этого устройства конфликтуют. Решением было бы подключить один из модулей к программному SPI, но флешка этого не умеет, а дисплей сильно тормозит. Тогда родилось решение использовать простой по использованию чип от Atmel: 24C512. Это микросхема ПЗУ объемом 512 Кбит / 8 = 64 кБ – вполне достаточно для сбора данных метеостанции в течение нескольких месяцев. Она подключается по интерфейсу I2C с адресом, варьируемым в некоторых пределах, так что мешать другим устройствам не будет. А использовать ее очень просто. Единственный недостаток чипа – он медленный. Звук или видео в реальном времени на него точно не запишешь. Но для большинства задач логгирования и управления скорости хватает с запасом. Рассмотрим его поподробнее:
Это китайская подделка стоимостью чуть больше доллара (маркировка – краска, не лазерный гравер), но свои функции он выполняет отлично.
Давайте посмотрим, как его подключить.
Ножки 1, 2 и 3 отвечают за выбор адреса, который строится: 1010(3)(2)(1). Т.е. если все 3 ножки подключены к земле, то адрес будет 0х50, если первая – к плюсу, то 0х51, если только вторая к плюсу, то 0х52, если первая и вторая, то 0х53 и т.д.
Вывод 5 – SDA, вывод 6 – SCL (ножки A4 и A5 у Ардуины Nano) – I2C.
Вывод 7 разрешает запись при подаче низкого логического уровня.
Выводы 4 и 8 – земля и питание (+5В).
Т.е. подключаем ноги 1, 2, 3, 4, 7 – к земле, 8 – к +5В, а 5 и 6 – к А4 и А5 Ардуинки.
Теперь напишем функции для чтения / записи:
void writeAddress(byte address, byte val)
{
Wire.beginTransmission(I2C);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.write(val);
Wire.endTransmission();
delay(5);
}
byte readAddress(int address)
{
Wire.beginTransmission(I2C);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(I2C, 1);
return Wire.available() ? Wire.read() : 0xFF;
}
Разумеется, надо подключить библиотеку Wire, написать #define I2C 0x50 и в функции setup() инициализировать Wire: Wire.begin().
Хочу также отметить, что задержку в 5мс при записи нужно делать не всегда, а лишь при переключении страниц памяти. Так что можно запоминать, куда было последнее обращение и делать задержку только при несовпадении страниц. Вот тут и кроется «медлительность» работы контроллера. Но для логгирования данных метеостанции это непринципиально.
Китайцы продают аналогичные контроллеры с меньшим объемом памяти. Для самых маленьких чипсов размер адреса будет не 2, а 1 байт. Учтите это в процедурах чтения / записи, если будете с ними работать. Также видел в продаже уже готовый модуль на основе чипа 24С256, но памяти вдвое меньше, а стоит дороже…
Микросхему лучше не впаивать, а поставить на панельку. Во-первых она боится перегрева, а во-вторых можно легко заменить.
Удачи в Ваших начинаниях!