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