Proyecto 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

Prueba.ino (1.17 KB)

#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);

}

hsy bibloteca para pid.

Mira lo que sugiere genobraker en este post Control PID