Arduino Flowmetre Kullanımı
  • Merhaba, pompa, basınc sensörü ve akış sensörü içeren bir sistem için kod yazdım. Kodda pompaların hızını pot ile kontrol ediyorum. Tüm değerleri, lcd üzerinden okuyorum. Pompa hızı ve basınc sensörü değerlerini lcd üzerinden okuyorum. O kısım calısıyor, kontrol edebiliyorum. Koda akış sensörünü eklediğimde kod lcd üzerinde flowmetre degerlerini göremiyorum. Seri portta, pompa hızı ve basınc degerinden sonraki degerler dönmüyor tek satırda kalıyor ve 0 yazıyor. Flowmetre, o anki sıvının akış hızını ve toplam geçen sıvıyı yansıtıyor ekrana. Bir buton ile toplam akışı sıfırlayabiliyoruz. Ancak kodda hangi hatalar var bulamadım. Flowmetrenin K faktörü 112 pulse/litre. Kodu aşağı ekliyorum. Yardımcı olabilir misiniz? Bir de lcd ekranda pompa hız yüzdesini yazdırırken , %100'e cıktıktan sonra azaltınca, %12 yazması gerekirken %120 yazıyor. Nerede lcd.clean kullanmalıyım ? void setup içinde ve kendi fonskiyonu içinde denedim ancak düzelmedi. Güzel günler dilerim.

    ----------------------------------------------------------------------------
    // initialize LCD lib with I2C serial communication protocol
    #include < Wire.h> //I2C lib
    #include < LCD.h>
    #include < LiquidCrystal_I2C.h>
    // LCD lib
    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    int pot_pin = A0;
    int pump_pwm= 3;

    int press_pin =A1;

    int flowPin = 2; //This is the input pin on the Arduino
    byte resetButtonA = 11;

    double flowRate; //This is the value we intend to calculate.

    volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.


    int pot_init= 0;
    int pump_init= 0;
    int percentValue =0;
    int totalFlowRate = 0;


    void setup() {


    lcd.begin(20,4); // A4 - A5 connection SDA - SCL
    lcd.backlight();

    pinMode(resetButtonA, INPUT);
    digitalWrite(resetButtonA, HIGH);

    pinMode(flowPin, INPUT); //Sets the pin as an input
    attachInterrupt(0, Flow, RISING); //Configures interrupt 0 (pin 2 on the Arduino Nano) to run the function "Flow"

    Serial.begin(9600);


    }

    void loop() {

    pressure_cal();
    pump_control();
    flow_control();


    }

    void pressure_cal(void) {

    float sensorVoltage = analogRead(press_pin); // sensor voltage A0
    float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V , +-0.4PSI approax. sensitivity
    // calibration
    float bar = psi*(0.0689475729); // Conversion PSI to BAR

    if(psi < 0)
    psi = 0;

    if(bar<0);<br /> bar=0;
    lcd.setCursor (0,1);
    lcd.print (psi);
    lcd.print (" PSI");

    lcd.setCursor ( 0,2);
    lcd.print(bar);
    lcd.print( " BAR");

    //lcd.setCursor(0,1);
    //lcd.print(sensorVoltage);

    Serial.println (sensorVoltage);
    Serial.println(bar);
    Serial.println (psi);

    delay (100);
    }

    void pump_control(void)

    {

    // read the analog in value:
    pot_init = analogRead(pot_pin);
    // map it to the range of the analog out:
    pump_init = map(pot_init, 0, 1023, 0, 255); // Duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
    // map pump speed percent of full scale
    percentValue = map (pump_init, 0, 255,0,100);
    // change the analog out value:
    analogWrite(pump_pwm, pump_init);

    // print the results to the Serial Monitor:
    Serial.print("\t Speed Input = ");
    Serial.print(pot_init);
    Serial.print("\t Speed Output = ");
    Serial.print(pump_init);
    Serial.print("\t Pump Speed Percentage = ");
    Serial.println(percentValue);

    lcd.setCursor(0,0);
    lcd.print("Speed: ");
    lcd.setCursor(8,0);
    lcd.print("%");
    lcd.setCursor(9,0);
    lcd.print(percentValue);

    // delay after the last reading:
    delay(2);

    }


    void flow_control(void) {

    count = 0; // Reset the counter so we start counting from 0 again
    interrupts(); //Enables interrupts on the Arduino
    delay (1000); //Wait 1 second
    noInterrupts(); //Disable the interrupts on the Arduino

    /* if(digitalRead(resetButtonA) == LOW)
    {
    totalFlowRate = 0;
    lcd.setCursor(16, 3);
    lcd.print("0");
    }

    else {
    totalFlowRate += flowRate;
    lcd.setCursor(16, 3);
    lcd.print(totalFlowRate);


    } */

    //Start the math
    flowRate = (count * 8.93); //Take counted pulses in the last second and multiply by 8.93mL
    flowRate = flowRate * 60; //Convert seconds to minutes, giving you mL / Minute
    flowRate = flowRate / 1000; //Convert mL to Liters, giving you Liters / Minute

    totalFlowRate += flowRate; // Add the liters passed in second to the cumulative total

    Serial.println(flowRate); //Print the variable flowRate to Serial

    lcd.setCursor(0,3);
    lcd.print("F: ");
    lcd.setCursor(3,3);
    lcd.print(flowRate);
    lcd.setCursor(8,3);
    lcd.print("lt/m");

    lcd.setCursor(13,3);
    lcd.print("T:");
    lcd.setCursor(15,3);
    lcd.print(totalFlowRate);

    }

    void Flow()
    {
    count++; //Every time this function is called, increment "count" by 1
    }
  • {pompa hız yüzdesini yazdırırken , %100'e cıktıktan sonra azaltınca, %12 yazması gerekirken %120 yazıyor.}
    düzeltmek için %12 den sonra ekranda kaç karakterlik yer varsa o kadar boşluk karakteri ekleyin olabildiğince lcd.clean kullanmaktan kaçının
    lcd.print(percentValue); den sonra
    lcd.print(" "); gibi

    diğer sorununuzu inceleme fırsatım olmadı

  • Cevabınız için teşekkür ederim. Kullandığım yakıt pompaları, %0-%20 pwmde en düşük hızda, %20-%90 arasında ayarlanabilir hızlarda ve %90-%100 arasında pwmde maksimum hızda çalıştığı yazıyor datasheetde ( feulab prodigy series http://fuelab.com/wp-content/uploads/2012/10/110020275_A-40401-c-sp-Fuel-Pump-Installation-Instructions.pdf) Ancak pump_init = map(pot_init, 0, 1023, 50, 230); percentValue = map (pump_init, 50, 230,0,100); komutundan pot ile hızı kontrol ederken dengesiz davranıyor pompa. Bu kodda bir hatam olabilir mi ? Fırsatınız olursa flowmetre ile ilgili kodu inceleyebilirseniz çok memnun olurum.
  • Sorun sanırım şu, interrupt'dan dolayı diğer fonskiyonlar döngüden çıkamıyor. Seri port üzerinden ilk iki fonksiyon değerlerini bir kez yazdırıyor, flow_control döngüsüne gelince onu yazdırmadan duruyor. F1 cıkıyor. Araştırıyorum ama nasıl çözeceğimi bulamadım.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.