Εμφάνιση αναρτήσεων με ετικέτα αισθητήρας ατμόσφαιρας. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα αισθητήρας ατμόσφαιρας. Εμφάνιση όλων των αναρτήσεων

Κυριακή 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


    Κυριακή 28 Φεβρουαρίου 2021

    Μετρήσεις υγρασίας και θερμοκρασίας ατμόσφαιρας με τον αισθητήρα DHT11

     Περιγραφή

    Με τον αισθητήρα DHT11 μετράμε την υγρασία και την θερμοκρασία της ατμόσφαιρας και τυπώνουμε τις τιμές σε οθόνη LCD I2C. 



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



    • Arduino Uno
    • αισθητήρας DHT11
    • οθόνη LCD I2C

    Κώδικας

    // Example testing sketch for various DHT humidity/temperature sensors
    // Written by ladyada, public domain

    #include "DHT.h"
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);  

    #define DHTPIN 2    
    #define DHTTYPE DHT11   

    DHT dht(DHTPIN, DHTTYPE);

    void setup() {
      Serial.begin(9600);
      Serial.println(F("DHTxx test!"));

      dht.begin();
      
      lcd.init();
      lcd.clear();         
      lcd.backlight();
    }

    void loop() {
     
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      

      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println(F("Failed to read from DHT sensor!"));
        return;
      }

      Serial.print(F("HUMI: "));
      Serial.print(h);
      Serial.println(F("%"));
      Serial.print(F("TEMP: "));
      Serial.print(t);
      Serial.println(F("°C "));

      lcd.setCursor(0,0); 
      lcd.print(F("TEMP: "));
      lcd.print(t);
      lcd.print(F(" oC"));
      lcd.setCursor(0,1);
      lcd.print(F("HUMI: "));
      lcd.print(h);
      lcd.print(F(" %"));
      

    }