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


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

    Ανίχνευσης φλόγας και προειδοποίηση με buzzer και LED

        

     Περιγραφή

    Ο αισθητήρας ανιχνεύει φλόγα (ακριβέστερα, ανιχνεύει την υπέρυθρη ακτινοβολία μήκους κύματος 760 nm - 1100 nm, που ακτινοβολείται κατά την εξώθερμη αντίδραση της καύσης, σε εύρος 60 μοιρών), καθορίζεται η ευαισθησία του με το ποτενσιόμετρο του module (γίνεται καλιμπράρισμα) και παράγεται ειδοποίηση με ήχο και φως, όταν η μέτρηση ξεπερνά την τιμή κατωφλίου.

    Η μέγιστη απόσταση φλόγας μετρήθηκε 83cm. Η διαδικασία έχει αναλυθεί για τον αισθητήρα βροχόπτωσης που διαθέτει παρόμοιο module, σε ανάρτηση εδώ

    • Όταν η φλόγα είναι μακριά, η μέτρηση είναι μικρότερη της οριακής τιμής κατωφλίου, το πράσινο λαμπάκι του module για την ένδειξη τροφοδοσίας είναι ON. 
    • Όταν η φλόγα πλησιάσει σε απόσταση μικρότερη των 83cm, η μέτρηση είναι μεγαλύτερη της οριακής τιμής κατωφλίου, ανάβει και το 2ο πράσινο λαμπάκι του module.
    Στην πλακέτα έχουμε συνδέσει ένα buzzer. Ο αισθητήρας λειτουργεί ως διακόπτης ΟΝ/OFF. Όταν είναι ΟΝ το buzzer ηχεί και το ενσωματωμένο LED αναβοσβήνει.

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

  • Arduino Uno
  • αισθητήρας φλόγας
  • buzzer 
  • breadboard, jumper wires
  • Η έξοδος του αισθητήρα συνδέεται στην ψηφιακή είσοδο 11. To buzzer συνδέεται στην ψηφιακή είσοδο 10.

    Κώδικας

      int sensorValue = 0 ;  
        void setup()  
        {  
          Serial.begin(9600);  
          pinMode(11,INPUT); // αισθητήρας φλόγας   
          pinMode(13,OUTPUT); // LED  
          pinMode(10,OUTPUT); // buzzer      
        }  
        void loop()   
        {  
         sensorValue = digitalRead(11); // αισθητήρας φλόγας σε ψηφιακή λειτουργία  
         Serial.println(sensorValue); // τιμή 0 ή 1 στην σειριακή οθόνη  
         delay(10);  
         if(sensorValue == 0 )  
         {  
          digitalWrite(13,HIGH); // Led ON  
          digitalWrite(10,HIGH); // Buzzer ON  
          delay(100);
          digitalWrite(13,LOW); // Led ON  
          digitalWrite(10,LOW); // Buzzer ON  
          delay(100);
         }  
         else  
         {  
          digitalWrite(13,LOW); // Led OFF  
          digitalWrite(0,LOW); // Buzzer OFF  
         }  
         }