Eagle Tree Airspeed Expander

Dafür liebe ich RCN so ;)
Wie beeinflusst denn das die angegebenen absoluten Werte und die Berechnungen des Staudruckrechners? Eben, überhaupt nicht. Aber ihr habt natürlich Recht, es ist ein quadratisches Wachstum.

Wachstum hat i .d. R. mit dem Wachstum einer Menge, z. B. der Anzahl der Menschheit oder von Wirtschaftsgütern zu tun. Man spricht auch von
Wachstumsprozessen. Das hat mit dem Staudruck und deren quadratischen Zunahme über der Geschwindigkeit nicht viel gemeinsam.

In meiner Jugend war der Modellflieger die technische Avantgarde.

Aber manche Modellflieger gehörten in der Jugend nicht zu dieser Avantgarde. :)

Gruss
Micha
 

Gast_74695

User gesperrt
Wachstum hat i .d. R. mit dem Wachstum einer Menge, z. B. der Anzahl der Menschheit oder von Wirtschaftsgütern zu tun. Man spricht auch von
Wachstumsprozessen. Das hat mit dem Staudruck und deren quadratischen Zunahme über der Geschwindigkeit nicht viel gemeinsam.
Die Formulierung "der Staudruck wächst quadratisch mit der Geschwindigkeit" halte ich für zulässig. "Wachstum" und "Zerfall" werden oft mit bestimmten Prozessen assoziiert, können aber auch in ihrer ursprünglichen Bedeutung verwendet werden (wenn man sie kennt).
Aber manche Modellflieger gehörten in der Jugend nicht zu dieser Avantgarde. :)
Kreativität ist etwas sehr Schönes ;)
Kannst du denn auch aus eigenen Airspeed-Erfahrungen dem Kollegen hilfreiche Inforationen liefern und noch die Grätsche zum Thema machen? OK, war eine rhetorische Frage :)
 
Hallo Ingo

Schau mal:
IMG_20220301_012333.jpg


C++:
// MAIN TAB

/*
Arduino   MS4525DO
-------   --------
GND       Pin 1 GND
5V/VCC    Pin 2 5V/SUPPLY
A4        Pin 3 SDA
A5        Pin 4 SCL
 */

#include <Wire.h> // Arduino I2C library

#define AVERAGE_COUNTS 8 // number of pressure/temperature measurements to be averaged, no averaging: AVERAGE_COUNTS = 1, averaging: AVERAGE_COUNTS > 1
#define ALPHA_PRESSURE 0.05 // smoothing factor of the exponential filter applied to the pressure, no smoothing: ALPHA_PRESSURE = 1, smoothing: 1 > ALPHA_PRESSURE > 0
#define AIR_DENSITY 1.225 // kg/m^3

float dynamicPressure, temperature, airspeed;

void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("Calibrating pressure offset...");
  MS4525CalibPressureCountsOffset();
  Serial.println("pressure [Pa]\ttemperature [°C]\tairspeed [m/s]\tairspeed [km/h]");
}

void loop() {
  MS4525FetchAverageCounts(AVERAGE_COUNTS);
  dynamicPressure = dynamicPressure + ALPHA_PRESSURE * (MS4525PressurePa() - dynamicPressure); // Pa
  temperature = MS4525TemperatureC(); // °C
  airspeed = sqrt(2 * max(dynamicPressure, 0) / AIR_DENSITY); // m/s

  Serial.print(dynamicPressure, 1);
  Serial.print("\t");
  Serial.print(temperature, 1);
  Serial.print("\t");
  Serial.print(airspeed, 1);
  Serial.print("\t");
  Serial.println(airspeed * 3.6, 1);
}

C++:
// MS4525 TAB

#define MS4525_PRESSURE_PA_PER_COUNT 1.05199220826 // Pa, Output Type A (10% to 90%), Pressure Range 001 (-1 to 1 psi)
#define MS4525_TEMPERATURE_C_PER_COUNT 0.09765625 // °C
#define MS4525_ADDRESS 0x28 // Interface Type I
//#define MS4525_ADDRESS 0x36; // Interface Type J
//#define MS4525_ADDRESS 0x46; // Interface Type K
//#define MS4525_ADDRESS 0x48; // Interface Type 0

//char *MS4525StatusStrings[] = {"Normal", "Busy", "Stale", "Faulty"};
int MS4525PressureCounts, MS4525PressureCountsOffset = 8192;
int MS4525TemperatureCounts, MS4525TemperatureCountsOffset = 511;

byte MS4525FetchCounts() {
  Wire.requestFrom(MS4525_ADDRESS, 4, true); // request 4 bytes, 2 pressure/status bytes and 2 temperature bytes
  byte pressureHigh = Wire.read();
  byte pressureLow = Wire.read();
  byte temperatureHigh = Wire.read();
  byte temperatureLow = Wire.read();
 
  MS4525PressureCounts = ((int)(pressureHigh & 0b00111111) << 8) | pressureLow; // 14 bits, 6 LSB of pressure high byte and pressure low byte
  MS4525TemperatureCounts = ((int)(temperatureHigh) << 3) | (temperatureLow >> 5); // 11 bits, temperature high byte and 3 MSB of temperature low byte

  return pressureHigh >> 6; // status, 2 MSB of pressure high byte
}

void MS4525FetchAverageCounts(int n) {
  unsigned long pressureSum = 0, temperatureSum = 0;
  int i = 0;
 
  while (i < n) {
    if (MS4525FetchCounts() == 0) {
      pressureSum += MS4525PressureCounts;
      temperatureSum += MS4525TemperatureCounts;
      i++;
    }
  }

  MS4525PressureCounts = (int)((float)pressureSum / i + 0.5);
  MS4525TemperatureCounts = (int)((float)temperatureSum / i + 0.5);
}

void MS4525CalibPressureCountsOffset() {
  MS4525FetchAverageCounts(8192);
  MS4525PressureCountsOffset = MS4525PressureCounts;
}

float MS4525PressurePa() {
  return MS4525_PRESSURE_PA_PER_COUNT * (MS4525PressureCounts - MS4525PressureCountsOffset); // Pa;
}

float MS4525TemperatureC() {
  return MS4525_TEMPERATURE_C_PER_COUNT * (MS4525TemperatureCounts - MS4525TemperatureCountsOffset); // °C
}

Gruss Lukas
 
Hallo Lucas,

vielen Dank für deine Mühe, Top 👌

würde ich deine Idee auch mit einem Arduino UNO DIP umsetzen können, den habe ich nämlich hier noch jungfreulich liegen

habe jetzt bei Ali deine Liste abgearbeitet und bestellt, hatte die Hoffnung in D evtl. schnell den Drucksensor zu bekommen, leider ohen Erfolg, nun muss ich halt ein paar Tage warten
 
Zuletzt bearbeitet:
Hallo @all

es ist leider schon einwenig Zeit vergangen, daher möchte ich mich heute mal kurz bei euch melden.

zZ sind privat wie auch beruflich einige Projekte leider sehr zeitintensiv, daher fehlt aktuell einfach Zeit

sehr bitter !!!

ich melde mich aber bestimmt wenn es was neues gibt.

DANKEN allen Unterstützern
 
Hallo @all

Ich möchte mich hier bei allen Unterstützern bedanken, bin mega happy 😀

Ich habe gestern Abend Zeit gehabt das Projekt endlich weiterzuführen,

alles was Lucas erklärt hat, hat mir sehr geholfen!

einzige Schwierigkeit war zu Beginn dem Nano nen Sketch zu verpassen.

Mit diesem einfachen Sketch (auf der HP von unsinnsbasis.de gefunden) wollte ich den Nano testen

#define LED 2 // auf manchen Boards 1

void setup() {
pinMode(LED,OUTPUT);
}


void loop() {
delay(1000);
digitalWrite(LED,HIGH);
delay(1000);
digitalWrite(LED,LOW);
}


Nachdem ich den Prozessortyp "Old Bootloader" gewählt hatte ging es dann.

Gleich danach wurde das Mess-Equipment angeschlossen und das Sketch von Lucas eingespielt.

MEGA !!!

Klappte sofort.
anbei ein Screenshot
Arduino.jpg



Vielen Dank nochmals vor allem an Lucas !!!


Bin ja im Arduino proggen noch noch so bewandert, konnte aber die Datenanzeige/Menge für meine Zwecke ändern,
was es für mich etwas übersichtlicher macht ...

Nach ...

Serial.print(dynamicPressure, 1);
Serial.print("\t");
Serial.print(temperature, 1);
Serial.print("\t");
Serial.print(airspeed, 1);
Serial.print("\t");
Serial.println(airspeed * 3.6, 1);


habe ich noch

delay(100);

eingefügt.
 
Zuletzt bearbeitet:
Hallo Ingo

Es freut mich dass es fast auf Anhieb klappt.
Kleine Anmerkung: Statt dem Delay von 100 ms kannst du auch die AVERAGE_COUNTS von 8 auf ein deutlich grössere Zahl stellen, z.b 200. Dadurch werden mehr Messungen gemacht pro loop und der Mittelwert gebildet. Das sollte etwa gleich lang dauern wie delay(100) und hat den Vorteil, dass die Messgenauigkeit vor allem bei niedrigen Geschwindigkeiten erhöht wird.

Gruss Lukas
 
Hallo Lukas

super , danke für die Info !

hab das delay gelöscht und den Average auf 250 gesetzt, das war das was ich eigentlich auch wollte, hab die 8 nicht gesehen,
sonst hätte ich da selber schon mit dem Wert gespielt
 
Ansicht hell / dunkel umschalten
Oben Unten