⏳ Часть 47: Эмуляция путешествий во времени с использованием EEPROM

Мы создадим систему, которая запоминает будущие события (записывая их в 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(&currentEvent, 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();
    }
}

Вам также может понравиться

About the Author: ардуинчиков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *