Sensore ultrasuoni

Buonasera,
sto realizzando un indicatore di livello del liquido di un serbatoio mobile (un carro-botte) con un sensore ad ultrasuoni waterproof JSN-SR04T e Arduino Nano clone.
Riscontro che quando il serbatoio è attaccato alla motrice, le vibrazioni causano diverse false letture al sensore. Ho già provato a realizzare dei supporti differenti per il sensore ma invano.
Leggendo su questo forum ho visto che per evitare ciò, è necessario filtrare le letture scartando le misure troppo differenti dal valore reale e facendo una media mobile od una mediana delle rimanenti misure valide.
Ho anche guardato diversi video ma, a causa della poca conoscenza del linguaggio di programmazione, non riesco a capire come poterlo fare.
Fin ora il codice che utilizzo è il seguente:

` #include <NewPing.h>

// Define connections to sensor
#define TRIGPIN 11
#define ECHOPIN 10
const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 5;
const int LED5 = 6;
const int BUZZER = 7;
#define ITERATIONS 5 // Number of iterations.
 
// Floats to calculate distance
float duration, distance;
 
void setup() {
  // Set up serial monitor
  Serial.begin(115200);
 
  // Set pinmodes for sensor connections
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  pinMode(LED1 , OUTPUT);
  pinMode(LED2 , OUTPUT);
  pinMode(LED3 , OUTPUT);
  pinMode(LED4 , OUTPUT);
  pinMode(LED5 , OUTPUT);
  pinMode(BUZZER , OUTPUT);

}
 
void loop() {
 
  // Set the trigger pin LOW for 1uS
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(1);
 
  // Set the trigger pin HIGH for 1us to send pulse
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(1);
 
  // Return the trigger pin to LOW
  digitalWrite(TRIGPIN, LOW);
 
  // Measure the width of the incoming pulse
  duration = pulseIn(ECHOPIN, HIGH);
 
  // Determine distance from duration
  // Use 343 metres per second as speed of sound
  // Divide by 1000 as we want millimeters
 
  distance = (duration / 2) * 0.343;
 
  // Print result to serial monitor
  Serial.print("distance: ");
  Serial.print(distance);
  Serial.println(" mm");

    // Delay before repeating measurement
  delay(200);

  if ( distance <= 1280 )
  {
    digitalWrite(LED1, HIGH);
  }
  else
  {
    digitalWrite(LED1, LOW);
  }
  if ( distance <= 1080 )
  {
    digitalWrite(LED2, HIGH);
  }
  else
  {
    digitalWrite(LED2, LOW);
  }
  if ( distance <= 780 )
  {
    digitalWrite(LED3, HIGH);
  }
  else
  {
    digitalWrite(LED3, LOW);
  }
  if ( distance <= 530 )
  {
    digitalWrite(LED4, HIGH);
  }
  else
  {
    digitalWrite(LED4, LOW);
  }
  if ( distance <= 260 )
  {
    digitalWrite(LED5, HIGH);
  }
  else
  {
    digitalWrite(LED5, LOW);
  }
  if ( distance <= 250 )
  {
    digitalWrite(BUZZER, HIGH);
  }
  else
  {
    digitalWrite(BUZZER, LOW);
  }
 
  }
 
`

Qualcuno potrebbe darmi una mano con il codice per creare una media mobile o una mediana e a scartare i valori non reali?
Grazie e buona serata

Buongiorno e benvenuto nella sezione Italiana del forum,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... cortesemente, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15) e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Ho appena fatto la presentazione

1 Like

Per la pendenza, devi usare due sensori, uno in testa e uno in coda, e fare la media; per le oscillazioni, invece, devi fare un vettore (array, matrice unidimensionale) circolare, in cui scrivi sequenzialmente n letture, una ogni x secondi, e ogni tanto fai la media di tutti i valori correnti.
Nel setup, all'avviamento, con il veicolo ancora fermo, visualizzi subito il valore medio dei sensori, che sarà esatto; poi, nel loop, cominci a far girare il vettore.
Per le temporizzazioni usa millis():

if (millis()-t_letture>=500) leggi();
if (millis()-t_visual>=5000) visual();

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.