2#include <Adafruit_Sensor.h>
8#include <SparkFun_LPS28DFW_Arduino_Library.h>
39 if (pressureHpa <= 0.f || seaLevelHpa <= 0.f)
41 return 44330.0f * (1.0f - powf(pressureHpa / seaLevelHpa, 0.190284f));
61 Serial.println(
"ERROR: MX25 flash begin failed");
65 const uint32_t cap =
g_flash.getCapacity();
66 Serial.printf(
"Flash capacity: %lu bytes\r\n",
67 static_cast<unsigned long>(cap));
69 Serial.println(
"WARN: flightLogInit failed");
74 Serial.println(
"ERROR: LIS3DH not found");
82 if (!
g_imu.begin(SPI, SPISettings(4000000, MSBFIRST, SPI_MODE3),
84 Serial.println(
"ERROR: ISM330 SPI begin failed");
89 while (!
g_imu.getDeviceReset())
92 g_imu.setDeviceConfig(
true);
93 g_imu.setBlockDataUpdate(
true);
98 g_imu.setAccelFilterLP2(
true);
100 g_imu.setGyroFilterLP1(
true);
104 Serial.println(
"ERROR: ISM330 configureWakeUpOnInt1 failed");
108 g_imu.setPinMode(
false);
112 Serial.println(
"ERROR: LPS28DFW not found");
115 lps28dfw_md_t modeConfig = {
116 .fs = LPS28DFW_1260hPa,
117 .odr = LPS28DFW_50Hz,
118 .avg = LPS28DFW_4_AVG,
119 .lpf = LPS28DFW_LPF_ODR_DIV_4,
121 if (
g_baro.setModeConfig(&modeConfig) != LPS28DFW_OK) {
122 Serial.println(
"ERROR: LPS28DFW setModeConfig failed");
134 Serial.println(
"DAN-E Avionics ready");
138 const uint32_t now =
millis();
142 (void)
g_lis.readAndClearInterrupt();
148 (void)
g_imu.serviceWakeUpInterrupt(&wu);
153 if (
g_baro.getSensorData() == LPS28DFW_OK) {
154 const float hpa =
g_baro.data.pressure.hpa;
155 const float tempC =
g_baro.data.heat.deg_c;
171 const uint16_t raw =
g_adc.read();
179 sensors_event_t ev{};
182 const float ax = ev.acceleration.x / 9.80665f;
183 const float ay = ev.acceleration.y / 9.80665f;
184 const float az = ev.acceleration.z / 9.80665f;
188 if (
g_imu.checkStatus()) {
202 static uint32_t s_dbgMs = 0;
203 if (now - s_dbgMs >= 200U) {
206 "state=%u baro_ok\r\n",
This is a library for the Adafruit LIS3DH Accel breakout board.
void digitalWrite(int, int)
#define ISM330_WAKEUP_DUR
#define ISM330_ROUTE_DRDY_TO_INT1
#define LPS28DFW_I2C_ADDR
#define LPS28DFW_SEA_LEVEL_HPA
bool apogeeShouldConfirm()
void apogeePushAltitude(float alt_m)
Class that stores state and functions for interacting with Adafruit_LIS3DH.
SPI driver for ISM330DHCX.
static constexpr uint8_t INT1_THS_VALUE
static constexpr uint8_t ISM330_WKUP_THS
static constexpr float PT_FULL_SCALE_PSI
static constexpr uint8_t INT1_DUR_VALUE
static volatile bool g_imuWakeFlag
static volatile bool g_launchFlag
static ISM330DH_SPI g_imu
static SPIFlash g_flash(PIN_MX25_CS)
void IRAM_ATTR onImuInt()
static sfe_ism_data_t g_accel
static Adafruit_LIS3DH g_lis(PIN_ACCEL_CS, &SPI)
static uint32_t s_lastMcpMs
static sfe_ism_data_t g_gyro
static uint32_t s_lastLpsMs
static STAR_MCP3201 g_adc(PIN_ADC_CS, &SPI)
static float pressureToAltitudeM(float pressureHpa, float seaLevelHpa)
void IRAM_ATTR onAccelInt()
void logLis3dh(float ax_g, float ay_g, float az_g, uint32_t t_ms)
bool flightLogInit(SPIFlash &flash, uint32_t capacityBytes)
void logMcp3201(uint16_t raw, float psi, uint32_t t_ms)
void logIsm330(float ax, float ay, float az, float gx, float gy, float gz, uint32_t t_ms)
void logLps28dfw(float hpa, float temp_c, float alt_m, uint32_t t_ms)
FlightState flightStateGet()
void flightStateOnLaunchDetect()
Idle → Launch (call from main when LIS3 launch ISR fires).
void flightStateOnApogee()
Launch → Active when apogee algorithm confirms (only valid from Launch).
void applyActuatorOutputs()
#define ISM_LP_ODR_DIV_100
Filled by serviceWakeUpInterrupt() when INT1 was a wake-up (high-accel) event.