INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programm zu langgsam
01.01.2020, 13:13 (Dieser Beitrag wurde zuletzt bearbeitet: 01.01.2020 13:13 von Gerdchen03.)
Beitrag #1
Programm zu langgsam
Ich baue gerade ein Anzeigeinstrument, dass das Steigen eines Segelflugzeugs über ein Display darstellen soll, aber auch gleichzeitig ein akustisches Signal ausgibt. Die Anzeige über das Display ist soweit fertig, und die Tonausgabe eigentlich auch. Aber ich habe das Problem wohl nicht optimal gelöst, denn die Tonausgabe hängt dem Display in etwa 2 Sekunden hinterher. Für das Display und für die Tonausgabe nutze ich zwei separate ESP32 Devkit V1.
Ich nehme nicht an, dass sich dieser Code deutlich beschleunigen lässt. Falls doch jemand Tips hat, wäre ich sehr dankbar. Besser wäre es wahrscheinlich den Ton komplett anders zu generieren. Da wäre ich ebenfalls für Tips extrem dankbar.

Code:
//#define RXD1 -1
//#define TXD1 -1
#define RXD2 16
#define TXD2 -1 // -1 means it not used beacause of trouble with Dispolay-ESP32. Set TXD2 to 17 if you like to use

int freq = 100;
int channel = 0;
int resolution = 8;
const int Varioschalter = 15;        //Taster an GND anschließen, 10 kOhm Pullup-Widerstand zw. 3,3V und Pin anschließen
const int STF_schalter = 5;          //Taster an GND anschließen, 10 kOhm Pullup-Widerstand zw. 3,3V und Pin anschließen

//Polar of H205 Club Libelle
float a = 0.000164875045587;
float c = 1.149709854615560;

double SF;           //Speedfaktor zur Berechnung des STF-Tons

float E;            //Variowert
float S;            //True Airspeed
float C;            // MacCready-Wert
float Ealt;
float SFalt;
float f;            //Frequenz Varioton
float f1;           //Frequenz STF-Ton
float d;            //Delay Varioton
float d1;           //Delay STF-Ton
float b;

String Climb = String("FLIGHTMODE_CLIMB");
String Cruise = String("FLIGHTMODE_CRUISE");
//String X;                                    //Aktivieren, wenn Übertragung von X umgesetzt ist
String X = String("FLIGHTMODE_CLIMB");         //Löschen, wenn Übertragung von X umgesetzt ist

void setup() {

  Serial.begin(115200, SERIAL_8N1);
  //Serial1.begin(115200, SERIAL_8N1, RXD1, TXD1);
  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  if (Serial2.available() > 0) {
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("VarioSound is ready!!");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
    Serial2.println("\n");
  }
  ledcSetup(channel, freq, resolution);
  ledcAttachPin(26, channel);
}

void loop() {
  char Data;
  String DataString, DataString_STF, Vario, STF, MCC, AS;
  int pos, pos1, pos2, pos3, i, i1, i2, i3;
  if (Serial2.available() > 0) {
    Data = Serial2.read();
    if (Data == '$') {
      while (Data != 10) {
        DataString += Data;
        Data = Serial2.read();
      }
    }

    if (DataString.startsWith("$POV")) {
      pos = DataString.indexOf(',');
      DataString.remove(0, pos + 1);
      //
      //Analyse des Steigwertes
      //
      if (DataString[0] == 'E') {
        pos = DataString.indexOf(',');
        DataString.remove(0, pos + 1);
        pos = DataString.indexOf('*');
        for (i = 0; i < pos; i++) {
          Vario += DataString[i];
        }
        E = Vario.toFloat();
        Vario = "";
      }
      //
      //Analyse der automatischen Sollfahrtumstellung
      //
      if (DataString[0] == 'X') {
        pos1 = DataString.indexOf(',');
        DataString.remove(0, pos1 + 1);
        pos1 = DataString.indexOf('*');
        for (i1 = 0; i1 < pos1; i1++) {
          STF += DataString[i1];
        }
        X = STF;
        STF = "";
      }
      //
      //Analyse des McCready-Wertes
      //
      if (DataString[0] == 'C') {
        pos2 = DataString.indexOf(',');
        DataString.remove(0, pos2 + 1);
        pos2 = DataString.indexOf('*');
        for (i2 = 0; i2 < pos2; i2++) {
          MCC += DataString[i2];
        }
        C = MCC.toFloat();
        MCC = "";
      }
      //
      //Analyse der true Airspeed
      //
      if (DataString[0] == 'S') {
        pos3 = DataString.indexOf(',');
        DataString.remove(0, pos3 + 1);
        pos3 = DataString.indexOf('*');
        for (i3 = 0; i3 < pos3; i3++) {
          AS += DataString[i3];
        }
        S = AS.toFloat();
        AS = "";
      }
      DataString = "";
    }
  }

  int Varioschalter_state = digitalRead(Varioschalter);
  int STF_schalter_state = digitalRead(STF_schalter);

  //
  //Varioton erzeugen
  //

  if (((Varioschalter_state == 1) && (STF_schalter_state == 0)) || ((Varioschalter_state == 1) && (STF_schalter_state == 1) && (X == Climb))) {
    if ((E >= -8) && (E <= -2) && (E != Ealt)) {
      float f = (17.33 * E + 483.67);
      //Serial.print("Vario Modus, sehr starkes Saufen: ");
      //Serial.println(E);
      ledcWrite(channel, 50);
      ledcWriteTone(channel, f);
    }

    else {
      if ((E > -2) && (E < -0.7) && (E != Ealt)) {
        float f = (74.615 * E + 598.23);
        //Serial.print("Vario Modus, starkes Saufen: ");
        //Serial.println(E);
        ledcWrite(channel, 50);
        ledcWriteTone(channel, f);
      }

      else {
        if ((E >= -0.7) && (E <= 0) && (E != Ealt)) {
          float f = (287.14 * E + 747);
          //Serial.print("Vario Modus, leichtes Saufen: ");
          //Serial.println(E);
          ledcWrite(channel, 10);
          ledcWriteTone(channel, f);
        }

        else {
          if ((E > 0) && (E <= 8) && (E != Ealt)) {
            float d = (-0.8921 * pow(E, 3) + 16.068 * pow(E, 2) - 94.772 * E + 256.27);
            float f = (-0.3308 * pow(E, 4) + 7.8042 * pow(E, 3) - 64.994 * pow(E, 2) + 321.8 * E + 744.54 - 200);
            //Serial.print("Vario Modus, Steigen: ");
            //Serial.println(E);
            ledcWrite(channel, 50);
            ledcWriteTone(channel, f);
            delay(d);
          }
          else {
            if ((E < -8) && (E != Ealt)) {
              float f = 340;
              //Serial.print("Vario Modus, extremes Saufen: ");
              //Serial.println(E);
              ledcWrite(channel, 50);
              ledcWriteTone(channel, f);
            }
            else {
              if ((E > 8) && (E != Ealt)) {
                float f = 1850 - 200;
                //Serial.print("Vario Modus, extremes Steigen: ");
                //Serial.println(E);
                ledcWrite(channel, 50);
                ledcWriteTone(channel, f);
                delay(65);
              }
            }
          }
        }
      }
    }
    float Ealt = E;
  }

  //
  //Sollfahrtton erzeugen
  //

  if (((Varioschalter_state == 0) && (STF_schalter_state == 1)) || ((Varioschalter_state == 1) && (STF_schalter_state == 1) && (X == Cruise))) {
    SF = (S - sqrt(abs((c - E + C) / a))) / 10;
    if ((SF >= -8) && (SF <= -2) && (SF != SFalt)) {
      float f1 = (17.33 * E + 483.67);
      Serial.println("STF Modus, sehr schnell fliegen:");
      ledcWrite(channel, 50);
      ledcWriteTone(channel, f1);
    }

    else {
      if ((SF > -2) && (SF < -0.5) && (SF != SFalt)) {
        float f1 = (74.615 * E + 598.23);
        Serial.println("STF Modus, schnell fliegen:");
        ledcWrite(channel, 50);
        ledcWriteTone(channel, f1);
      }

      else {
        if ((SF >= -0.5) && (SF <= 0.5) && (SF != SFalt)) {
          float f1 = 0;
          Serial.println("STF Modus, langsam fliegen:");
          ledcWrite(channel, 10);
          ledcWriteTone(channel, f1);
        }

        else {
          if ((SF > 0.5) && (SF <= 8) && (SF != SFalt)) {
            float d1 = (-0.8921 * pow(SF, 3) + 16.068 * pow(SF, 2) - 94.772 * SF + 256.27);
            float f1 = (-0.3308 * pow(SF, 4) + 7.8042 * pow(SF, 3) - 64.994 * pow(SF, 2) + 321.8 * SF + 744.54 - 200);
            Serial.println("STF Modus, sehr langsam fliegen:");
            ledcWrite(channel, 50);
            ledcWriteTone(channel, f1);
            delay(d1);
          }
          else {
            if ((SF < -8) && (SF != SFalt)) {
              float f1 = 340;
              Serial.println("STF Modus, extrem schnell fliegen:");
              ledcWrite(channel, 50);
              ledcWriteTone(channel, f1);
            }
            else {
              if ((SF > 8) && (SF != SFalt)) {
                float f1 = 1850 - 200;
                Serial.println("STF Modus, extrem langsam fliegen:");
                ledcWrite(channel, 50);
                ledcWriteTone(channel, f1);
                delay(65);
              }
            }
          }
        }
      }
    }
    float SFalt = SF;
  }

  //
  //Störungsanzeige, falls Schalter beschädigt
  //

  if ((Varioschalter_state == 0) && (STF_schalter_state == 0)) {
    Serial.println("Stoerung: Vario und STF Mode gleichzeitig aktiv");
    float f = 2000;
    ledcWrite(channel, 50);
    ledcWriteTone(channel, f);
    delay (400);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.01.2020, 23:42
Beitrag #2
RE: Programm zu langgsam
(01.01.2020 13:13)Gerdchen03 schrieb:  Ich baue gerade ein Anzeigeinstrument, dass das Steigen eines Segelflugzeugs über ein Display darstellen soll, aber auch gleichzeitig ein akustisches Signal ausgibt. Die Anzeige über das Display ist soweit fertig, und die Tonausgabe eigentlich auch. Aber ich habe das Problem wohl nicht optimal gelöst, denn die Tonausgabe hängt dem Display in etwa 2 Sekunden hinterher. Für das Display und für die Tonausgabe nutze ich zwei separate ESP32 Devkit V1.
Ich nehme nicht an, dass sich dieser Code deutlich beschleunigen lässt. Falls doch jemand Tips hat, wäre ich sehr dankbar. Besser wäre es wahrscheinlich den Ton komplett anders zu generieren. Da wäre ich ebenfalls für Tips extrem dankbar.
....

...also wenn ich deinen Code so überfliege dann sehe ich alleine schon 3 delay() Aufrufe mit zusammen mindestens 450mS... also wenn das den Algorhytmus nicht runterbremst dann wäre das ein Wunder...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2020, 00:30
Beitrag #3
RE: Programm zu langgsam
Der letzte Delay (400ms) kommt nur zum Tragen, wenn eine Fehlermeldung kommt. Dann funktioniert das Gerät eh nicht. Ich habe heute noch ein wenig experimentiert, und denke, es hängt mit diesem Delay zusammen:

Code:
if ((E > 0) && (E <= 8) && (E != Ealt)) {
            float d = (-0.8921 * pow(E, 3) + 16.068 * pow(E, 2) - 94.772 * E + 256.27);
            float f = (-0.3308 * pow(E, 4) + 7.8042 * pow(E, 3) - 64.994 * pow(E, 2) + 321.8 * E + 744.54 - 200);
            //Serial.print("Vario Modus, Steigen: ");
            //Serial.println(E);
            ledcWrite(channel, 50);
            ledcWriteTone(channel, f);
            delay(d);

Dieses Delay wurde eingebaut damit der Ton Unterbrechungen hat. Hier in diesem Video könnt ihr euch anschauen, wie so ein Vario klingen soll:
https://www.youtube.com/watch?v=uwpnXf916gM

Ich bin nicht sicher, ob ich richtig verstanden habe, was die Parameter Channel, Resolution und dutycycle bei diesen Befehlen in meinem Fall bewirken. Vielleicht könnet da noch mal jemand eine kurze Erklärung geben.
Code:
ledcSetup(channel, freq, resolution);
ledcWrite(channel, dutycycle)

Eine Tonunterbrechnung ist damit nicht realisierbar, oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2020, 16:47
Beitrag #4
RE: Programm zu langgsam
delay() hat den Effekt, die ganze Task komplett anzuhalten. Entweder verlegst Du die Tonerzeugung in eine eigene Task, oder du verzichtest auf das delay() und benutzt lieber Timer, um Beginn und Ende der Huperei zu steuern. Im Prinzip z.B. so (das ist ungetestet und sollte den Ton im Wechsel 500ms an und 250ms aus steuern):
Code:
...
uint32_t an_aus;
bool ist_an;
const uint32_t anzeit = 500;
const uint32_t auszeit = 250;
...

setup()
{
...
   ist_an = false;
   an_aus = millis() + auszeit;
...
}
...
loop()
{
...
   if(millis()<an_aus)
   {
      if(ist_an)
      {
         ist_an = false;
         // Ton hier ausschalten.
         an_aus = millis() + auszeit;
      }
      else
      {
         ist_an = true;
         // Ton hier anschalten.
         an_aus = millis() + anzeit;
      }
   }
...
}
Damit läuft der Rest-loop() ununterbrochen weiter.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 Programm richtig zusammen fassen sams2018 6 1.812 27.05.2019 11:39
Letzter Beitrag: Tommy56
  WiFi Zugangsdaten und Programm Settings einstellen und ändern DanceNgine 2 2.078 13.08.2018 21:19
Letzter Beitrag: DanceNgine

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste