Κυριακή 21 Μαρτίου 2021

Βελτίωση μέτρηση απόστασης με αισθητήρα υπερήχων, λαμβάνοντας υπόψη παραμέτρους ατμοσφαιρικού αέρα

Περιγραφή

Για την μέτρηση της απόστασης με τον αισθητήρα υπερήχων HC-SR04, θεωρούμε συνήθως την τιμή της ταχύτητας του ήχου στον ατμοσφαιρικό αέρα ίση με 340 m/s. Όμως, η ταχύτητα εξαρτάται και από τις παραμέτρους της ατμοσφαιρικής θερμοκρασίας και υγρασίας. Έτσι, για να έχουμε ακριβέστερες μετρήσεις που θα λαμβάνουν υπόψη τις συνθήκες στην ατμόσφαιρα, χρησιμοποιούμε επιπλέον τον αισθητήρα DHT11 που παρέχει τις μετρήσεις της θερμοκρασίας και της σχετικής υγρασίας και διαμορφώνουμε τον κώδικα αντιστοίχως.
Συγκεκριμένα, έχουμε
ταχύτητα του ήχου = 331,4 + (0,606 * θερμοκρασία σε oC) + (0,0124 * σχετική υγρασίας)


Εξαρτήματα και συνδέσεις

  • πλακέτα Arduino Uno
  • αισθητήρας HC-SR04
  • αισθητήρας DHT11
  • breadboard, jumper wires

  • Κώδικας

    #define trigPin 10
    #define echoPin 13
    #define DHT11_PIN 7

    dht DHT;

    void setup() {
      Serial.begin (9600);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
    }

    void loop() {
      
      float duration, distance;
      float speed;
      digitalWrite(trigPin, LOW); 
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      speed = 331.4 + (0.606 * DHT.temperature) + (0.0124 * DHT.humidity);
      distance = (duration / 2) * (speed / 10000);
      
      if (distance >= 400 || distance <= 2){
        Serial.print("Distance = ");
        Serial.println("Out of range");
      }
      else {
        Serial.print("Distance = ");
        Serial.print(distance);
        Serial.println(" cm");
        delay(1000);
      }
      delay(1000);
    }

    Εναλλακτικά

    #include <dht.h>   
    #define TRIG_PIN 13 
    #define ECHO_PIN 10 
    #define dht_apin A0 /

    dht DHT;           

    void setup() {
      pinMode(TRIG_PIN, OUTPUT);                      
      pinMode(ECHO_PIN, INPUT);                      
      Serial.begin(9600);                               
      delay(500);                                      
      Serial.println("Accurate distance sensing\n\n");  
      delay(1000);                                      
    }

    void loop() {
      DHT.read11(dht_apin);          
      float p = 101000;               
      float temp = DHT.temperature;   
      float humidity = DHT.humidity;  

      //Use the fromula from http://gsd.ime.usp.br/~yili/SpeedOfSound/Speed.html to evaluate speed of sound
      float a0 = 331.5024;
      float a1 = 0.603055;
      float a2 = -0.000528;
      float a3 = 51.471935;
      float a4 = 0.1495874;
      float a5 = -0.000782;
      float a6 = -1.82e-7;       
      float a7 = 3.73e-8;         
      float a8 = -2.93e-10;     
      float a9 = -85.20931;
      float a10 = -0.228525;
      float a11 = 5.91e-5;  
      float a12 = -2.835149;
      float a13 = -2.15e-13; 
      float a14 = 29.179762;
      float a15 = 0.000486;
      float T = temp + 273.15;
      float h = humidity /100.0;
      float f = 1.00062 + 0.0000000314 * p + 0.00000056 * temp * temp;
      float Psv = exp(0.000012811805 * T * T - 0.019509874 * T + 34.04926034 - 6353.6311 / T);
      float Xw = h * f * Psv / p;
      float c = 331.45 - a0 - p * a6 - a13 * p * p;
      c = sqrt(a9 * a9 + 4 * a14 * c);
      float Xc = ((-1) * a9 - c) / ( 2 * a14);
      float speedOfSound = a0 + a1 * temp + a2 * temp * temp + (a3 + a4 * temp + a5 * temp * temp) * Xw + (a6 + a7 * temp + a8 * temp * temp) * p + (a9 + a10 * temp + a11 * temp * temp) * Xc + a12 * Xw * Xw + a13 * p * p + a14 * Xc * Xc + a15 * Xw * p * Xc;
      
      digitalWrite(TRIG_PIN, HIGH);
      delayMicroseconds(10);
      digitalWrite(TRIG_PIN, LOW);
      
      float microseconds = pulseIn(ECHO_PIN, HIGH, 100000); 
      float seconds = microseconds / 1000000;               
      float meters = seconds * speedOfSound;                
      float cm = meters * 100;                              
      cm = cm/2;                                            

      Serial.print("DIST = ");
      Serial.print(cm);
      Serial.print("cm  ");
      Serial.print("HUMI = ");
      Serial.print(humidity);
      Serial.print("%  ");
      Serial.print("TEMP = ");
      Serial.print(temp); 
      Serial.print("C  ");
      Serial.print("Speed of Sound = ");
      Serial.print(speedOfSound);
      Serial.println("m/sec   ");
      
      delay(2000);

    }

    Πηγές ανάρτησης: εδώ και εδώ

    Οι ταινίες του ιστολογίου σε συνέχειες: 

    Επεισόδιο 5


    Δεν υπάρχουν σχόλια:

    Δημοσίευση σχολίου