So, dann stelle ich hier mal das Endergebnis vor.
MicroBahner hat mir dabei nicht nur geholfen, sondern ich konnte auch noch richtig was lernen.
Danke ihm für seine endlose Geduld am heiligen Wochenende.
Da meine Harware schon fertig war und noch Spaghetti im Magen ( Magen = Speicher:) ) hatte
habe ich den neuen schnelleren Code pinmäßig so angepasst, das er auf der fertig verlöteten Hardware läuft.
Das Blinken, Blitzen und leuchten ist zwar grundsätzlich das gleiche, aber man merkt spätestens beim Umschalten, z. B. Landelicht an, Landelich aus, das beim Spaghetticode deutlich sichtbare Verzögerungen sind, während jetzt beim neuen Code gefühlt das Umschalten mit dem RC-Sender-Schalterklick zusammen fällt. Der Unterschied ist mega deutlch.
Wer mag, und das so nachbaut, kann ja mal zum Test zunächst den alten, dann den neuen Code laden und probieren. Dann seht ihr praktisch sofort, wo sich ein umständlicher Programmierstil rächt.
Wäre das z. B. bei den Steuerfunktionen des Flugzeuges so, wie im alten Code, wäre das unfliegbar.
Dem neuen würde ich es hingegen zutrauen.
Nun hier das Ergebnis:
// Pulsein-Messung im loop () fuer skyfox
//Erstellt von MicroBahner,
// Angepasst von Skyfox60
//
#include <MobaTools.h>
// Variable für die Zeitmessung
const byte pulsePin = 10; // Pin an dem der Puls anliegt
unsigned long startTime; // Zeit an der positiven Impulsflanke
bool lastPinState; // letzter Zustand am Pulse-Pin
int pulseLength; // Länge des Pulses
const byte pulseOut = 11; // nur für genauigkeitstest mit LA
byte pulseValue; // Auswertezustand der Pulslänge
// Variable für Led's
// die Strobe-Led wird immer abwechselnd entsprechend der Tabellenzeiten ein- und ausgeschaltet
const int strobeTime [] = { 50,50,50,50,50,50,50,1500 }; // 40 an/60 aus sieht ein wenig besser aus , 10 an, 90 aus sieht gut aus, blitzt aber dann deutlich weniger hell
const byte strobeStates = sizeof( strobeTime )/sizeof(strobeTime[0]); // Zahl der Tabellenelemente
const byte strobeLed = 8; // Anschlusspin der Strobe-Led
byte strobeIx; // aktueller Index in der Tabelle strobeTime
int NAV = 5; // Navigationslichter ( links rot, rechts grün, hinten weiß )
const byte LL = 7; //Landelicht/Lansescheinwerfer
MoToTimer strobeTimer;
const byte fadeLedPin = 6; // An/Abschwellende led
const int fadeTime = 1500; // An/Abschwellzeit
MoToSoftLed fadeLed;
MoToTimer fadeTimer; // zum Umschalten EIN/AUS nach fadeTime
void setup() {
//Serial.begin( 115200 );
//Serial.println("Start Sketch");
// Initiierungen für die Pulsmessung
pinMode( pulsePin, INPUT );
lastPinState = digitalRead( pulsePin ); // für Erstauswertung
pinMode( NAV, OUTPUT );
pinMode(LL, OUTPUT );
pinMode( pulseOut, OUTPUT ); // nur für Testmessungen
// Initiierungen für die Strobe-Led
pinMode( strobeLed, OUTPUT );
// Initiierungen für fade-Led ( läuft ständig )
fadeLed.attach( fadeLedPin );
fadeLed.riseTime( fadeTime );
fadeLed.write(ON, LINEAR);
fadeTimer.setTime( fadeTime );
}
void loop() {
// -------------Messung der Pulslänge--------------------------------
bool actPinState = digitalRead( pulsePin );
if ( actPinState != lastPinState ) {
// Es hat ein Flankenwechsel stattgefunden
if ( actPinState == HIGH ) {
// Positive Flanke -> Zeitmessung starten
startTime = micros();
digitalWrite( pulseOut, HIGH ); // Um delay zum echten Puls messen zu können
} else {
// negative Flanke, Zeit auswerten
pulseLength = micros()-startTime;
digitalWrite( pulseOut, LOW ); // Um delay zum echten Puls messen zu können
if( pulseLength > 1900 && pulseLength < 2100) pulseValue = 1;
else if ( pulseLength > 1400 && pulseLength < 1600 ) pulseValue = 2;
else if ( pulseLength > 900 && pulseLength < 1200) pulseValue = 3;
//Test der Pulsmessung:
// Serial.print("Pulse= ");
//Serial.print ( " plusOut " )
//Serial.println(pulseLength);
}
}
lastPinState = actPinState; // für Vergleich im nächsten loop-Durchlauf
//----------------- Ende Pulsemessung --------------------------------
//--------------standig laufende fade-LED-------------------------------
if ( !fadeTimer.running() ) {
// Zeit abgelaufen, LED umschalten
fadeLed.toggle();
fadeTimer.setTime( fadeTime );
}
//----------------StrobeLed-------------------------------
// Die Strobe LED blitzt nur, wenn der pulsValue = 2 oder 3 ist
if (pulseValue == 3) digitalWrite (LL, HIGH);
if (pulseValue == 2) digitalWrite (LL, LOW);
if ( pulseValue == 2 || pulseValue ==3) {
digitalWrite (NAV, HIGH );
// Strobe Led blitzt
if ( ! strobeTimer.running() ) {
// Led ein/ausschlaten, und Timer setzen
digitalWrite ( strobeLed, !(strobeIx&1) ); // bei geraden indizes ein, bei ungeraden ausschalten
strobeTimer.setTime( strobeTime[strobeIx] ); // Zeitdauer für den aktuellen Zustand setzen
// Index auf nächsten Status setzen, am Tabellenende wieder auf 0
if ( ++strobeIx >= strobeStates ) strobeIx=0;
}
} else {
// StrobeLed rücksetzen
digitalWrite ( strobeLed, LOW );
strobeIx = 0;
digitalWrite (NAV,LOW); digitalWrite( LL,LOW);
}
}