Errechnen anhand der Schritte den Anstieg um Bar

Hallo,
ich habe ein kleines Mathe Problem. Nicht Lachen. ist schon 40 Jahre her das ich sowas mal brauchte.

Die Situation:
Ich möchte rausfinden um wieviel sich die Schritte max 1023 ändern bei einem Anstieg um 0.1bar.

der Drucksensor hat bei 0 psi 0,5V und bei 5 psi 4,5V Ich weiss das bei 105 schritte 0 bar anliegen und eine Spannung von 0,51V.
Aber wie kann ich das in einer Formel berechnen, so das ich weiß es sind soviele schritte bei einem Anstieg um 0.1 bar? Kann mir da eventuell wer weiterhelfen?

Auch ist mir dann noch nicht ganz klar wie es weiter schaffe das ganze in eine Wasserhöhe zu berechnen.

gruß Luzi

Such nach

Arduino map funktion

Hallo,
kurz zur Erinnerung

a= (y2-y1) / (x2-x1)
y=a * x +b umstellen nach b
und dann a einsetzen

map ist schon richtig das macht das für Dich
Heinz

Dreisatz.
5V / 1023 Schritte = 0,0048875V für einen Schritt.

0psi = 0,5V laut Datenblatt.

0,5V / 0,004887586V = 102,29999022 Schritte
4,5V / 0,004887586V = 920,699911981 Schritte
Gegenprobe:
920,699911981 + 102,29999022 [entspricht 4,5V + 0,5V = 5V] = :wink:

0,1 bar sind 1,450376808 psi
5 psi sind also 0,344738 bar.

Der Sensor löst 5 psi bzw. 0,344738 bar mit 818 Schritte auf.
0,344738 bar / 818 Schritte = 0,00042144 bar je Schritt.

Druckänderung 0,1 bar in Schritte:
0,1 bar / 0,00042144 bar = 237,281700835 Schritte.
benötigst Du eine Änderung von 237 Zaehler für eine Darstellung von 0,1 bar.

Aus
0 psi = 0,5V und
5 psi = 4,5V
kannst Du eine Gerade der Form y = ax+b berechnen. Wobei X der Druck ist und Y die Spannung. U = psi * 4/5 +0,5
b ist dier Offset. Bei 0 psi hast Du 0,5V.
a ist dei Steigung. In diesem Fall (4,5V-0,5V)
Aus der Geraden kannst Du dann aus der gemessenen Spannung den Druck berechen. Umgeformt:
psi = (U -0,5V)*5/4

Aus den ausgelesenen ADC mußt Du die Spannung errechnen.
Die Formel ist U = Uref/1023ADC
Bei 5V Referenzspannung sind das
U = 5/1023 * ADC oder 0,00488
ADC.

Das kannst Du in die obere Formel einsetzen ohne zwischendurch die Spannung berechnen zu müssen.

Grüße Uwe

Ich will ja nicht Besserwisser sein.
Grundlegend deckt sich Dein Ansatz mit meinem. Zumal die angesetzen Werte übereinstimmen.
ABER:
psi ist doch nicht gefragt.

OT:
Was habt ihr derzeit für Temperaturen?

Ok da muß auch noch die Umrechnug von PSI nach bar rein.
Mein Beitrag sollte etwas mehr ausholen und beschreiben.

ot.
Ich habe gerade nachgeschaut für heute Mitternacht. Bei offenene Fenster und gegenüberliegenden Balkontür gerade 28°C am Radiowecker und 27°C am Termostat Heizung. Um 21:30 im Auto Außentemperatur 29°C (War vorher in Tiefgarage Einkauszentrum 27°C)
Ansonsten ganz offiziell

aktuel 25,2°C bei Tagesmaxtemperatur von ca 33°C.
Die Sonnenscheindauer ist wenig significant. Die zitierte Wetterstation liegt nahe am Berg und kriegt darum den halben Vormittags keine Sonne.

Grüße Uwe

1 Like

Danke euch für die zahlreichen Antowrten. ich werde das mal umsetzen. Was wäre man bloß ohne Forum.

Danke an alle

OT:
Was habt ihr derzeit für Temperaturen?

wir hatten kühle 24° gestern.

Es geht im Prinzip darum, ich habe ein Drucksensor der 5 psi hat. Jetzt wollte ich mit diesem anhand des wasserdruck, (wenn keine Pumpe läuft) eben die gerade anliegende wasserhöhe ermitteln. aber dies wird leider zu ungenau da ich gerne eine Angabe in mm hätte. die Angaben vom Sensor schwanken dann aber im cm bereich was nicht sehr hilfreich ist. Daher war mein Gedankengang der, ich nehme die Schritte und leite davon die Wasserhöhe ab.Aber ob das überhaut geht weiß ich ehrlich gesagt noch garnicht.

Der Fall ist: wenn ich eine Wasserhöhe von 1150mm habe und durch wasserbewegung in dem Becken schwankt die Angabe nicht im mm Bereich sondern im cm Bereich was für meine Zwecke nicht Förderlich ist da ich nur ein Fenster von 50mm nach oben und unten habe.
Aber vieleicht ist der 10bit adc vom arduino nicht aussreichend um soetwas genau darszustellen weil eben nur die 1024 schritte zur verfügung stehen.

Anderst schaut es bei dem 60psi sensor aus, der soll ja nur den Druck von einem Sandfilterkessel anzeigen und der liegt im Bereich von 0.1-1.1 Bar. da reicht der Arduino ja aus.

Es gibt auch 24-Bit-AD-Wandler, die Du per I2C an den Arduiono anklemmen kannst, falls Dir eine größere Auflösung hilft und die Schwankungen nicht bereits durch den Messaufbau bedingt sind.

Gruß Tommy

@luzie 10m Wasserhöhe machen einen statischen Druck von 1bar. =1000mbar
10m =10000 mm = 1000 mbar
die Auflösung Deines Systems ist 0,42mbar (siehe Rechnung von my_xy_projekt)
Wenn Du das jetzt auf mm umrechnest

10000mm/1000mbar*0,42mbar=4,2mm.
Das ist dann so die Grössenordnung in der Du theoretisch messen kannst, wobei der Messwert um 1LSB wackeln kann. Wenn (viel) es mehr ist solltest Du untersuchen woran das liegt , oder eine gleitende Mittelwertbildung einbauen.
Wenn Du es genauer haben willst benötigst Du einen anderen AD Wandler.
Heinz

Kann ich machen wenn ich die neue Hardware da habe. habe die beiden unos heute zurückgeschickt. (Anderer Beitrag von mir) da sie nicht Funtionieren oder nur unzureichend.

derzeit schaut es so aus mit dem Code.

int getPressure (int channel, int type, int mittel)
{

  float vcc, vsensor, result = 0, psi, bar;
  for (int i = 0; i < mittel; i++)
  {
    vcc = analogReadBG(0x1f); // dummy Read
    vcc = 1.1 * 1024 / analogReadBG(0x1e) * 1000; // Bandgab Referenz bestimmen 1.1 V Default
    vsensor = (float) analogReadBG(DS_Pin[channel]) * vcc / 1024; // Messwert mit korrektem spannungsbeszug
    result +=  vsensor;
 }
  psi  = (float)(result / mittel) - 500; // in mV 0.5-4.5V spannungsdifferenz auf 0 - type PSI

  if (psi < 500) {
    psi = 500;  // 0,5 mV => 0 PSi damit keine negativen drücke angezeigt werden
  }

  switch (type) {
    case 60:  psi = (type / 4.0) * (psi / 1000.0 + 7.5) * 100.0; break; // ADC1                                      // y 0 - 5  0-60 psi
    case  5:  psi = (type / 4.0) * (psi / 1000.0 - 0.625) * 100.0; break; // ADC0                                       // x 0.5 - 4.5V
    default: // Fehler bei den Parametern
      return 0;
  } 
 bar  = psi * 0.0689;

  Serial.print(type);
  Serial.print(" ");
  Serial.print("Druck Channel "); Serial.print(channel); Serial.print(" in Bar:"); Serial.println(bar );
  return (int)(bar);
}

Aber wie gesagt testen kann ich das erst wenn ich die neue Hardware da habe.

was hast du da für einen Sensor? Bei mir versagen die am Sandfilter recht schnell ihren Dienst

Also meiner hat nun 4 Jahre gehalten. Jetzt hat er sein Dienst aufgegeben.
60psi für Kesseldruck

Aber aus sicherheitsgründen und zur kontrolle habe ich noch ein Digitalen drauf der mir 24V Schaltausgang liefert und direkt an meiner sps hängt und bei überschreiten des sollwertes die Pumpe auschaltet.
Festo Digitaldruckschalter

Achtung da steht "statischer Druck".
Wenn was fließt ist das dann kein statischer Druck mehr. Da hat man wegen des Flußes Druckverluste hat und gleichzeitig durch Durchmesseränderungen und darum Flußgeschwindigkeitsänderungen auch Druckänderung in beiden Richtungen.
Wellen ändern den Druck in einer gewissen Tiefe im Wasser.

Grüße Uwe

das mit der Flussgeschwindigkeit ist im Programm berücksichtigt. nicht auf dem Arduino sondern in der SPS. Sobald die Pumpe läuft wird der Wasserstand eingefrohren und nur der wert Angezeigt der ohne Pumpe gemessen wurde. Sonst würde ich eine Tiefe von 3,3Meter bei Laufender Pumpe haben. Auch wurde der Sensor so verbaut das es nur min. Schwankungen gibt. sie belaufen sich nun im +/- 5mm Bereich.
Ich hatte das ganze nun auch etwas umgestellt

    case 60:  psi = (type / 4.0) * (psi *10.0); break; //   Druck Kessel                       
    case  5:  psi = (type / 4.0) * (psi *10.0) -168; break; //    Wasserhöhe - Höhenunterschied Beckendoden und Sensorhöhe                                  

Nun bekomme ich die Werte wenigsten in mm Angezeigt. Einzige Nachteil ist das, wenn ich den Sensor abziehe ich den Negativ wert von -168 angezeigt bekomme.

Dann laß Dir den Wert nicht anzeigen sondern etwas anderes.

if Wert == -168 print "irgendwas" else print Wert.

Grüße Uwe

Dann ist Dein Ansatz falsch.

Warum machst Du das?
Du weisst doch, wie hoch die Auflösung ist.
Warum rechnest Du da x mal rum?
Ich würde den aufgelösten Analogwert nehmen.
Der Grundwert des ADC ist 102. Nur wenn dieser Wert erreicht wird, wird der in die Berechnung des Mittelwertes aufgenommen.
Dazu der obere Wert 920. Alles was darüber ist wird ebenfalls ausgeklammert.

Alternativ setzt Du bei unterschreiten auf 102 und bei Überschreiten auf 920.

Lege Dir für die Grenzwerte uint16_t Konstanten an.

Und erst wenn Du den Mittelwert daraus hast und alles andere abgehandelt ist, berechne den tatsächlichen Druck.
Nicht erst psi und dann aus psi bar.
Du verbrauchst zuviele float und das Ergebnis entspricht ebenfalls nicht Deinen Vorstellungen.

Mach es mal anders.