Введение
Хотели ли вы когда-нибудь сохранять данные, которые переживут отключение питания? Во встраиваемых системах EEPROM (электрически стираемая программируемая постоянная память) является стандартным решением для энергонезависимого хранения. Сегодня мы смоделируем операцию чтения/записи I2C EEPROM с помощью Raspberry Pi Pico — и всё это в вашем браузере с Velxio. Никакого оборудования не требуется!
Мы запишем несколько байт в EEPROM, прочитаем их обратно и убедимся, что они совпадают. Попутно вы узнаете о протоколе I2C, библиотеке Wire и о том, как отлаживать вывод через последовательный порт. Давайте начнём!
Схема подключения
Откройте пример в Velxio, и вы увидите схему на холсте. Основные компоненты:
- Raspberry Pi Pico (микроконтроллер)
- Красный светодиод (с меткой
led-write) — загорается во время записи - Зелёный светодиод (с меткой
led-read) — загорается во время чтения

Детали подключения
| От (пин Pico) | К (компоненту) | Цвет провода |
|---|---|---|
| D12 (GPIO12) | Анод красного светодиода | Красный (#ff4444) |
| D10 (GPIO10) | Анод зелёного светодиода | Зелёный (#00cc00) |
| Катод красного светодиода | GND.1 | Чёрный (#000000) |
| Катод зелёного светодиода | GND.1 | Чёрный (#000000) |
Примечание: В этой симуляции I2C EEPROM является виртуальной — она встроена в среду Velxio. Светодиоды используются как визуальные индикаторы: красный светодиод мигает во время записи, зелёный — во время чтения. В реальной схеме вы бы подключили линии SDA и SCL EEPROM к пинам I2C Pico (по умолчанию GPIO4 и GPIO5, но здесь мы используем D12 и D10 для светодиодов).
Разбор кода
Давайте разберём скетч Arduino. Код использует библиотеку Wire для связи по I2C.
Подключения и определения
#include <Wire.h>
#define EEPROM_ADDR 0x50
Мы подключаем библиотеку Wire и определяем I2C-адрес EEPROM как 0x50. Это распространённый адрес для EEPROM серии 24LC.
Вспомогательные функции
void eepromWrite(byte memAddr, byte data) {
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(memAddr);
Wire.write(data);
Wire.endTransmission();
delay(5); // Цикл записи EEPROM
}
byte eepromRead(byte memAddr) {
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(memAddr);
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR, 1);
return Wire.available() ? Wire.read() : 0xFF;
}
eepromWrite: Отправляет адрес памяти, за которым следует байт данных.delay(5)имитирует внутренний цикл записи EEPROM (обычно 5 мс).eepromRead: Сначала отправляет адрес памяти («фиктивная запись»), затем запрашивает один байт из EEPROM. Возвращает байт или0xFF, если ничего нет.
Setup
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin();
Serial.println("=== Pico I2C EEPROM Test ===");
Serial.println();
// Запись 8 байт
Serial.println("Writing 8 bytes...");
byte testData[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE};
for (int i = 0; i < 8; i++) {
eepromWrite(i, testData[i]);
Serial.print(" ["); Serial.print(i);
Serial.print("] = 0x");
if (testData[i] < 16) Serial.print('0');
Serial.println(testData[i], HEX);
}
Serial.println();
// Чтение обратно
Serial.println("Reading back...");
int pass = 0;
for (int i = 0; i < 8; i++) {
byte val = eepromRead(i);
Serial.print(" ["); Serial.print(i);
Serial.print("] = 0x");
if (val < 16) Serial.print('0');
Serial.print(val, HEX);
if (val == testData[i]) {
Serial.println(" OK");
pass++;
} else {
Serial.print(" FAIL (expected 0x");
Serial.print(testData[i], HEX);
Serial.println(")");
}
}
Serial.println();
Serial.print("Result: ");
Serial.print(pass);
Serial.println("/8 passed");
}
- Инициализирует последовательный порт на скорости 115200 бод и шину I2C с помощью
Wire.begin(). - Записывает 8 байт (
0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE) по адресам 0–7. - Считывает каждый адрес и сравнивает с исходными данными. Выводит «OK» или «FAIL».
- В конце выводит количество пройденных тестов.
Loop
void loop() {
delay(10000);
}
Ничего повторять не нужно — тест выполняется один раз в setup(). Цикл просто делает задержку, чтобы вывод в последовательный порт оставался видимым.
Ключевые концепции
- Протокол I2C: Двухпроводная последовательная шина (SDA, SCL) для связи между микроконтроллерами и периферийными устройствами. Каждое устройство имеет уникальный адрес.
- Библиотека Wire: Встроенная библиотека Arduino для I2C. Основные функции:
beginTransmission(),write(),endTransmission(),requestFrom()иread(). - Адресация EEPROM: EEPROM организованы в банки памяти. Мы передаём байт адреса памяти перед данными.
- Задержка цикла записи: EEPROM требуется несколько миллисекунд для сохранения данных.
delay(5)гарантирует завершение записи перед следующей операцией.
Частые ошибки и советы по отладке
- Неправильный I2C-адрес: Перепроверьте адрес EEPROM. Распространённые адреса: от
0x50до0x57(в зависимости от выводов A0/A1/A2). - Отсутствие подтягивающих резисторов: В реальном оборудовании на линиях SDA и SCL нужны подтягивающие резисторы (4,7 кОм). Виртуальная EEPROM в Velxio обрабатывает это внутренне.
- Скорость передачи в мониторе порта: Убедитесь, что монитор последовательного порта настроен на 115200 бод. Несоответствие приводит к нечитаемому выводу.
- Время цикла записи: Если пропустить
delay(5), EEPROM может не сохранить данные корректно. При необходимости увеличьте задержку. - Светодиоды не мигают: Проверьте подключение. Красный светодиод подключён к D12, зелёный — к D10. Оба катода идут на GND.
Предлагаемые расширения
- Сохранение и чтение данных с датчика: Считайте датчик температуры и сохраните последнее значение в EEPROM.
- Добавьте кнопку: Используйте тактовую кнопку для запуска чтения или записи.
- Расширьте до 256 байт: Измените код для записи большего блока данных.
- Используйте EEPROM для конфигурации: Храните калибровочные значения или настройки пользователя.
Попробуйте сами!
Готовы экспериментировать? Откройте живой пример в Velxio:
Нажмите кнопку Run на панели инструментов редактора, чтобы скомпилировать и запустить симуляцию. Наблюдайте за выводом в консоли — вы должны увидеть, что все 8 байт успешно считаны.

Используйте панель инструментов холста для масштабирования, панорамирования и осмотра схемы.

Нужно добавить больше компонентов? Откройте палитру компонентов для просмотра деталей.

Удачной симуляции!