Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Arduino sketsi kohta natuke abi vaja

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Arduino sketsi kohta natuke abi vaja

    #include "LiquidCrystal.h"
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


    // which pin to use for reading the sensor? can use any pin!
    #define FLOWSENSORPIN 7
    // miinus nupu pin
    #define MIINUSPIN 6




    // count how many pulses!
    volatile uint16_t pulses = 0;
    // track the state of the pulse pin
    volatile uint8_t lastflowpinstate;
    // you can try to keep time of how long it is between pulses
    volatile uint32_t lastflowratetimer = 0;
    // and use that to calculate a flow rate
    volatile float flowrate;
    // Interrupt is called once a millisecond, looks for any pulses from the sensor!
    SIGNAL(TIMER0_COMPA_vect) {
    uint8_t x = digitalRead(FLOWSENSORPIN);

    if (x == lastflowpinstate) {
    lastflowratetimer++;
    return; // nothing changed!
    }

    if (x == HIGH) {
    //low to high transition!
    pulses++;
    }
    lastflowpinstate = x;
    flowrate = 1000.0;
    flowrate /= lastflowratetimer; // in hertz
    lastflowratetimer = 0;
    }


    void useInterrupt(boolean v) {
    if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
    }
    }


    void setup() {
    Serial.begin(9600);
    Serial.print("Flow sensor test!");
    lcd.begin(16, 2);

    pinMode(FLOWSENSORPIN, INPUT);
    digitalWrite(FLOWSENSORPIN, HIGH);
    lastflowpinstate = digitalRead(FLOWSENSORPIN);
    useInterrupt(true);
    }


    void loop() // run over and over again
    {
    lcd.setCursor(0, 0);
    lcd.print(pulses); lcd.print(" Liitrit");


    Serial.print(pulses); Serial.println(" Liitrit ");


    delay(500);




    float liters = pulses;
    liters *= 0.00276;
    Serial.print(liters,1); Serial.println(" EUR-i");

    lcd.setCursor(0, 1);
    lcd.print(liters);
    lcd.print(" EUR-i");


    delay(100);
    }


    Kohendasin natuke oma vajaduste järgi. Tegemist vee arvestusega. Veemõõtja andur läheb gnd ja teine ots pin 7. Pole veel mõõtjaga proovinud aga niisama juhtmega ei saa täpselt. Kuskile on vaja tekitada viivitus ehk siis välimaa keeli " debounce delay" . Lihtsalt delay(100); Kuhu see panna? Sketsis on ka ülearuseid asju vast mida võib vähemaks võtta.


    #2
    Vs: Arduino sketsi kohta natuke abi vaja

    Kas veemõõtja pulss on ikka pikem, kui 100ms?
    Muidu kontrollid pulsi tulekut. Seejärel ootad oma 100ms ning kui pulss on alles, siis alles suurendad loendurit.
    Kui pulss on alla 600ms, siis võid sellest üldse ilma jääda koodis olevate delay() funktsioonide tõttu.

    Comment


      #3
      Vs: Arduino sketsi kohta natuke abi vaja

      Paljudest viitejamadest pääsed sisuliselt ainult nii, kui vabaned delay()'st ja asendad need millis()'ga. Aga ei, see pole 1:1. Aga see aitab. Siis kood kunagi ei peatu päriselt ja töötab koguaeg.
      Just nagu multitasking, aga palju pead pead murdma algul.
      Aga aitab.
      Erilahendused.
      PS või mail.

      Comment


        #4
        Vs: Arduino sketsi kohta natuke abi vaja

        Ma ei tea veemõõtja pulsi pikkust.Need delayd panin ma ise sinna. Hetkel aga töötab nii. Mõtlesin alguses,et hakkab liitreid rohkem kirjutama.1 pulss on 1 liiter.Need viivitused ei pidurda lugemist kuna iialgi ei jookse sekundiga liitrit.

        Comment


          #5
          Vs: Arduino sketsi kohta natuke abi vaja

          Kui veemõõtjast tuleb pulss ning samal ajal on Arduino jooksutamas delay() funktsiooni, siis seda pulssi ei registreerita.
          delay() peatab kõik muud toimingud peale lihtsalt ootamise.

          Comment


            #6
            Vs: Arduino sketsi kohta natuke abi vaja

            Võtan ära ja katsetan siis aga asi selles,et kuhu panna debounce delay ? Pole ju mõtet hakata mingit trigerit vahele ehitama.

            Comment


              #7
              Vs: Arduino sketsi kohta natuke abi vaja

              Kas sa oled üldse aru saanud, miks see debounce delay vajalik on ning kuidas ta toimima peab?
              Paned selle sinna sinna, kus sa pulssi loed. millis() funktsiooniga kontrolli kõigepealt pulsi pikkus ära. Ja siis tee millis() funktsiooniga see delay.
              Loe sisendit, kui 1, siis pane taimer käima, kui mingi aeg (väiksem, kui kõige lühema pulsi pikkus) möödas on kontrolli uuesti sisendit, kui 1, siis registreeri pulss.
              delay() kaota kõik ära, kasuta millis(). Nett õpetusi täis, kuidas seda teha.

              Comment


                #8
                Vs: Arduino sketsi kohta natuke abi vaja

                Ma ei saa pulsi pikkust kuidagi mõõta. Pole vahendeid.Delay-d tahtsin seepärast panna,et kui näiteks käsitsi katsetad loendurit, lihtsalt juhtmega arduino küljes siis kui otsad omavahel ühendad viskab ta mitu impulssi korraga aga kui on peale impulssi delay kohe siis ta ei lase enam teisel impulsil loendurisse minna juhul kui seal mingi herkoni kontakt näiteks ei anna korralikku ühendust või ma ei tea mis asi seal veemõõtjal on.

                Comment


                  #9
                  Vs: Arduino sketsi kohta natuke abi vaja

                  Pulsi pikkust saad mõõta Arduinoga. Google it.

                  Comment

                  Working...
                  X