Google+

Πέμπτη, 3 Ιανουαρίου 2013

Water Tank Level Display

Μια ενδιαφέρουσα και συνάμα χρηστική ιδέα για κατασκευή αποτελεί αυτή του @Stelios, ο οποίος θέλοντας να παρακολουθεί ανά πάσα στιγμή τη στάθμη του νερού σε μια κλειστή δεξαμενή, χρησιμοποιήσε έναν αισθητήρα υπερήχων (ultrasonic sonar) HC-SR04 μαζί με ένα Arduino Nano, μια LCD για οπτική ένδειξη και ένα buzzer για την παραγωγή ήχων ειδοποίησης.


Παρακάτω, τα βήματα της κατασκευής:

Συγκέντρωση Υλικών:

HC-SR04 (ultrasonic sensor)
LCD 16x2 (HD44780)
LM35 (temp sensor)
Buzzer (ηχείο)
Διακόπτες (push button)
Συνδετήρας (4 pin connector m+f)
Κουτί (case)  

Αν και για την αρχική ανάπτυξη και δοκιμές, χρησιμοποιήθηκε το Arduino Uno, το τελικό "προϊόν"  περιελάμβανε το Arduino Nano το οποίο παρέχει τις ίδιες δυνατότητες σε πολύ μικρότερο μέγεθος.

 

Για τη σύνδεση της LCD που είναι βασισμένη στο HD44780 ανατρέξτε εδώ.

Ο αισθητήρας ultrasonic sonar HC-SR04 διαθέτει 4 pin (Vcc, Trigger, Echo, GND) εκ των οποίων 2, τα Trigger και Echo, συνδέοονται στα digital pins του Arduino. Στο Vcc pin συνδέουμε +5v από το Arduino. Η αρχή λειτουργίας του είναι απλή, το Trigger pin στέλνει ένα παλμό (HIGH) μικρής διάρκειας (~10μS) και το σήμα ανάκλασης από ένα αντικείμενο που επιστρέφει πίσω, εγείρει το Echo pin (HIGH). Η χρονική διάρκεια από τη μέταδοση μέχρι και τη λήψη του παλμού είναι γνωστή, οπότε η απόσταση υπολογίζεται εύκολα, αφού η ταχύτητας μετάδοσης είναι κι αυτή γνωστή και ισούται με 340m/s (ταχύτητα ήχου).


Επίσης, χρησιμοποιήθηκε το LM35 για τη μέτρηση θερμοκρασίας στο Analog pin 0.

Προσπαθώντας να χωρέσουν όλα αυτά σε ένα μικρό κουτί, υπήρξε αρκετό πριόνισμα και χρήση θερμόκολλας για να καταλήξει σε ικανοποιητικό αποτέλεσμα:

Τα 2 push-button και το buzzer έχουν "υποστηρικτό" ρόλο ως soft reset, mute και full/empty sound αντίστοιχα. Στον κώδικα ενσωματώνεται η βιβλιοθήκη <LiquidCrystal.h> για το χειρισμό της LCD και ο μηχανισμός για τα Trigger & Echo:

pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

pinMode(ECHO, INPUT);
float distance = pulseIn(ECHO, HIGH);
distance=distance / 29.387 / 2;
Serial.println(distance);

Παρακάτω, μια φωτογραφία με το τελικό κύκλωμα στο κουτί του. Στο πλάι διακρίνονται το κουμπί για soft reset, το mini usb για την τροφοδοσία και τον προγραμματισμό και ο 4-pin connector για τη σύνδεση του αισθητήρα sonar.


Ο πλήρης κώδικας είναι διαθέσιμος εδώ.


Δείτε κι ένα βίντεο από τη λειτουργία.

9 σχόλια:

  1. Καλημέρα,

    δεν ξέρω τι ακρίβεια έχει η μέτρηση αλλά θα πρέπει να υπάρχει διόρθωση του αποτελέσματος βάση την θερμοκρασία του νερού αφού η στάθμη του νερού αλλάζει με την θερμοκρασία. (συντελεστής διαστολής του νερού σε σχέση με την θερμοκρασία http://levitostasia.net/viewtopic.php?t=97&p=109)

    Σε μετρήσεις σε προιόντα όπως πετρέλαιο κτλ είναι πολύ σημαντικό ειδικά σε μεγάλες δεξαμενές που ένα χιλιοστό κάνει διαφορά χιλιάδων λίτρων.

    Σταύρος

    ΑπάντησηΔιαγραφή
  2. http://www.youtube.com/watch?v=HxJezrtjstw&list=WL84D334C99761D70B

    http://www.youtube.com/watch?v=sXM8GH77MBI


    Καλησπέρα, ένα παρόμοιο project με πληκτρολόγιο και προγραμματισμό που έχω αναπτύξει σε custom made πλακέτα με έναν ATmega328 προγραμματισμένο σε περιβάλλον Arduino...

    ΑπάντησηΔιαγραφή
  3. υπαρχει κυνδινος αν χρησημοποιησουμε εναν τετοιο αισθητηρα αποστασης σε ενα ντεποζητο με βενζινα?

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Οχι απλά κίνδυνος ολική καταστροφή, χρειάζετε στεγανό κουτί με αντίστοιχες πιστοποιήσεις για αντιεκρηκτικότητα και λειτουργία σε περιβάλλον εύφλεκτου προιόντας (explosion proof eexIIA , protection class IPX κτλ)

      Διαγραφή
  4. Καλησπέρα στον συγκεκριμένο κώδικα μπορώ να αλλάξω τα λίτρα της δεξαμενής.Αν ναι πως γίνεται.Ευχαριστώ πολύ.

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. στην αρχή του προγράμματος ορίζεις τις διαστάσεις της δεξαμενής:

      #define L_LENGTH 150.0 /* cm */
      #define H_HEIGHT 40.0 /* cm */
      #define W_WIDTH 50.0 /* cm */

      Διαγραφή
    2. Πολύ σωστά το αναφέρει ο @Nikos, απλά μια μικρή λεπτομέρεια είναι ότι θα πρέπει να ορισθεί η απόσταση του μέγιστου ύψους της στάθμης του νερού, μέχρι τον αισθητήρα:

      #define DISTANCE_PLUS 10 /* cm (distance plus from water to sonar*/

      Η παραπάνω τιμή, λαμβάνεται υπόψιν στο υπολογισμό του ύψους της στάθμης του νερού(?) της δεξαμενής:

      hWaterCm = H_HEIGHT - distance + DISTANCE_PLUS;

      και κατ' επέκταση στο υπολογισμό του διαθέσιμου όγκου.

      Διαγραφή
  5. Γεια σας θα ήθελα να μου πείτε: α) Αν οι αισθητήρες είναι αδιάβροχοι (διότι θα χρησιμοποιηθούν σε δεξαμενή με νερό η οποία μετακινείτε) και αν όχι τότε τι μου προτείνετε , β) Αν υπάρχει η δυνατότητα αλλαγής της μέτρησης σε περισσότερα λίτρα (δηλ. από 0 – 1000) διότι η δεξαμενή μου είναι 1000 lit.

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. α) Ο συγκεκριμένος αισθητήρας (HC-SR04) ΔΕΝ είναι αδιάβροχος. Μπορείς να ψάξεις για τον: JSN-SR04T ή TE501 στο ebay.
      β) Όπως έχει σχολιαστεί και πιο πάνω, για το σωστό υπολογισμό των λίτρων (L) θα πρέπει να οριστούν, αρχικά, οι ακριβείς διαστάσεις της δεξαμενής.

      Διαγραφή