ОЗУ из КОНДЕНСАТОРОВ — Делаем 1 БАЙТ оперативки из кондеров

Всем привет!
Я недавно увидел видос, как один чел в ютубе сделал 8 байт памяти на специальных магнитных колечках. Я придумал сделать память на конденсаторах, так как у меня есть много конденсаторов, всех по 10 штук.
Я взял конденсаторы с самой большой емкостью — по 220 микрофарад, 8 штук. А также 8 резисторов по 10 кОм, можно и на 1 кОм.
Конечно, этот вариант памяти просто для прикола и эксперимента. Эффективнее использовать готовый чип памяти — будет и больше памяти, и удобнее использовать.
ПОДКЛЮЧЕНИЕ

Нам понадобится 8 конденсаторов большой емкости и напряжение от 5 вольт, 8 резисторов 1-10 кОм, 8 проводов для заряда/разряда, 8 проводов для измерения заряда.
- Подключаем конденсаторы в линию, объединяем все минусы конденсаторов.
- К плюсам подключаем резисторы, через эти резисторы подключаем на 8 цифровых пинов, 1 пин на конденсатор. Либо можете использовать сдвиговый регистр для чтения сигнала.
- Также подключаем провода ДО РЕЗИСТОРОВ, напрямую к плюсам конденсаторов, и подключаем провода к 8 аналоговым пинам.
- Загружаем скетч и пробуем записать любое число от 0 до 255. Наша память может принимать 256 вариантов из единиц и нулей на 8 позициях.
СКЕТЧ
Скетч для управления оперативкой на конденсаторах в 1 байт
// Пины для управления (заряд/разряд)
int chargePins[8] = {22, 23, 24, 25, 26, 27, 28, 29};
// Пины для чтения напряжения
int readPins[8] = {A0, A1, A2, A3, A4, A5, A6, A7};
// Время записи и очистки в миллисекундах, чем больше емкость конденсаторов, тем больше время.
int writeTime = 1000;
void setup() {
Serial.begin(9600);
// Ставим все управляющие пины в режим входа (чтобы не мешали)
for (int i = 0; i < 8; i++) {
pinMode(chargePins[i], INPUT);
}
Serial.println("==========================================");
Serial.println(" ПАМЯТЬ НА КОНДЕНСАТОРАХ 220 мкФ");
Serial.println(" Arduino Mega | 8 бит (1 байт)");
Serial.println("==========================================");
Serial.println();
Serial.println("Команды:");
Serial.println(" [число 0-255] - записать в память");
Serial.println(" r - прочитать и показать");
Serial.println(" c - очистить (записать 0)");
Serial.println();
Serial.println("Текущее состояние памяти:");
printMemory();
Serial.println();
Serial.println("Ожидание команды...");
}
// -------- Запись одного бита --------
void writeBit(int index, int val) {
int p = chargePins[index];
pinMode(p, OUTPUT);
if (val == 1) {
digitalWrite(p, HIGH);
delay(writeTime);
} else {
digitalWrite(p, LOW);
delay(writeTime);
}
pinMode(p, INPUT); // Отключаем пин, чтобы заряд не утекал
}
// -------- Чтение одного бита --------
int readBit(int index) {
int p = chargePins[index];
int a = readPins[index];
// Быстрая подзарядка (компенсируем утечку)
pinMode(p, OUTPUT);
digitalWrite(p, HIGH);
delayMicroseconds(50);
pinMode(p, INPUT);
int voltage = analogRead(a);
return (voltage > 512) ? 1 : 0;
}
// -------- Запись байта --------
void writeByte(byte val) {
Serial.print("Запись числа ");
Serial.print(val);
Serial.print(" (");
// Показываем бинарный вид
for (int i = 0; i < 8; i++) {
int bit = (val >> (7 - i)) & 1;
Serial.print(bit);
}
Serial.println(") ...");
// Записываем биты
for (int i = 0; i < 8; i++) {
int bit = (val >> (7 - i)) & 1;
writeBit(i, bit);
}
Serial.println("Готово!");
}
// -------- Чтение байта --------
byte readByte() {
byte result = 0;
for (int i = 0; i < 8; i++) {
int bit = readBit(i);
result = (result << 1) | bit;
}
return result;
}
// -------- КРАСИВЫЙ ВЫВОД ПАМЯТИ --------
void printMemory() {
byte data = readByte();
Serial.print(" ");
// Выводим 8 символов: # или _
for (int i = 0; i < 8; i++) {
int bit = (data >> (7 - i)) & 1;
if (bit == 1) {
Serial.print("#");
} else {
Serial.print("_");
}
}
Serial.print(" = ");
Serial.print(data);
Serial.println(" (0-255)");
}
// -------- Очистка памяти --------
void clearMemory() {
Serial.println("Очистка памяти...");
writeByte(0);
Serial.println("Готово!");
}
// -------- ГЛАВНЫЙ ЦИКЛ --------
void loop() {
if (Serial.available() > 0) {
// Читаем команду
String input = Serial.readStringUntil('\n');
input.trim();
if (input.length() == 0) return;
char cmd = input.charAt(0);
// ---- Команда: r (read) ----
if (cmd == 'r' || cmd == 'R') {
Serial.println();
Serial.println("=== ЧТЕНИЕ ПАМЯТИ ===");
printMemory();
Serial.println();
Serial.println("Ожидание команды...");
}
// ---- Команда: c (clear) ----
else if (cmd == 'c' || cmd == 'C') {
Serial.println();
Serial.println("=== ОЧИСТКА ===");
clearMemory();
Serial.println();
Serial.println("Новое состояние:");
printMemory();
Serial.println();
Serial.println("Ожидание команды...");
}
// ---- Если введено число (0-255) ----
else {
int num = input.toInt();
if (num >= 0 && num <= 255) {
Serial.println();
Serial.println("=== ЗАПИСЬ ===");
writeByte((byte)num);
Serial.println();
Serial.println("Новое состояние:");
printMemory();
Serial.println();
Serial.println("Ожидание команды...");
} else {
Serial.println("Ошибка! Введите число от 0 до 255 или команду r/c");
}
}
}
}






