Control PID

Buena tarde señores.

El motivo que me trae aquí es para pedirles ayuda en cuanto a la programación, ya que soy nuevo en este ámbito.
El proyecto que quiero realizar es referente al llenado de un estanque, para ello cuenta con un sensor ultrasonico HC-SR04, el controlador MEGA 2560, Motor Shield y una bomba de agua( motor DC 12v)
Para ello debo hacer un control PID, en donde la perturbación sera una llave manual al costado del tanque( recipiente) .
Al momento de abrir la llave el controlador deberá estabilizar el nivel en todo momento, nunca deberá bajar del valor de setpoint.

En pocas palabras he estado recolectando y viendo vídeos acerca de la programación, para lo cual tengo un código y que en cierta parte puedo obtener la distancia con el sensor ultrasonico, pero al momento de seguir con la programación quedo a ciegas ya que no cuento con conocimientos para programar.

Le dejo el código y espero que me puedan ayudar.

Saludos cordiales

#include <AFMotor.h>

#define echoPin 10
#define triggerPin 9
#define motorPin 13

int delaymili = 500;
int maximumRangeCm = 150;
int minimumRangeCm = 10;
AF_DCMotor motor1(1, MOTOR12_64KHZ); 
long duration, distanceCm;

void setup() {
  Serial.begin(9600);
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(motorPin, OUTPUT);
  motor1.setSpeed(255);
}

int i;
void loop() {
initTrigger();
 
  duration = pulseIn(echoPin,HIGH);
  distanceCm = microsecCm(duration);

  if (distanceCm >= maximumRangeCm || distanceCm <= minimumRangeCm) {
       motor1.run(FORWARD);      
       for (i=0; i<255; i++) {
        motor1.setSpeed(i);  
        delay(3);     
        Serial.println("Out of range");       
       }   
  }
  else {
       for( i = 255; i >= 0; i--){
       motor1.setSpeed(i); 
       Serial.print("Distance in cm: ");
       Serial.println(distanceCm);
       delay(delaymili);
       }
    }
}
long microsecCm(long microsecond) {
  return microsecond / 58;
}

void initTrigger() {
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

}

No solo deberías saber programación sino también la teoría en cuanto a todo lo que se refiere al a un sistema de control automático. Cual es tu función de transferencia?? supongo para hacer este tipo de control debes ya tener tu sistema planificado?, vas hacer tu control pid analógico o digital porque si es digital ya en arduino hay bastantes librerias en todo caso te dejo este manual para mayor información. Como dije de todas maneras necesitas tener ya tener tu función de transferencia para saber tus valores proporcionales kp, integrales ki y derivativos kd que mejor se adecuen y necesiten tu sistema para poder controlarlo.

Y bueno personalmente para hacer mis sistemas de control lo que yo he usado ha sido la funcion ident de matlab para obtener la función de trasferencia obteniendo los datos de entrada y salida del sistema o también el pid tunner pero si encuentras una forma mas fácil y optima pues también lo podrías aplicar.