Data Logger
Table
| Function | ESP32-S3 GPIO | Net | Connected To |
|---|---|---|---|
| USB D- | GPIO19 | USB_D_N_MCU | J2 via R16 22Ω and U6 ESD |
| USB D+ | GPIO20 | USB_D_P_MCU | J2 via R17 22Ω and U6 ESD |
| CAN TX | GPIO4 | CAN_TX | U4 TJA1049 TXD |
| CAN RX | GPIO5 | CAN_RX | U4 TJA1049 RXD |
| CAN STB | GPIO6 | CAN_STB | U4 STB, R5 pull-up |
| I2C SDA | GPIO8 | I2C_SDA | U5 DS3231 + J4 + R9 4.7k |
| I2C SCL | GPIO9 | I2C_SCL | U5 DS3231 + J4 + R10 4.7k |
| RTC reset | GPIO7 | RTC_RST | U5 ~RST |
| RTC interrupt | GPIO15 | RTC_INT | U5 |
| SD SCK | GPIO10 | SD_SCK_MCU | R18 33Ω to J3 CLK |
| SD MOSI/CMD | GPIO11 | SD_MOSI_MCU | R19 33Ω to J3 CMD |
| SD MISO/DAT0 | GPIO12 | SD_MISO_MCU | R20 33Ω from J3 DAT0 |
| SD CS/DAT3 | GPIO13 | SD_CS_DAT3 | J3 CD/DAT3, R12 pull-up |
| BOOT | GPIO0 | BOOT_IO0 | SW3 + R8 pull-up |
| User button | GPIO14 | USER_BUTTON | SW4 + R21 pulldown |
| Status LED | GPIO21 | STATUS_LED | R11 + D4 |
| UART TX | GPIO17 | UART_TX | J5 pin 2 |
| UART RX | GPIO18 | UART_RX | J5 pin 3 |
| ADC A | GPIO1 | ADC1_CH0 | J6 pin 2, R22 pulldown |
| ADC B | GPIO2 | ADC1_CH1 | J6 pin 3 |
Ini
[env:esp32-s3-devkitc-1] platform = espressif32 board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 lib_deps = adafruit/RTClib@^2.1.4 sandeepmistry/CAN@^0.3.1
Cpp
#include <Arduino.h> #include <Wire.h> #include <SPI.h> #include <SD.h> #include <RTClib.h> #include <CAN.h> constexpr int PIN_CAN_TX = 4; constexpr int PIN_CAN_RX = 5; constexpr int PIN_CAN_STB = 6; constexpr int PIN_I2C_SDA = 8; constexpr int PIN_I2C_SCL = 9; constexpr int PIN_SD_SCK = 10; constexpr int PIN_SD_MOSI = 11; constexpr int PIN_SD_MISO = 12; constexpr int PIN_SD_CS = 13; constexpr int PIN_USER_BUTTON = 14; constexpr int PIN_RTC_INT = 15; constexpr int PIN_STATUS_LED = 21; constexpr int PIN_UART_TX = 17; constexpr int PIN_UART_RX = 18; constexpr int PIN_ADC0 = 1; constexpr int PIN_ADC1 = 2; RTC_DS3231 rtc; SPIClass sdSPI(FSPI); HardwareSerial PortB(1); void setup() { Serial.begin(115200); pinMode(PIN_STATUS_LED, OUTPUT); pinMode(PIN_CAN_STB, OUTPUT); pinMode(PIN_USER_BUTTON, INPUT); digitalWrite(PIN_CAN_STB, LOW); // normal CAN mode Wire.begin(PIN_I2C_SDA, PIN_I2C_SCL); if (!rtc.begin()) Serial.println("DS3231 not found"); sdSPI.begin(PIN_SD_SCK, PIN_SD_MISO, PIN_SD_MOSI, PIN_SD_CS); if (!SD.begin(PIN_SD_CS, sdSPI)) Serial.println("microSD init failed"); CAN.setPins(PIN_CAN_RX, PIN_CAN_TX); if (!CAN.begin(500E3)) Serial.println("CAN init failed"); PortB.begin(115200, SERIAL_8N1, PIN_UART_RX, PIN_UART_TX); Serial.println("OBD2 logger starter running"); } void loop() { digitalWrite(PIN_STATUS_LED, millis() / 500 % 2); int packetSize = CAN.parsePacket(); if (packetSize) { File f = SD.open("/canlog.csv", FILE_APPEND); DateTime now = rtc.now(); if (f) { f.printf("%lu,%04d-%02d-%02dT%02d:%02d:%02d,0x%lX,", millis(), now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second(), CAN.packetId()); while (CAN.available()) f.printf("%02X ", CAN.read()); f.println(); f.close(); } } delay(5); }
Platform
Pin Map
platformio.ini
Starter Source
Flash Notes