// --- Liver Perfusion System (HOPE & NMP Modes) ---
// STM32 Central Controller - Optimized for 32KB Flash Simulation
#define MODE_SWITCH_PIN PC13
#define BUZZER_PIN PA5
#define RED_LED_PIN PA4
#define GREEN_LED_PIN PB12
#define SENS_PV_FLOW_1 PA0
#define SENS_PV_FLOW_2 PA1
#define SENS_HA_FLOW PA2
#define SENS_EXTRA_FLOW PA3
#define SENS_PV_PRESS PB0
#define SENS_HA_PRESS PB1
// --- NMP TARGETS ---
const float NMP_PVF_MIN = 1000.0, NMP_PVF_MAX = 1200.0;
const float NMP_HAF_MIN = 250.0, NMP_HAF_MAX = 350.0;
const float NMP_PVP_MIN = 8.0, NMP_PVP_MAX = 12.0;
const float NMP_HAP_MIN = 50.0, NMP_HAP_MAX = 70.0;
// --- HOPE TARGETS ---
const float HOPE_PVF_MIN = 100.0, HOPE_PVF_MAX = 200.0;
const float HOPE_HAF_MAX = 20.0;
const float HOPE_PVP_MAX = 3.0;
const float HOPE_HAP_MAX = 5.0;
void setup() {
Serial.begin(115200);
pinMode(MODE_SWITCH_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
// Give system time to boot
delay(100);
}
void loop() {
// 1. READ MODE SWITCH
bool isNMP = digitalRead(MODE_SWITCH_PIN);
// 2. READ & CONVERT SENSORS
float pvFlow1 = mapFloat(analogRead(SENS_PV_FLOW_1), 0, 4095, 0, 1500);
float haFlow = mapFloat(analogRead(SENS_HA_FLOW), 0, 4095, 0, 500);
float pvPress = mapFloat(analogRead(SENS_PV_PRESS), 0, 4095, 0, 20);
float haPress = mapFloat(analogRead(SENS_HA_PRESS), 0, 4095, 0, 100);
// 3. EVALUATE BOUNDS
bool alarm = false;
if (isNMP) {
if (pvFlow1 < NMP_PVF_MIN || pvFlow1 > NMP_PVF_MAX) alarm = true;
if (haFlow < NMP_HAF_MIN || haFlow > NMP_HAF_MAX) alarm = true;
if (pvPress < NMP_PVP_MIN || pvPress > NMP_PVP_MAX) alarm = true;
if (haPress < NMP_HAP_MIN || haPress > NMP_HAP_MAX) alarm = true;
} else {
// HOPE MODE
if (pvFlow1 < HOPE_PVF_MIN || pvFlow1 > HOPE_PVF_MAX) alarm = true;
if (haFlow > HOPE_HAF_MAX) alarm = true;
if (pvPress > HOPE_PVP_MAX) alarm = true;
if (haPress > HOPE_HAP_MAX) alarm = true;
}
// 4. TRIGGER ALARMS
if (alarm) {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
tone(BUZZER_PIN, 1500);
} else {
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
noTone(BUZZER_PIN);
}
// 5. SEND TELEMETRY JSON (Optimized to save Flash Memory)
// In Phase 2, you will swap "Serial.print" to your ESP32 UART port.
Serial.print("{\"mode\":\"");
Serial.print(isNMP ? "NMP" : "HOPE");
Serial.print("\",\"PV_Flow\":"); Serial.print(pvFlow1, 1);
Serial.print(",\"HA_Flow\":"); Serial.print(haFlow, 1);
Serial.print(",\"PV_Press\":"); Serial.print(pvPress, 1);
Serial.print(",\"HA_Press\":"); Serial.print(haPress, 1);
Serial.print(",\"Alarm\":"); Serial.print(alarm);
Serial.println("}");
delay(250); // 4Hz refresh rate
}
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}--- INPUTS & SENSORS ---
STM32 CENTRAL CONTROLLER
--- OUTPUTS & DISPLAYS ---
HOPE / NMP Switch
Flow 1 (PV)
Flow 2 (PV)
Flow 3 (HA)
Flow 4
Press 1 (PV)
Press 2 (HA)
ESP32 (Wi-Fi Data Bridge)