Problemas PID librería PID_v1.h

Llevo ya algún tiempo intentando solucionar un problema con el proyecto de PID en arduino, en la librería PID_v1.h. Utilizando de ésta el programa PID_Basic, y ahora os paso a explicar de forma resumida mi proyecto.
Este consta de dos arduinos, uno de ellos gestiona el encoder incremental óptico, y mediante comunicación I2C le pasa la información de las rpm al otro arduino, en el cual está implementado el PID que gestiona mediante un puente en H un motor conectado al encoder, bueno, el sistema es estable y una vez sintonizado las variables Kp Ki y Kd va bien, pero cuando paro el motor, y al llegarle 0 rpm al PID, la salida Output se va al maximo 255 ya que el PID intenta subir la velocidad del motor al detectar que no hay rpm, y ocurre que cuando vuelvo a conectar el motor este se pone de forma brusca a máxima velocidad durante varios segundos situación que no ocurre cuando se inicia el arduino o lo reseteo, es entonces cuando va de forma suave subiendo de PWM hasta alcanzar el Setpoint y quedarse estable.
He mirado en la pagina del desarrollador en otra en español donde explica mediante pdf diversos casos de mejora y he intentado sin éxito entrar en la librería para intentar cambiar algún código del programa relacionado con la salida del PID pero nada de nada. Por ello me gustaría que alguien me pudiera indicar como solventar este problema.

Cuando paras el motor, deten el PID!! Simple
Para que conservas el PID cuando paras el motor, le dices 0 RPM el PID que hará intentará FULL power al puente H.

Esta bien lo que hace.

Muchas gracias surbyte por contestarme, vale, el PID se inicia en cada ciclo de Void Loop aunque tengo puesto una cierta contemporización al PID con myPID.SetSampleTime(tmp), entiendo que detener el PID se realiza no pasando por myPID.Compute(); desde luego las pruebas que hago son un poco bestias ya que paro el motor cortandole la corriente con un interruptor, tambien lo intente con un reset por software.
Os dejo el código, del actual programa

#include <PID_v1.h>
#include <Wire.h>

int dato =0;
const int SM_1= 10;
const int SM_2= 11;
double Setpoint = 0.0, Input = 0.0, Output = 0.0;
double  Kp=0.7, Ki=0.64, Kd=0.012;
double outMax = 0.0, outMin = 0.0;
unsigned int  tmp = 0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup()
{
  
Serial.begin(9600);   
Wire.begin();
analogWrite(SM_1, 0);
analogWrite(SM_2,0); 
outMax =  255;                    // Límite máximo del controlador PID.
outMin = 0;   
Setpoint = 150;
tmp = 8;
myPID.SetSampleTime(tmp);
myPID.SetOutputLimits(outMin, outMax);
myPID.SetMode(AUTOMATIC);//MANUAL (AUTOMATIC
}

void loop()
{   
Wire.requestFrom(1, 1);    // LE PIDE DATOS AL ESCLAVO_1 POR EL CABLE
while(Wire.available())    // ESPERA QUE HAYA DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE
   { 
   dato = Wire.read();   // LEE LOS DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE, Y ALMACENA EN dato
   delay (5);
   }
  
  Input = dato;
  Serial.println( Output); 
  //Serial.println(dato);
  myPID.Compute();
  analogWrite(SM_1,Output);
  analogWrite (SM_2,0);
}

Proba asi

#include <PID_v1.h>
#include <Wire.h>

int dato  = 0;
const int SM_1= 10;
const int SM_2= 11;
double  Setpoint = 0.0, Input = 0.0, Output = 0.0;
double  Kp=0.7, Ki=0.64, Kd=0.012;
double outMax = 0.0, outMin = 0.0;
unsigned int  tmp = 0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
const byte pinBoton = 2;   // coloca el pin que gustes. conecta el boton entre GND y PIN 2
bool estado, estadoAnt = false;

void setup() {
    Serial.begin(9600);   
    Wire.begin();

    pinMode(pinBoton, INPUT_PULLUP);

    analogWrite(SM_1, 0);
    analogWrite(SM_2,0); 
    outMax =  255;                    // Límite máximo del controlador PID.
    outMin = 0;   
    Setpoint = 150;
    tmp = 8;
    myPID.SetSampleTime(tmp);
    myPID.SetOutputLimits(outMin, outMax);
    myPID.SetMode(AUTOMATIC);//MANUAL (AUTOMATIC
}

void loop() {   

  estado = digitalRead(pinBoton);
  if (estado && estadoAnt) {
      statusMotor = !statusMotor;
  }
  estadoAnt = estado;

  leo_RPM();
  
  if (statusMotor) {   // si statusMotor = true entonces motor funciona y PID funciona.
      Serial.println( Output); 
      //Serial.println(dato);
      myPID.Compute();
      analogWrite(SM_1,Output);
      analogWrite(SM_2,0);  
  } 
  else {
      analogWrite(SM_1, 0);
      analogWrite(SM_2, 0);  
  }
}

void leo_RPM() {
  Wire.requestFrom(1, 1);    // LE PIDE DATOS AL ESCLAVO_1 POR EL CABLE
  while (Wire.available()) {    // ESPERA QUE HAYA DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE
         dato = Wire.read();   // LEE LOS DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE, Y ALMACENA EN dato
         delay (5);
  }
  Input = dato;
}

Me sorprende que sintonices un PID y no puedas poner un pulsador.

He modificado el programa y parece que funciona, no sé si he hecho una barbaridad, espero que me lo indiquéis

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>
#include <Wire.h>
const int BOTON = 7;
int dato =0;
const int SM_1= 10;
const int SM_2= 11;
double Setpoint = 0.0, Input = 0.0, Output = 0.0;
double  Kp=0.6, Ki=0.64, Kd=0.012;
double outMax = 0.0, outMin = 0.0;
unsigned int  tmp = 0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup()
{
pinMode(BOTON,INPUT);  
Serial.begin(9600);   
Wire.begin();
analogWrite(SM_1, 0);
analogWrite(SM_2,0); 
outMax =  255;                    // Límite máximo del controlador PID.
outMin = 0;   
Setpoint = 150;
tmp = 8;
myPID.SetSampleTime(tmp);
myPID.SetOutputLimits(outMin, outMax);
myPID.SetMode(AUTOMATIC);//MANUAL (AUTOMATIC
}

void loop()
{   
myPID.SetMode(AUTOMATIC);
Wire.requestFrom(1, 1);    // LE PIDE DATOS AL ESCLAVO_1 POR EL CABLE
while(Wire.available())    // ESPERA QUE HAYA DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE
   { 
   dato = Wire.read();   // LEE LOS DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE, Y ALMACENA EN RDS_1
   delay (5);
   }
  
  Input = dato;
 // Serial.println( Output); 
 //Serial.println(dato);
  if (digitalRead(BOTON)== LOW)
  {
  myPID.Compute();
  Serial.println(Output); 
  analogWrite(SM_1,Output);
  analogWrite (SM_2,0);
  }
  else
  {
  analogWrite(SM_1,0);
  analogWrite (SM_2,0);
  myPID.SetMode(MANUAL);
  Output=0;
  Input = 0;
  double  Kp=0.6, Ki=0.64, Kd=0.012;
  Serial.println(Output); 
  }
}

Muchas gracias surbyte, siiiiiii sé como actuar con un pulsador en arduino jajjajaa pues anda que no me dio guerra para evitar rebotes y que funcionara el pulsador on/off off/on tal como lo haces en el programa que has mandado, lo cual te agradezco.
Te comento he realizado un primer prtograma tal como el tuyo, pero seguía igual, lo que he hecho es que al apretar el botón pongo el sistema en myPID.SetMode(MANUAL); pongo las variables internas Output y Input a cero y ya va, lo que no sé si he hecho una barbaridad.

Bueno me alegro. Yo siempre uso los pulsadores asi. Cuando tengo rebotes entonces usa la librería Bounce2 y asunto terminado. No me hago problemas.

Respecto del código, muchas veces uno sugiere algo, pero la práctica y la ultima respuesta la tiene uno, porque tiene el hardware y mira como se comporta.

Solo te di un empujoncito.

Si ha sido un empujoncito, pero me ha ayudado muchísimo, y por ello te lo agradezco.