diff --git a/BleedingHeartArduino.ino b/BleedingHeartArduino.ino new file mode 100644 index 0000000..179a2e0 --- /dev/null +++ b/BleedingHeartArduino.ino @@ -0,0 +1,119 @@ +#include +#include + +#define pressurePin A0 // Get input from pressure sensor +#define motorPin 3 // control pump motor speed +#define dirPin 6 +#define valvePin1 2 // control forward valve +#define valvePin2 4 // control return valve + +double motorSpeed = 100; // 0 to 255 +int heartRate = 0; // Controls the speed of the valve actuation (Typically 50-120) +double pressure = 0; // pressure read from transducer in kPa +double targetPressure = 0; //target pressure the system should be at in kPa. (Typically 5-25kPa) +String data = ""; + +PID pressurePID(&pressure, &motorSpeed, &targetPressure, 30, 5, 1, DIRECT); + +void setMotorSpeed(){ + pressure = (analogRead(pressurePin)/409.5)*6.89476; // 0 - 4095. (0 - 10 PSI) + pressurePID.Compute(); + if(heartRate <= 0){ + analogWrite(motorPin, 0); + } + else{ + analogWrite(motorPin, (int)motorSpeed); + } +} + +void heartBeat(){ //turns the valves on and off to simulate one heart beat + if(heartRate <= 0){return;} + int delayTime = (60000)/(heartRate*2); // half the time of a single heartbeat in ms + digitalWrite(valvePin1, HIGH); + //delay(delayTime); + unsigned long startTime = millis(); + while(millis()-startTime < delayTime){ + setMotorSpeed(); + printPID(); + } + digitalWrite(valvePin1, LOW); + digitalWrite(valvePin2, HIGH); + //delay(delayTime); + startTime = millis(); + while(millis()-startTime < delayTime){ + setMotorSpeed(); + printPID(); + } + digitalWrite(valvePin2, LOW); +} + +void processString(){ + if (data.substring(0, 5) == "BEAT "){ + heartRate = data.substring(5, data.length()).toInt(); + Serial.print("Heart Rate set to "); + Serial.print(heartRate); + Serial.println(" BPM."); + } + else if (data.substring(0, 5) == "PRSR "){ + targetPressure = data.substring(5, data.length()).toDouble(); + Serial.print("Target Pressure set to "); + Serial.print(targetPressure); + Serial.println(" kPa."); + } + else if (data.substring(0, 5) == "FILL "){ + int fillTime = data.substring(5, data.length()).toInt(); + digitalWrite(valvePin1, HIGH); + digitalWrite(valvePin2, HIGH); + analogWrite(motorPin, 255); + delay(fillTime*1000); + digitalWrite(valvePin1, LOW); + digitalWrite(valvePin2, LOW); + } +} + +void getData(){ + //Serial.println("data recieved"); + data = ""; + while(Serial.available() > 0){ + char c = Serial.read(); + if(c != '\n'){ + data += c; + } + delay(2); + } + Serial.println(data); +} + +void printPID(){ + Serial.print("Current Pressure: "); + Serial.print(pressure); + Serial.print(", Target Pressure: "); + Serial.print(targetPressure); + Serial.print(", Motor Speed:"); + Serial.println(motorSpeed); +} + +void setup() { + // put your setup code here, to run once: + pinMode(pressurePin, INPUT); + pinMode(motorPin, OUTPUT); + pinMode(dirPin, OUTPUT); + pinMode(valvePin1, OUTPUT); + pinMode(valvePin2, OUTPUT); + digitalWrite(dirPin, LOW); + Serial.begin(115200); + pressurePID.SetOutputLimits(0, 255); + pressurePID.SetMode(AUTOMATIC); +} + +void loop() { + // put your main code here, to run repeatedly: + heartBeat(); + if(Serial.available()){ + getData(); + processString(); + } + setMotorSpeed(); + printPID(); + +}