Мы создадим систему, которая запоминает будущие события (записывая их в EEPROM) и может проецировать их в прошлое!
Машина времени на Arduino:
cpp
#include <EEPROM.h>
#include <avr/random.h>
#define TIMELINE_SIZE 64
#define EVENT_SIZE 8
// Структура события во времени
struct TimeEvent {
uint32_t timestamp; // Временная метка
uint8_t type; // 0=сенсор, 1=действие, 2=мысль
uint8_t data[EVENT_SIZE - 4];
};
// Хранилище событий (в EEPROM)
TimeEvent timeline[TIMELINE_SIZE];
uint8_t currentIndex = 0;
uint32_t currentTime = 0;
uint32_t futureTime = 0;
// Запись события в EEPROM
void saveEvent(TimeEvent* event, uint8_t index) {
uint16_t addr = index * sizeof(TimeEvent);
EEPROM.put(addr, *event);
}
// Чтение события из EEPROM
void loadEvent(TimeEvent* event, uint8_t index) {
uint16_t addr = index * sizeof(TimeEvent);
EEPROM.get(addr, *event);
}
// Предсказание будущего (на основе прошлых паттернов)
void predictFuture() {
// Анализируем паттерны в EEPROM
TimeEvent patterns[10];
for (uint8_t i = 0; i < 10; i++) {
loadEvent(&patterns[i], i);
}
// Ищем повторяющиеся паттерны
for (uint8_t i = 0; i < 10; i++) {
for (uint8_t j = i + 1; j < 10; j++) {
if (memcmp(&patterns[i], &patterns[j], sizeof(TimeEvent)) == 0) {
// Найден паттерн - предсказываем следующее событие
futureTime = patterns[i].timestamp + 1000;
// Записываем предсказание как "будущее событие"
TimeEvent futureEvent;
futureEvent.timestamp = futureTime;
futureEvent.type = 2; // Мысль
futureEvent.data[0] = 0xAA; // Признак предсказания
saveEvent(&futureEvent, 63); // В конец массива
}
}
}
}
// Путешествие в прошлое (восстановление состояния)
void travelToPast(uint32_t targetTime) {
// Ищем событие с targetTime
for (uint8_t i = 0; i < TIMELINE_SIZE; i++) {
TimeEvent event;
loadEvent(&event, i);
if (event.timestamp == targetTime) {
// Восстанавливаем состояние из события
Serial.print("Возврат во время: ");
Serial.println(targetTime);
// Восстанавливаем данные
// ...
break;
}
}
}
// Парадокс дедушки (исправление временной линии)
void fixGrandfatherParadox() {
// Проверяем, не создали ли мы парадокс
for (uint8_t i = 0; i < TIMELINE_SIZE; i++) {
TimeEvent event;
loadEvent(&event, i);
if (event.type == 2 && event.data[0] == 0xAA) {
// Найдено предсказание, которое сбылось
// Удаляем его, чтобы избежать парадокса
TimeEvent empty;
empty.timestamp = 0;
empty.type = 0;
memset(empty.data, 0, EVENT_SIZE - 4);
saveEvent(&empty, i);
}
}
}
// Основной цикл машины времени
void timeMachineLoop() {
currentTime = millis();
// Запись текущего события
TimeEvent currentEvent;
currentEvent.timestamp = currentTime;
currentEvent.type = random(0, 3);
for (uint8_t i = 0; i < EVENT_SIZE - 4; i++) {
currentEvent.data[i] = random(256);
}
saveEvent(¤tEvent, currentIndex);
currentIndex = (currentIndex + 1) % TIMELINE_SIZE;
// Каждые 10 секунд - предсказание будущего
static uint32_t lastPredict = 0;
if (currentTime - lastPredict > 10000) {
predictFuture();
lastPredict = currentTime;
}
// Каждые 30 секунд - проверка парадоксов
static uint32_t lastParadoxCheck = 0;
if (currentTime - lastParadoxCheck > 30000) {
fixGrandfatherParadox();
lastParadoxCheck = currentTime;
}
}
void setup() {
Serial.begin(115200);
randomSeed(analogRead(A0));
// Инициализация EEPROM
Serial.println("Машина времени активирована!");
Serial.println("Текущая временная линия: ARDUINOHACKS-2026");
}
void loop() {
timeMachineLoop();
// Вывод состояния
static uint32_t lastPrint = 0;
if (millis() - lastPrint > 5000) {
Serial.print("Время: ");
Serial.print(millis());
Serial.print(" | Индекс: ");
Serial.print(currentIndex);
// Читаем будущее событие
TimeEvent futureEvent;
loadEvent(&futureEvent, 63);
if (futureEvent.timestamp != 0) {
Serial.print(" | Будущее событие в: ");
Serial.print(futureEvent.timestamp);
}
Serial.println();
lastPrint = millis();
}
}