MicroSD Card Module Pin ESP32 Pin
3.3V
GND
GPIO 5
GPIO 23
GPIO 18
GPIO 19
#include <SPI.h>
#include <SD.h>
#define SIGNAL_PIN 4 // GPIO pin for digital signal
#define CS_PIN 5 // Chip Select pin for SD card module
#define BUFFER_SIZE 1024 // Buffer size for data storage
File dataFile;
volatile unsigned long timestamps[BUFFER_SIZE];
volatile int index = 0;
void IRAM_ATTR handleSignalChange() {
if (index < BUFFER_SIZE) {
timestamps[index++] = micros(); // Record timestamp in microseconds
}
}
void setup() {
Serial.begin(115200);
// Configure signal pin
pinMode(SIGNAL_PIN, INPUT);
// Attach interrupt to capture changes in signal
attachInterrupt(digitalPinToInterrupt(SIGNAL_PIN), handleSignalChange, CHANGE);
// Initialize SD card
if (!SD.begin(CS_PIN)) {
Serial.println("Failed to initialize SD card!");
while (1);
}
Serial.println("SD card initialized.");
// Open file for writing
dataFile = SD.open("/signal_data.txt", FILE_WRITE);
if (!dataFile) {
Serial.println("Failed to open file for writing!");
while (1);
}
Serial.println("Ready to capture data...");
}
void loop() {
if (index >= BUFFER_SIZE) {
detachInterrupt(digitalPinToInterrupt(SIGNAL_PIN)); // Stop capturing when buffer is full
Serial.println("Writing data to SD card...");
for (int i = 0; i < BUFFER_SIZE; i++) {
dataFile.println(timestamps[i]); // Write each timestamp to the file
}
dataFile.flush(); // Ensure all data is written to the SD card
Serial.println("Data written successfully!");
while (1); // Halt execution
}
}
#include <SPI.h>
#include <SD.h>
#define SIGNAL_PIN 4 // GPIO pin for digital signal output
#define CS_PIN 5 // Chip Select pin for SD card
File dataFile;
unsigned long previousTime = 0;
void setup() {
Serial.begin(115200);
// Configure the signal pin as output
pinMode(SIGNAL_PIN, OUTPUT);
// Initialize SD card
if (!SD.begin(CS_PIN)) {
Serial.println("SD card initialization failed!");
while (1);
}
// Open the file for reading
dataFile = SD.open("/signal_data.txt", FILE_READ);
if (!dataFile) {
Serial.println("Failed to open file for reading!");
while (1);
}
Serial.println("Ready to replay recorded signal...");
}
void loop() {
static unsigned long currentTime;
if (dataFile.available()) {
// Read the next timestamp from the file
unsigned long timestamp = dataFile.parseInt();
// Wait until the correct time to toggle the signal
while (micros() < timestamp);
// Toggle the signal pin
digitalWrite(SIGNAL_PIN, !digitalRead(SIGNAL_PIN));
previousTime = timestamp;
} else {
dataFile.close();
Serial.println("Playback complete!");
while (1); // Halt execution after playback is done
}
}