Go Down

Topic: wie Variable in if-abfrage ändern? -> neues problem: PulseIn, map und if/else (Read 2 times) previous topic - next topic

TelosNox

So, Probleme:

1. Wozu brauch man 4 stellen bei map? die ersten beiden sind die range, also von bis und die beiden dahinter?
2. es funktioniert soweit recht gut, aber das analogfade und das frontflash wird vieeel zu langsam ausgeführt. wieso? und wie kann ich das lösen?


zielWert = map(quellWert, quellRangeMin, quellRangeMax, zielRangeMin, zielRangeMax);

du hast einen QuellWert und der liegt irgendwo innerhalb der QuellRange, die du definierst. Du sagst map dann in welche neue Range er den Wert transformieren soll und das tut er dann.
map (50, 1, 100, 1, 10) macht folgendes.

Er schaut wo zwischen 1 und 100 die 50 liegt. Sie liegt in der Mitte (also bei 50%). Nun sucht er zwischen 1 und 10, wo die Mitte liegt und das ist dann der Wert, den map zurückgibt. Oder als Formel ausgedrückt: 50/(100-1) * (10-1).

Zu deinem 2. Problem.
Dein Fade erhöht den Wert bei jedem Durchlauf um 1 (bis zum Maximum von 255). Ein Durchlauf kommt alle 2 Millisekunden (dafür hast du die Abfrage mit den fadeMillis). Daher dauert der Fade 500ms.
Wenn dir das zu lang ist, dann musst du es anders lösen. Ich würde es aber komplett anders machen. Ich würde den Zeitraum definieren, den die Led brauchen darf, bis sie vollständig hell ist. Und den würde ich dann dazu nutzen, um zu errechnen, wie hoch der Fadevalue sein muss.
Etwa so:

const unsigned long fadeTime = 200; //200ms

analogFade(){
  static unsigned long fadeStartMillis = 0;
  static boolean fadeUp = true;

  if (fadeStartMillis == 0) {
    fadeStartMillis = millis();  //der Fade beginnt
  } else {
    unsigned long actualMillis = millis();
    if (fadeStartMillis + fadeTime > actualMillis) {
      fadeStartMillis = 0;   //der Fade ist fertig, jetzt umkehren und neu anfangen
      fadeUp != fadeUp;
    } else {
      int fadeDuration = actualMillis - fadeStartMillis;
      int fadeValue = 0;
      if (fadeUp) {
        fadeValue = map(fadeDuration, 0, fadeTime, 0, 255);
      } else {
        fadeValue = map(fadeDuration, fadeTime, 0, 0, 255);
      }
      analogWrite(fled1, fadeValue);
      analogWrite(fled2, fadeValue);     
    }
  }
}


Ist jetzt einfach mal schnell hingeschrieben. Ich nutze kein festes Intervall sondern ich schaue in jedem Loop nach, wieviele Millis seit Beginn des Fadevorgangs vergangen sind und berechne die FadeValue passend zum aktuellen Zeitpunkt. Das mache ich dann einfach mit Map. Das eine mal anschwellend und das andere mal abschwellend (einfach in Map eins der Wertepaare vertauschen). Ob der Code kompiliert weiß ich grad nicht, habs direkt ins Forum getippt. Wenn dann fehlt ne Klammer oder sowas. Aber als Orientierung und zum Verstehen des Algorithmus sollte es reichen.

Der Vorteil dieser Methode: Man kann jede beliebige FadeDuration realisieren.

uwefed

Normalerweise ist neues Problem - neue Tread


So, Probleme:
1. Wozu brauch man 4 stellen bei map? die ersten beiden sind die range, also von bis und die beiden dahinter?
2. es funktioniert soweit recht gut, aber das analogfade und das frontflash wird vieeel zu langsam ausgeführt. wieso? und wie kann ich das lösen?


So und jetzt die Antworten:
Hier eine Referenz: http://arduino.cc/en/Reference/HomePage
1) Map mapt einen Wert im Eingangsbereich in den Ausgangsbereich um. Beispiel:
risultat = map (Wert;100, 200, 0, 20);
De Bereich 100 bis 200 wird in 0 bis 20 ungerechnet; also ist zB Wert=150 ist risultat =10.
http://arduino.cc/en/Reference/Map

2) also muß ich dennoch den Kode lesen  ;) ;)
pulseIn() blockiert den Arduino gleich wie delay(); deshalb wartet er dort bis er den Puls gemessen hat.

Statt "adj_puls1 = map(RCpuls1, 1000, 2000, 2000, 1000); "
ist "adj_puls1= 3000-RCpuls1;" einfacher.
Statt
"if (ledState == LOW)
     ledState = HIGH;
   else
     ledState = LOW;"
einfach
"ledState = 1-ledState;"

Grüße Uwe

Daniel_N

Sry, dachte, da es auf dem "alten" Code aufbaut bleibe ich mal in dem Topic :/

Ein fade dauert aktuell geschlagene 16Sek (ca Angabe).
Vorgabe ist das: http://www.youtube.com/watch?v=tQQKtW60QQc (Blinker bzw Warnblinker)

ich probier mal den Code von TeloxNox aus und berichte dann.

Wieso aber wird der Fade verzögert, der Blitzer aber nicht?
Die Reference bin ich übrigens immer am durchforsten wenn ich nicht weiter weiss. und google ;)

uwefed

Hallo Daniel_N
Ich weiß nicht welche Frequenz das PPM-Signal hat; wenn es von einer Fernsteuerung ist, dann hat es 50 Hz und eine HIGH Impuls-Zeit von 1 bis 2mSek und Low-Zeit von 18 bis 19 mSek. Das heißt, daß ein pulsIn() bis zu 20mSek wartet bis es den HIGH Impuls mißt.
Der Fade hätte eine Wartezeit von 2mSeK und von 0 bis 255 und zurück bräuchte es ca 1 Sek. Durch die pulsIn() Funktion hast Du eine Zeitverzögerung um den Fakto 15 ca (laut Deinen Schätzungen)
Das Blink hat zeiten von 59,61,100 und 800 mSek da sind 79, 61,120 und 820 mSek keine großen Unterschiede die man bemerken könnte.

Grüße Uwe


 

Daniel_N

Das erklärt natürlich die extreme Verzögerung.
Der echte Mustang braucht übrigens für einmal blinken 750mSek.

Den frontflash (Doppelblitzer) kann ich ja anpassen indem ich die Werte um 20 runter setz, das funktioniert auch super.

Aber für den "Warnblinker" analogFade will mir nichts einfallen um das delay durch den pulsein zu verhindern :(

Gibt es eine gute Alternative zum PulseIn? Ich möchte am Ende einfach nur 3 Schaltzustände haben:
< 1200mSek für eine Lichtsequenz
1400 - 1600mSek für aus
> 1800mSek für eine andere Lichtsequenz

Am wichtigsten ist hierbei die > 1800mSek-Sequenz, da diese später den fade beinhaltet, die 1200er hat nur "lampe an".

Ich hab per google was von wegen timings auslesen gelesen, bin aber absolut nicht durchgestiegen und es war wohl auch kein "arduino C"

//EDIT:
Ganz vergessen, wollte ich schon vor ein paar Posts schreiben, da ich nicht weiss ob es wichtig ist.
Mein Arduino ist ein Pro Mini 328 - 5V/16MHz

Go Up