Σελίδα 4 από 16 ΠρώτηΠρώτη ... 2 3 4 5 6 14 ... ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 31 έως 40 από 156

Θέμα: Μέτρηση όγκου (κυβισμένης) δεξαμενής πετρελαίου

  1. #31
    Μέλος
    Όνομα
    Κωστας
    Εγγραφή
    Feb 2009
    Περιοχή
    Θρακη
    Μηνύματα
    100

    Προεπιλογή

    Αν και απο προγραματισμο ειμαι σκραπας το ολο εργο ειναι φοβερο .Οι επιμερους παραμετροι του προτζεκτ ειναι νομιζω οτι καλυτερο για να γινει σωστα μια μετρηση με υπερηχους
    Το μπραβο για τοσο λεπτομερεστατη ερασιτεχνικη κατασκευη πιστευω ειναι λιγο


    itta-vitta δυστυχως στο δημοσιο αν δεν εισαι απο τους (μαζι τα φαγαμε ) η καμμια μεγαλη made in usa εταιρεια για να υπαρχουν και τα (αντισταθμιστικα ωφελη) δεν δεν δεν.............

    0 Not allowed! Not allowed!

  2. Ένα μέλος ευχαρίστησε τον kostasde για αυτό το χρήσιμο μήνυμα:

    manolena (01-04-11)

  3. #32
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από navar Εμφάνιση μηνυμάτων
    πολλά πολλά μπράβο !
    τρομερή υλοποίηση !!!!
    αναλαμβάνω αντιπροσωπεία στην θεσσαλία :P :P άν το κάνεις εμπορικό κομμάτι !
    Χμ, Τρίκαλα, έ; Κι εγώ γαμπρός εκεί είμαι!!!

    0 Not allowed! Not allowed!

  4. #33
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Το σχέδιο είναι η καλωδίωση της κατασκευής, φτιαγμένο με το προγραμματάκι Fritzing http://fritzing.org/, που είναι εξαιρετικό για σχηματικές παραστάσεις. Βέβαια, είναι σε πλήρη ανάπτυξη οι πλακέτες (κανονικά ευρίσκονται η μια πάνω στην άλλη με τα αισθητήρια στην απαιτούμενη απόσταση).
    Συνημμένα Thumbnails Συνημμένα Thumbnails Πατήστε στην εικόνα για να τη δείτε σε μεγένθυνση Όνομα:  TANK VOLUME_bb.jpg Εμφανίσεις:  544 Μέγεθος:  144,4 KB  

    0 Not allowed! Not allowed!

  5. Ένα μέλος ευχαρίστησε τον manolena για αυτό το χρήσιμο μήνυμα:

    sv4lqcnik (13-04-11)

  6. #34
    Μέλος Το avatar του χρήστη navar
    Όνομα
    Kωνσταντίνος
    Εγγραφή
    May 2010
    Περιοχή
    τρικαλα
    Μηνύματα
    3.078

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από manolena Εμφάνιση μηνυμάτων
    Χμ, Τρίκαλα, έ; Κι εγώ γαμπρός εκεί είμαι!!!
    ε όταν είναι να έρθεις , στείλε ενα μύνημα να πιούμε κανένα καφεδάκι !!!

    0 Not allowed! Not allowed!

  7. #35
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Έγινε, αν και δεν το βλέπω να γίνεται σύντομα... Ζούμε για να δουλεύουμε, εκεί έχουμε καταντήσει...

    0 Not allowed! Not allowed!

  8. #36
    Μέλος Το avatar του χρήστη sv4lqcnik
    Όνομα
    Νικος
    Εγγραφή
    Jun 2009
    Περιοχή
    Λαρισα
    Μηνύματα
    469

    Προεπιλογή

    καλο το ολο θεμα ειναι ακομα στο αναπτυξιακο του ARDUINO η το μετεφερες κανονικα σε τυπωμενο με ανεξαρτητο μ/ε ; οπως και ναχει ειναι πολυ πρωτο project . και μια ερωτηση η αποσταση του ultrasonic απο την μητρηκη ασ πουμε ειναι κρισιμη;;; μπορεις να το διεραισεις και με ποιο μεγιστο μηκος καλωδιων;;
    σε αναμονη φιλικα Νικος

    0 Not allowed! Not allowed!

  9. #37
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Η κατασκευή Νίκο, έχει μείνει στο στάδιο του αναπτυξιακού. Ο λόγος είναι οτι αυτά που προσφέρονται έτοιμα, με γλιτώνουν απο πολλές φασαρίες, όπως κόψιμο πλακέτας, σχεδιασμό και κόψιμο περιφερειακών (οθόνη, κουμπιά, υπέρηχα) και επίσης, προσφέρεται πολύ εύκολος προγραμματισμός με στημένες βιβλιοθήκες. Δεν χρειάζεται να κάνω και πολλά πολλά, πέραν των επιπροσθέτων που χρειάζεται η κατασκευή για να δουλέψει (ένα ρολογάκι κι ένα θερμόμετρο, που και για αυτά υπάρχουν βιβλιοθήκες). Σε ό,τι αφορά το υπέρηχο μοντουλάκι, είναι και αυτό έτοιμο και με δική του βιβλιοθήκη. Δεν έχει και μεγάλη σημασία η απόσταση, αν τηρηθούν οι γενικοί κανόνες (ένα καλώδιο 2 ζευγών με θωράκιση, είναι αρκετό για να καλύψει αρκετή απόσταση, αφού αυτό πρέπει να στηριχθεί στο καπάκι της δεξαμενής). Η επόμενη προσπάθειά μου μάλλον θα είναι να φτιάξω μια ενιαία πλακέτα με τα απαραίτητα και να την προσαρμόσω σε ένα κουτί (μάλλον αδιάβροχο), στο οποίο θα συνδέεται μόνο το υπέρηχο και η τροφοδοσία.

    0 Not allowed! Not allowed!

  10. #38
    Μέλος Το avatar του χρήστη sv4lqcnik
    Όνομα
    Νικος
    Εγγραφή
    Jun 2009
    Περιοχή
    Λαρισα
    Μηνύματα
    469

    Προεπιλογή

    ΕΥΧΑΡΙΣΤΩ ΠΟΥ ΜΟΥ ΑΠΑΝΤΗΣΕΣ αλλα αν σου ειναι ευκολο να μου δωσεις τα φωτα για το αρχειο του κωδικα δηλ το κεντρικο εκτος απο ρουτινες εποικινωνιας με sonar και θερμομετρο τον υποιλοιπο κωδικα με τη ραχοκοκαλια και τους υπολογισμους μπορει κανενας να βρει σε c - c ++ ;; πριν το compilation καταλαβες;; σε αναμονη αν μπορεις να βοηθησεις γιατι δεν ειμαι και καμια γατα , τωρα κανω βηματα προγραμματισμου (θα μουπεις και θες να πιαστεις με τοσο δυσκολο προγραμμα δεν πας να αναψεις κανενα led; αλλα αντε και το αναψα το led το εσβησα και εβαλα κιαλλα που ειναι το ενδιφερων;;;; Ενω αν εχω εναν κωδικα με ενδιαφερων θα μου γινει βιωμα και δεν ξεχνιεται επισης θα πιασει και τοπο ενω το αναμα των led ειναι μονο για τα Χριστουγεννα ετσι;; . ευχαριστω

    0 Not allowed! Not allowed!

  11. #39
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Μην αγχώνεσαι Νίκο, είναι λογικό για κάποιον που τώρα ξεκινά να θέλει να ρουφήξει ό,τι μπορεί απο γνώση. Το συναίσθημα του να ζωντανεύεις ένα μάτσο υλικά άψυχα απο πυρίτιο και να τα δείς να σου κάνουν αυτό που σκέφτηκες, δεν αγοράζεται με τίποτα. Ο κώδικας που έγραψα, είναι σε C. Για τον Arduino, έχει προσαρμοστεί με βιβλιοθήκες οι οποίες σου προσφέρουν έτοιμες ρουτίνες για να κάνεις πολλά πράγματα, όπως π.χ. να ρυθμίσεις έναν timer για να σου σκάει διακοπές σε διαστήματα που θέλεις. Ένα παράδειγμα:

    /*
    * Timer1 library example
    * June 2008 | jesse dot tane at gmail dot com
    */
    //************************************************** ****************
    #include "TimerOne.h"
    //************************************************** ****************
    void setup()
    {
    pinMode(10, OUTPUT);
    Timer1.initialize(500000); // initialize timer1, and set a 1/2 second period
    Timer1.pwm(9, 512); // setup pwm on pin 9, 50% duty cycle
    Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
    }
    //************************************************** ****************
    void callback()
    {
    digitalWrite(10, digitalRead(10) ^ 1);
    }
    //************************************************** ****************
    void loop()
    {
    // your program here...
    }

    //************************************************** ****************

    Παρατήρησε οτι η δομή του κώδικα είναι σε C. Η διαφορά όμως εδώ, είναι οτι υπάρχουν συγκεκριμένες ρουτίνες - πυλώνες του προγράμματος, όπως η setup() και η loop() που είναι στάνταρ για όλα τα σκετσάκια (έτσι λέγονται τα προγράμματα για κώδικα Arduino) για τις οποίες δεν χρειάζεται να ασχοληθείς καθόλου, πέραν αυτών των βασικών που πρέπει να γράψεις για να εκτελούνται. Για παράδειγμα, στη setup() βάζεις όλες τις απαιτήσεις που έχεις για αρχικές ρυθμίσεις των modules του μ/ε, όπως των timer, του PWM, του I2C, του σειριακού, του SPI και άλλων. Τα bits των ειδικών registers ρυθμίζονται αυτόματα με αυτόν τον τρόπο. Άν δεις πιο πάνω, στη ρουτίνα setup() υπάρχουν οι γραμμές: 1) pinMode(10, OUTPUT); αυτή εδώ σου ρυθμίζει το πινάκι 10 του Arduino σαν έξοδο. Στον PIC, πρέπει να δεις αν το πινάκι που θα χρησιμοποιήσεις είναι στον A/D, να ρυθμίσεις ADCON0 και ADCON1 για να είναι ψηφιακή έξοδος, να γράψεις τον TRISxx σαν 0 για έξοδο, να μηδενίσεις το PORTxx για low output... 2) Timer1.initialize(500000); αυτή η γραμμή σου ρυθμίζει αρχικά τον Timer 1 με περίοδο 0,5 δευτερόλεπτα, τον ενεργοποιεί και τον ξεκινά. Στον PIC, πρέπει να πάς στον T2CON, να υπολογίσεις τα μπιτάκια για ενεργοποίηση, ξεκίνημα, περίοδο κι ανα κάνεις λάθος ψάχνεσαι... 3) Timer1.pwm(9, 512); εδώ, ρυθμίζεται αυτόματα ο PWM να βγαίνει στο πινάκι 9 με 50% duty cycle. Στον PIC πρέπει να βρείς πάλι τα μπιτάκια, μετά να πάς στον ανάλογο TRIS και PORT και να τους ρυθμίσεις ξεχωριστά. 4) Timer1.attachInterrupt(callback); εδώ, ρυθμίζεις αυτόματα μια διακοπή που θα σκάει απο τον Timer 1 και θα σου κάνει κάθε 0,5 δευτερόλεπτα το πινάκι 10 να αναβοσβήνει (αν βάλεις ένα LED. Φαντάσου τώρα λοιπόν, ένα τέτοιο προγραμματάκι των 5 γραμμών, να το γράψεις για τον PIC: Θα είναι μεγαλύτερο και θα θές και περισσότερο ψάξιμο για τις ρυθμίσεις. Εσύ κάνεις compilation με τον CCS και θές και programmer, ενώ εδώ φορτώνεις το πρόγραμμα με ένα USB καλώδιο! Πήγαινε εδώ http://www.arduino.cc/en/Main/Software και κατέβασε την έκδοση για Windows. Μετά άνοιξε αυτό εδώ
    Κώδικας:
    #include <Keypad.h>
    #include <LiquidCrystal.h>
    #include <WString.h>
    #include <EEPROM.h>
    //****************************************************************************************************
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //****************************************************************************************************
    #define RIGHT 0
    #define UP    1
    #define DN    2
    #define LEFT  3
    #define MENU  4
    #define MAX_DIMENSION 350
    //****************************************************************************************************
    int pingPin = 12;
    int inPin = 13;
    float volume;
    long free_volume;
    long duration, inches, cm;
    float length, height, width;
    byte screen = 2;
    byte lastScreen = 4;
    const int DEBOUNCE_DELAY = 50;
    byte screenRefresh = 120;
    long dimension_buffer = 0;
    int hundrends;
    int tenths;
    int units;
    //****************************************************************************************************
    //Key message
    int adcKeyIn;
    int NUM_KEYS = 5;
    int key=-1;
    int oldKey=-1;
    int  adcKeyVal[5] ={30, 150, 360, 535, 760 };
    
    //****************************************************************************************************
    byte FI[8] = {
    	B01110,
    	B10101,
    	B10101,
    	B10101,
    	B01110,
    	B00100,
    	B00100,
    	B00000
    };
    byte PSI[8] = {
    	B10101,
    	B10101,
    	B10101,
    	B01110,
    	B00100,
    	B00100,
    	B00100,
    	B00000
    };
    byte OMEGA[8] = {
    	B01110,
    	B10001,
    	B10001,
    	B10001,
    	B01110,
    	B00000,
    	B11111,
    	B00000
    };
    byte GAMMA[8] = {
    	B11111,
    	B10000,
    	B10000,
    	B10000,
    	B10000,
    	B10000,
    	B10000,
    	B00000
    };
    byte DELTA[8] = {
    	B00100,
    	B01010,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B11111,
    	B00000
    };
    byte LAMDA[8] = {
    	B00100,
    	B01010,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B00000
    };
    byte KSI[8] = {
    	B11111,
    	B00000,
    	B00000,
    	B01110,
    	B00000,
    	B00000,
    	B11111,
    	B00000
    };
    byte PEE[8] = {
    	B11111,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B10001,
    	B00000
    };
    //****************************************************************************************************
    void setup() 
    {
      lcd.createChar(0, FI);
      lcd.createChar(1, PSI);
      lcd.createChar(2, OMEGA);
      lcd.createChar(3, GAMMA);
      lcd.createChar(4, DELTA);
      lcd.createChar(5, LAMDA);
      lcd.createChar(6, KSI);
      lcd.createChar(7, PEE);
    
      lcd.begin(16, 2);
      lcd.setCursor(0,0);
      lcd.print("  TANK VOLUME   ");
      lcd.setCursor(0,1);
      lcd.print("   METER v1.0   ");
      delay(2000);
      
      length = 250;
      width = 63;
      height = 150;
      cm = 40;
    }
    //****************************************************************************************************
    void loop()
    {  
      measure_volume();
      switch (getKeyDebounce())
      {
        case MENU:
        showMenu();
        break;
      }  
    }
    //****************************************************************************************************
    long microsecondsToCentimeters(long microseconds)
    {
      // The speed of sound is 340 m/s or 29 microseconds per centimeter.
      // The ping travels out and back, so to find the distance of the
      // object we take half of the distance travelled.
      return microseconds / 29 / 2;
    }
    //****************************************************************************************************
    // Convert ADC value to key number
    int getKey(unsigned int input)
    {
      int k;
      for (k = 0; k < NUM_KEYS; k++)
      {
        if (input < adcKeyVal[k])
        {
          return k;
        }
      }
      if (k >= NUM_KEYS)
        k = -1;     // No valid key pressed
      return k;
    }
    //****************************************************************************************************
    int getKeyDebounce() 
    {
      // wait for no keypress, then return keypress held for debounce period
      adcKeyIn = analogRead(0);    // read the value from the sensor  
      key = getKey(adcKeyIn);		        // convert into key press
      do 
      {
        key = getKey(analogRead(0));
      } while (key != -1);
      oldKey = key;
      while (oldKey == -1 || key == -1 || key != oldKey) 
      {
        oldKey = key;
        delay(DEBOUNCE_DELAY);
        key = getKey(analogRead(0));
      }
      return key;
    }
    
    //****************************************************************************************************
    void showMenu() 
    {
      boolean inMenu = 0;
      
      lcd.clear();
      lcd.setCursor(0, 0); lcd.print("PROGRAMMING");
      lcd.setCursor(0, 1); lcd.print("TANK DIMENSIONS");
      
      lastScreen = 100;
      
      delay(2000);
      
      while (inMenu == 0)
      {
        if ((screen == 0)&&(lastScreen != 0))
        {
          lcd.clear();
          lcd.print("WIDTH");
          lastScreen = 0;
        }
        if ((screen == 1)&&(lastScreen != 1))
        {
          lcd.clear();
          lcd.print("LENGTH");
          lastScreen = 1;
        }
        if ((screen == 2)&&(lastScreen != 2))
        {
          lcd.clear();
          lcd.print("HEIGHT");
          lastScreen = 2;
        }
        switch (getKeyDebounce())
        {      
          case UP:
            if (screen != 0)
              screen++;
            break;
          case DN:
            if (screen != 3)
              screen--;
            break;
          case MENU:
            inMenu = 1;
            break;    
        }        
      }  
      if (screen == 0) setDimension();
      if (screen == 2) showOptionsMenu();
      lcd.clear();  
      screenRefresh = 120;
    }
    //****************************************************************************************************
    void showOptionsMenu() 
    {  
      boolean inMenu = 0;
      byte menuItem = 0;
      byte lastItem = 1;
      
      while (inMenu != 1) 
      {
        
        if ((menuItem == 0)&&(lastItem != 0))
        {
          lcd.clear();
          lcd.print("1.1");
          lastItem = 0;
        }
        if ((menuItem == 1)&&(lastItem != 1))
        {
          lcd.clear();
          lcd.print("1.2");
          lastItem = 1;
        }
        if ((menuItem == 2)&&(lastItem != 2))
        {
          lcd.clear();
          lcd.print("1.3");
          lastItem = 2;
        }
        switch (getKeyDebounce())
        {    
        case UP:
          if (menuItem != 0)
            menuItem++;
          break;
        case DN:
          if (menuItem != 3)
            menuItem--;
          break;
        case RIGHT:
          if (menuItem == 0) 
          {
             //EEPROM.write(3,(byte)timeZone);
          }
          if (menuItem == 1) 
          {
             //EEPROM.write(3,(byte)timeZone);
          }
          if (menuItem == 2) 
          {
             //EEPROM.write(3,(byte)timeZone);
          }
          if (menuItem == 3) 
          {        
            //EEPROM.write(3,(byte)timeZone);
          }
          lastItem = 100;
          break;
        case LEFT:
          if (menuItem == 0) 
          {        
            //EEPROM.write(0,(byte)useCurrentSpeed);
          }
          if (menuItem == 1) 
          {        
            //EEPROM.write(1,(byte)useDirections);
          }
          if (menuItem == 2) 
          {
            //EEPROM.write(2,(byte)useAbsoluteHeadings);
          }
          if (menuItem == 3) 
          {
            //EEPROM.write(3,(byte)timeZone);
          }
          lastItem = 100;
          break;
        case MENU:
          inMenu = 1;
          break;  
        }    
      }  
      //showMenu();  
    }
    //****************************************************************************************************
    void measure_volume()
    {
    // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
      // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
      pinMode(pingPin, OUTPUT);
      digitalWrite(pingPin, LOW);
      delayMicroseconds(2);
      digitalWrite(pingPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(pingPin, LOW);
    
      // The same pin is used to read the signal from the PING))): a HIGH
      // pulse whose duration is the time (in microseconds) from the sending
      // of the ping to the reception of its echo off of an object.
      pinMode(inPin, INPUT);
      duration = pulseIn(inPin, HIGH);
    
      // convert the time into volume
    //  cm = microsecondsToCentimeters(duration);=============================================================================================>>>>>>>>>>>>>>>>>>>>>>
      volume = (((height-cm)*length * width)/1000);
      
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(volume);
      lcd.print(" LITERS"); 
      if(volume <=150.00)
      {
        lcd.setCursor(0, 1);
        lcd.print("FUEL LOW - ADD");   
      }  
      if((volume >150.00) && (volume <= 1800.00))
      {
        lcd.setCursor(0, 1);
        lcd.print("NORMAL     ");   
      }  
      if((volume >1800.00) && (volume<= 2100.00))
      {
        lcd.setCursor(0, 1);
        lcd.print("FULL       ");   
      }  
      if(volume >2100.00)
      {
        lcd.setCursor(0, 1);
        lcd.print("WARNING-OVERFLOW");   
      }  
      delay(100);  
    }  
    //****************************************************************************************************
    void setDimension()
    {
      lcd.print("SET DIMENSION");
    }
    Είναι χωρίς σχόλια αλλά θα χρειαστείς οθόνη και κουμπιά. Η γνώμη μου είναι να κάνεις απλά πράγματα πρώτα για να μπείς στην ουσία. Για ό,τι θέλεις, εδώ είμαι!!!

    0 Not allowed! Not allowed!

  12. Ένα μέλος ευχαρίστησε τον manolena για αυτό το χρήσιμο μήνυμα:

    sv4lqcnik (19-04-11)

  13. #40
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Έχω εδώ μια μετατροπή της μονάδας υπερήχων απο SMD σε συμβατικά εξαρτήματα through hole για κάποιον που θα ήθελε να φτιάξει το μοντουλάκι αυτό μόνος του και χωρίς πολύ κόπο. Το σχηματικό και η πλακέτα διπλής όψης είναι στα συνημμένα, όπως και ο κώδικας για τον μικρούλη 12C508 (σε aasembly). Δουλεύει ακριβώς όπως και το SMD μοντουλάκι με μια απλή τροφοδοσία απο 9-25VDC. Έχω προσθέσει ένα παλμοτροφοδοτικό με το MC34063 και είναι πιο ευέλικτο στην τροφοδοσία του. Επίσης, έχει ακόμη τα δυο ίδια σήματα TRIG και ECHO του πραγματικού SRF04. Η πλακέτα είναι 3,27 φορές μεγαλύτερη απο τις κανονικές διαστάσεις.
    Κώδικας:
    ;////////////////////////////////////////////////////////////////////////////
    ;//
    ;//	Ultrasonic rangefinder Software 
    ;//
    ;//	Private and Educational use only is permitted
    ;//	Commercial use of this software is prohibited.
    ;//
    ;////////////////////////////////////////////////////////////////////////////
    
    
    	processor	12c508
    	__config	0feeh		; Internal Osc, WDT Enabled, not code protected
    	include	"p12c508.inc"
    #define	RAMSTART 07h
    
    	radix	dec
    
    #define trig	GPIO,0		; trigger input from host
    #define	pulse	GPIO,1		; timing pulse output to host
    #define	echo	GPIO,2		; echo signals from comparitor
    #define  nc	GPIO,3		; Unused - do not connect.
    #define	tx2	GPIO,4		; Tx phase 2
    #define	tx1	GPIO,5		; Tx phase 1
    
    #define _C	STATUS,C
    
    ;/////////////////////////////////////////////////////////////////////////////
    
    	org	RAMSTART
    
    loop		res	1	; loop counter
    dlyctr		res	1	; delay counter
    tone_cnt	res	1	; count echo cycles
    period		res	1	; received burst cycle period from tmr0
    
    ;/////////////////////////////////////////////////////////////////////////////
    
    	org     0       	;start address 0
    
    	movwf	OSCCAL		; use microchip's calibration value
    
    	movlw	89h
    	option			;assign 1:2 prescaler to watchdog
    
    	movlw	0dh
    	tris	GPIO		;GPIO 1, 4 & 5 are outputs
    	movwf	0
    
    	bcf	pulse
    
    ;////////////////////////////////////////////////////////////////////////////
    ;
    ; The main loop controls the range finder. In response to a low going trigger
    ; input, its calls "burst" to send out 8 cycles of 40khz. It then raises the
    ; pulse line so the host can begin timing.
    ; There is a choice of two tone detect routines, the simplest is currently set.
    ; It then clears the output pulse so the host can complete timing, and loops
    ; around to wait for the next cycle.
    ; If an echo is not detected then the watchdog timer will reset the PIC after
    ; about 30mS, and the pulse line will be cleared. Therefore a very long pulse
    ; should be interpreted as "nothing detected"
    
    main:	clrwdt
    	btfss	trig		; wait for trigger signal from user to go high
    	goto	main		; from previous measurement.
    
    m2:	clrwdt
    	btfsc	trig		; wait for trigger signal from user
    	goto	m2
    
    	call	burst		; send the ultra-sonic burst
    	bsf	pulse		; start the output timing pulse
    	
    ; OK, here's the cheap-n-easy way to detect the echo, just wait for a transition
    ; on the echo line. Though not really detecting a tone, it is very effective.
    ; The transducers provide the selectivity.
     
    m1:	btfsc	echo
    	goto	m1		; wait for low
    	bcf	pulse		; end the output timing pulse
    
    ; And here is the "proper" tone detecter. It detects 3 cycles of 40khz to
    ; give a valid output. It works but is still experimental. It is not as effective
    ; as just detecting the first edge, particually in the first few cm.
    ;
    ;	call tone		; validate 3 cycles of 40khz
    ;	bcf	pulse		; end the output timing pulse
    ;
    
    	goto	main
    
    ;////////////////////////////////////////////////////////////////////////////
    ;
    ; The burst routine generates an acurately times 40khz burst of 8 cycles.
    ; Since a 4Mhz PIC (1uS instruction rate) cannot gerenate timings of less
    ; than 1uS, the high half cycle is 12uS and the low half cycle 13uS.
    ; That's good enough.
    
    burst:	clrf	loop
    	movlw	8		; number of cycles in burst
    	movwf	loop
    
    burst1:	movlw	0x10		; 1st half cycle
    	movwf	GPIO
    
    	movlw	3		; (3 * 3inst * 1uS) -1uS = 8uS 
    	movwf	dlyctr		; 8uS + (4*1uS) = 12uS
    burst2:	decfsz	dlyctr,f
    	goto	burst2
    
    	movlw	0x20
    	movwf	GPIO
    	movlw	2		; (2 * 3inst * 1uS) -1uS = 5uS 
    	movwf	dlyctr		; 5uS + (8*1uS) = 13uS
    burst3:	decfsz	dlyctr,f
    	goto	burst3
    	nop
    	decfsz	loop,f
    	goto	burst1
    
    	movlw	0x00		; set both drives low
    	movwf	GPIO
    
    	retlw	0
    
    ;////////////////////////////////////////////////////////////////////////////
    ;
    ; The timing for this routine is critical. Our little PIC is only chugging
    ; along at 4Mhz, or 1uS per instruction. The longest path though this code
    ; is 19uS, out of the 25uS available - thats tight and why I only wait for a
    ; low on the echo line and not a high as well.
    
    tone:	clrf	TMR0
    
    t1:	btfsc	echo
    	goto	t1		; wait for low
    
    	movfw	TMR0
    	clrf	TMR0
    	movwf	period		; store timer0 value
    
    	movlw	21		; if(period>22 && period<30) 
    	subwf	period,w
    	btfss	_C
    	goto	t2
    	movlw	30
    	subwf	period,f
    	btfsc	_C
    	goto	t2
    
    	decfsz	tone_cnt,f	; 25uS period OK, so 
    	goto	t1		; if not yet 3 of them, keep looking
    	retlw	0		; else - success - return
    	
    t2:	movlw	3		; failed to detect 25uS period, so reset tone detect
    	movwf	tone_cnt	; to 3 and keep looking
    	goto	t1
    
    ;////////////////////////////////////////////////////////////////////////////
    
    	end
    
    ;////////////////////////////////////////////////////////////////////////////
    Συνημμένα Αρχεία Συνημμένα Αρχεία

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη manolena : 28-04-11 στις 11:17

Σελίδα 4 από 16 ΠρώτηΠρώτη ... 2 3 4 5 6 14 ... ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Σταθμη δεξαμενής
    By MariosP in forum Αυτοματισμοί
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 05-05-17, 08:45
  2. Στάθμη δεξαμενής ακαθαρτων
    By Popeye in forum Αυτοματισμοί
    Απαντήσεις: 19
    Τελευταίο Μήνυμα: 25-09-13, 03:21
  3. Στάθμη δεξαμενής νερού
    By kosder1908 in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 28-04-11, 19:44
  4. Επιτηρητής στάθμης δεξαμενής
    By ΠΕΤΡΟΣ Κ. in forum Αυτοματισμοί
    Απαντήσεις: 9
    Τελευταίο Μήνυμα: 22-01-11, 20:07
  5. ΑΝΑΠΤΥΞΗ: Συστημα μέτρηση στάθμης δεξαμενής υγρών.
    By Stergios_[.gr] in forum Διάφορα Κυκλώματα
    Απαντήσεις: 8
    Τελευταίο Μήνυμα: 13-09-10, 02:08

Tags for this Thread

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας