control de llenado de una tolva de pellets por ultrasonidos

Buenas tardes a todos!

Tengo una tolva de pellets para una caldera, la cual hasta ahora mismo se esta llenando desde otra tolva que hay en un foso gracias a un sinfín. Bueno el otro día me dice un familiar que se le ha quemado el motor (ya van dos) porque se dejo el interruptor de llenado encendido y no se dio cuenta. De modo que la tolva se llenó hasta arriba y el motor siguió apretando. Le había instalado un electricista un automático mucho mas grande que el consumo del motor ( eso se va a corregir desde ya con un guardamotor y de su potencia respectivamente).

Entonces lo que quiero hacer con un sensor de ultrasonidos es gestionar ese llenado. Por ejemplo si me quedan 10 cm para llegar a la tapa de la tolva, lo determino como lleno y paro. Si bajo de 25cm por ejemplo, arranco el motor y empiezo a llenar hasta los 10cm donde pararía.
El problema viene dado en parar el motor en caso de que estando encendido, no registrase altura en uno o dos minutos por ejemplo. Lo que querría decir que el foso se ha quedado sin material y así no hacer trabajar al motor en vano. Les adjunto lo que llevo de código (está hecho en Visualino y la verdad que un poco desordenado).

Muchas gracias de antermano y a ver si entre todos podemos sacar este proyecto delante.

/***   Function declaration   ***/

long TP_init(int trigger_pin, int echo_pin);
long Distance(int trigger_pin, int echo_pin);

void setup()
{
  pinMode( 5 , INPUT );

  pinMode( 6 , OUTPUT );

  pinMode(13,OUTPUT);

}

void loop()
{
    distancia=Distance(6,5);
    if (distancia <= 10) {
      digitalWrite(13,LOW);
     }
    delay(500);
    if (distancia >= 25) {
      digitalWrite(13,HIGH);
     }
    delay(500);

}

/***   Function definition   ***/
//bqBAT
long TP_init(int trigger_pin, int echo_pin)
{
  digitalWrite(trigger_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger_pin, LOW);
  long microseconds = pulseIn(echo_pin ,HIGH);
  return microseconds;
}
long Distance(int trigger_pin, int echo_pin)
{
  long microseconds = TP_init(trigger_pin, echo_pin);
  long distance;
  distance = microseconds/29/2;
  if (distance == 0){
    distance = 999;
  }
  return distance;
}

HE simplificado algo tu código, a ver si funciona mas o menos como esperas

#define TRIGGER_PIN 6
#define ECHO_PIN    5
#define TOLBA_LLENA 200  // 200 cm cambiar a lo que corresponda
#define TOLBA_VACIA 10   // 10 cm cambiar a lo que corresponda
long Distance();

void setup()
{
  pinMode( 5 , INPUT );
  pinMode( 6 , OUTPUT );
  pinMode(13,OUTPUT);
}

void loop() {
    distancia = Distance();
    if (distancia > TOLBA_LLENA || distancia <= TOLBA_VACIA) {
        digitalWrite(13,LOW);

    if (distancia >= 25) {
        digitalWrite(13,HIGH);
    }

    delay(500);
}

/***   Function definition   ***/
//bqBAT

long Distance() {
  long distance;

  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long microseconds = pulseIn(ECHO_PIN ,HIGH);

  distance = microseconds/29/2;
  if (distance == 0){
     distance = 999;
  }
  return distance;
}

Muchas gracias por responder y tomarte tu tiempo.
Justo antes de salir de casa he intentado probar tu código pero sin éxito. No compila. De todas formas, como podría jugar a variar el tiempo para decirle que si por ejemplo esta llenando y voy por 17cm y tengo que llegar a los 10cm para determinar como lleno, pero en un espacio de tiempo X (por ejemplo 1min)??? Si no he sido capaz de reducir esa medida, es porque estoy sin material en la otra tolva.
He probado a grabar ese valor justo cuando arranca el motor, es decir, que se grabe en una variable la medida que tiene y tras un minuto por ejemplo comparar con la medida actual. Si dicha medida es igual o mayor, sabemos que no hay material y paramos...pero no me funciona.

Moderador:
Por favor no repitas lo que otra persona te dice.
Ya se lee en el post correspondiente.
Menciona a la persona por su nick y nada mas.
Usa quote o cita para resaltar un párrafo, no todos los párrafos del post.

Item 14 de las normas del foro, último párrafo, si quieres leer al respecto.
Gracias.

Si no compila no creo que requiera demasiado trabajo.
El mío no compila pero el tuyo tampoco, porque justamente me basé en el tuyo y los cambios fueron de simplificacion.

No habías definido la variable distancia y ese fue error tuyo antes que mío y yo olvidé una llave.

#define TRIGGER_PIN 6
#define ECHO_PIN    5
#define TOLBA_LLENA 200  // 200 cm cambiar a lo que corresponda
#define TOLBA_VACIA 10   // 10 cm cambiar a lo que corresponda
long distancia;

void setup()
{
  pinMode( 5 , INPUT );
  pinMode( 6 , OUTPUT );
  pinMode(13,OUTPUT);
}

void loop() {
    distancia = Distance();
    if (distancia > TOLBA_LLENA || distancia <= TOLBA_VACIA) {
        digitalWrite(13,LOW);
    }
    if (distancia >= 25) {
        digitalWrite(13,HIGH);
    }

    delay(500);
}

long Distance() {
  long distance;

  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long microseconds = pulseIn(ECHO_PIN ,HIGH);

  distance = microseconds/29/2;
  if (distance == 0){
     distance = 999;
  }
  return distance;
}

Este compila.
Ahora veamos mejor tu problema.
Para hacer lo que pides debes tener control sobre el motor, hacerlo con un simple SI/NO no resulta simple.
Dices que quieres que de 17 a 10 cm demore un minuto. Si no controlas la velocidad del motor como pretendes hacer una rampa descendente porque eso pides hacer.
Con un motor que solo se enciende/apaga puedes justamente prender apagar pero lo hará ir a los tumbos.
En lo personal no me parece inteligente hacerlo a menos que sea un motor de continua, entonces puedes controlar el ancho del pulso y por ende su velocidad y torque.

Esta es una versión mejor pero o demasiado. Jugando con millis() puedes saber a que velocidad se esta llenando. Como dije, sin control de la velocidad no se como hacer lo que pides.

#define TRIGGER_PIN 6
#define ECHO_PIN    5
#define TOLBA_LLENA 200  // 200 cm cambiar a lo que corresponda
#define TOLBA_VACIA 10   // 10 cm cambiar a lo que corresponda
#define INTERVALO   1000UL  // 1 segundo o 1000 mseg
#define UMBRAL      17
#define DELTA_T     5000UL

long distancia;
unsigned long tiempo, tmediciones;

void setup() {
  pinMode( 5 , INPUT );
  pinMode( 6 , OUTPUT );
  pinMode(13,OUTPUT);

}

void loop() {
    
    if (millis() - tmediciones > INTERVALO) {  // tomo lecturas cada 1 segundo
        distancia = Distance();
        if (distancia > TOLBA_LLENA || distancia <= TOLBA_VACIA) {
            digitalWrite(13,LOW);
        }
        if (distancia >= 25) {
            digitalWrite(13,HIGH);
        }   
        tmediciones = millis();
    }
}

long Distance() {
  long distance;

  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long microseconds = pulseIn(ECHO_PIN ,HIGH);

  distance = microseconds/29/2;
  if (distance == 0){
     distance = 999;
  }
  return distance;
}

De nuevo, gracias por contestar.

Siento meter la pata en cosas que vienen definidas ya en las normas del foro.

En cuanto al funcionamiento, no pretendo tener control sobre el motor exactamente. Si fuese así, hubiese instalado un variador de frecuencia o algo a modo de caudalímetro.
Imaginemos que estamos sacando agua de un pozo y metiéndola en un deposito gracias a una bomba. Pues bien, lo que pretendo es si ese nivel sube hasta los 10cm con respecto al sensor, corto la bomba.
Si bajo hasta los 40cm por ejemplo, enciendo la bomba, extraigo agua del pozo y lleno el deposito hasta los 10cm y paro. La duda llega ahora, ¿ que pasa si el pozo se queda sin agua? que la bomba trabaja en balde y se quema. Puede darse el caso de arrancar porque baja hasta los 40cm, pero comienza a subir el nivel y solo hay agua para subir a 20cm por ejemplo, entonces paramos la bomba.

Yo lo que quiero controlar es lo siguiente: Si tengo la condición de motor encendido, entonces mido la distancia en ese momento....pasa un tiempo X (con el que luego tendré que jugar para irlo adaptando) y comparo. ¿la distancia sigue igual o incluso ha bajado? entonces para el motor. ¿Qué la distancia ha subido? ok, seguimos llenando y comparando cada minuto por ejemplo.
Si paro porque no tengo material, paro motor, relleno el foso y pulso reset para que comience a mover el motor y contar de nuevo.

Mas o menos es esa la idea.

Saludos y gracias.