Discuz! Board

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 1026|ตอบกลับ: 1

ESP32 Pressure Sensor + คำนวณความดันแบบ แบร์นูลี

[คัดลอกลิงก์]

16

กระทู้

16

โพสต์

104

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
104
#include "DHT.h"
#include <WiFi.h>
#include <WebServer.h>

const byte interruptPin1 = 25;
const byte interruptPin2 = 24;

volatile int interruptCounter = 0;
int numberOfInterrupts = 0;

float calibrationFactor = 4.5;

volatile byte pulseCount;  

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;

float Q;                    //Q  m^3/s
float V;                    //V  m/s
const float plo = 0.001;    //  kg/m^3
float Pressure;             //q  (BAR)  q = ½ρ v²
float Diameter = 2.15/100;  //A  m
float Area = 3.14159*Diameter*Diameter;   //m²


unsigned long oldTime;

portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR handleInterrupt() {
  portENTER_CRITICAL_ISR(&mux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&mux);
  //Serial.println("interrupt");
}

void setup() {

  Serial.begin(115200);
  Serial.println("Monitoring interrupts: ");
  pinMode(interruptPin1, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin1), handleInterrupt, FALLING);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;  

}

void loop() {

  if(interruptCounter>0){

      portENTER_CRITICAL(&mux);
      interruptCounter--;
      pulseCount++;
      portEXIT_CRITICAL(&mux);

      numberOfInterrupts++;
//      Serial.print("An interrupt has occurred. Total: ");
//      Serial.println(numberOfInterrupts);

    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;

    // Note the time this processing pass was executed. Note that because we've
    // disabled interrupts the millis() function won't actually be incrementing right
    // at this point, but it will still return the value it was set to just before
    // interrupts went away.
    oldTime = millis();

    // Divide the flow rate in litres/minute by 60 to determine how many litres have
    // passed through the sensor in this 1 second interval, then multiply by 1000 to
    // convert to millilitres.
    flowMilliLitres = (flowRate / 60) * 1000;
    Q = flowMilliLitres;

    // Add the millilitres passed in this second to the cumulative total
    totalMilliLitres += flowMilliLitres;

    unsigned int frac;

//    // Print the flow rate for this second in litres / minute
//    Serial.print("Flow rate: ");
//    Serial.print(int(flowRate));  // Print the integer part of the variable
//    Serial.print(".");             // Print the decimal point
//    // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
//    frac = (flowRate - int(flowRate)) * 10;
//    Serial.print(frac, DEC) ;      // Print the fractional part of the variable
//    Serial.print("L/min");


    // Print the number of litres flowed in this second
    Serial.print("  Current Liquid Flowing: ");             // Output separator
    Serial.print(flowMilliLitres);
    Serial.print("mL/Sec");
    V = (Q / Area)/1000000;
    //calculate q = ½ρ v² (SI units):
    Pressure = (0.5*(plo)*V*V)/0.00001;  //Bar)
    Serial.print(" Pressure Liquid: ");
    Serial.print(Pressure);
    Serial.print("Bar");

    // Print the cumulative total of litres flowed since starting
    Serial.print("  Output Liquid Quantity: ");             // Output separator
    Serial.print(totalMilliLitres);
    Serial.println("mL");

    // Reset the pulse counter so we can start incrementing again
    pulseCount = 0;


  }
}

4

กระทู้

5

โพสต์

81

เครดิต

Member

Rank: 2

เครดิต
81
โพสต์ 2019-11-5 11:14:10 | ดูโพสต์ทั้งหมด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|IoT Inc.

GMT+7, 2021-4-20 16:27 , Processed in 0.092767 second(s), 18 queries .

Powered by Discuz! X3.4, Rev.60

© 2001-2019 Comsenz Inc.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้