Hallo Zusammen,
ich bin noch komplett neu in der Thematik Arduino - und versuche gerade, die ersten Schritte an einem Online-Simulator, bis meine eigene Test-Hardware da ist.
Ich möchte gerne ein Modellbau-Projekt mit hilfe des Arduino beleuchten - dabei sollen verschiedene Leuchteffekte möglichst "unabhängig" voneinander durchgeführt werden... hierzu habe ich mir bereits Anleitungen und Hilfen zum Thema "blink without delay" angeschaut.
Eine der Anleitungen, welche hier im Forum gepostet wurde konnte ich auch einiger Maßen für meine zwecke weiter verwenden und anpassen... doch leider bin ich noch nicht so ganz dahinter gestiegen - und es funktioniert noch nicht in allen Bereichen, wie ich es gerne hätte
Hier ist mal mein bisheriger Code, basierend auf einem Beispiel aus dem Forum hier (blinken & Faden einer LED)
unsigned long blink_StartMillis;
unsigned long fadeWarpEngine_StartMillis;
unsigned long fadeMainImpulseEngine_StartMillis;
unsigned long currentMillisNavigationLight;
unsigned long currentMillisWarpEngine;
unsigned long currentMillisMainImpulseEngine;
//blink period for Navigation Lights
const unsigned long blinkPeriod_NavigationLights = 800;
//fade period for WarpEngine Lights
const unsigned long fadePeriod_WarpEngine = 100;
//fade period for Main Impulse Engine Lights
const unsigned long fadePeriod_MainImpulseEngine = 100;
// Define the PINs for each LED / Section
const byte NavigationLights = 13;
const byte WarpEngineLights = 10;
const byte MainImpulseEngineLights = 12;
//initial brightness of LED
byte brightness_WarpEngine = 0;
byte brightness_MainImpulseEngine = 0;
//amount to change PWM value at each change
byte increment_WarpEngine = 1;
byte increment_MainImpulseEngine = 1;
void setup()
{
Serial.begin(115200); //start Serial in case we need to print debugging info
// define Pin Modes
pinMode(NavigationLights, OUTPUT);
pinMode(WarpEngineLights, OUTPUT);
pinMode(MainImpulseEngineLights, OUTPUT);
//start time of blinking LED
blink_StartMillis = millis();
//start time of fading LED (Warp Engine)
fadeWarpEngine_StartMillis = millis();
//start time of fading LED (Main Impulse Engine)
fadeMainImpulseEngine_StartMillis = millis();
}
void loop()
{
//get the current time - save individual for each
currentMillisWarpEngine = millis();
currentMillisMainImpulseEngine = millis();
currentMillisNavigationLight = millis();
// call the individual functions
NavigationLightBlinking();
fadeWarpEngineIn();
fadeMainImpulseEngineIn();
}
//function to blink an LED if the blink period has ended
void NavigationLightBlinking()
{
if (currentMillisNavigationLight - blink_StartMillis >= blinkPeriod_NavigationLights) //test whether the period has elapsed
{
digitalWrite(NavigationLights, !digitalRead(NavigationLights)); //if so, change the state of the LED
blink_StartMillis = currentMillisNavigationLight; //IMPORTANT to save the start time of the current LED state.
}
}
//function to fade the Warp-Engine LED
void fadeWarpEngineIn()
{
if (brightness_WarpEngine < 255) {
if (currentMillisWarpEngine - fadeWarpEngine_StartMillis >= fadePeriod_WarpEngine) //test whether the period has elapsed
{
analogWrite(WarpEngineLights, brightness_WarpEngine); //set the brightness of the LED
brightness_WarpEngine += /*brightness_WarpEngine +*/ increment_WarpEngine; //will wrap round because brightness is an unsigned data type
fadeWarpEngine_StartMillis = currentMillisWarpEngine; //IMPORTANT to save the start time of the current LED state.
}
}
}
//function to fade the Main Impulse-Engine LED
void fadeMainImpulseEngineIn()
{
if (brightness_MainImpulseEngine < 255) {
if (currentMillisMainImpulseEngine - fadeMainImpulseEngine_StartMillis >= fadePeriod_MainImpulseEngine) //test whether the period has elapsed
{
analogWrite(MainImpulseEngineLights, brightness_MainImpulseEngine); //set the brightness of the LED
brightness_MainImpulseEngine += /*brightness_MainImpulseEngine +*/ increment_MainImpulseEngine; //will wrap round because brightness is an unsigned data type
fadeMainImpulseEngine_StartMillis = currentMillisMainImpulseEngine; //IMPORTANT to save the start time of the current LED state.
}
}
}
Nun zu meinen aktuellen Problemen:
Obwohl der Code für "fadeMainImpulseEngineIn()" sowie "fadeWarpEngineIn()" identisch ist - und auch die jeweiligen Parameter identisch sind, werden beide Funktionen nacheinander aufgerufen.
Beide sollten aber quasi zeitgleich starten - und sich dann höchstens durch unterschiedlich lange Fade-In Zeiten unterscheiden.
Soweit ich es sehen kann, definieren
//fade period for WarpEngine Lights
const unsigned long fadePeriod_WarpEngine = 100;
//fade period for Main Impulse Engine Lights
const unsigned long fadePeriod_MainImpulseEngine = 100;
aber sowohl die Zeit, wann das Fade-In beginnt.
Mit
//amount to change PWM value at each change
byte increment_WarpEngine = 1;
byte increment_MainImpulseEngine = 1;
wird definiert, um wieviele "schritte" das FadeIn pro zyklus hochlaufen soll, wenn ich mich nicht irre... (bis max. 255 = volle Helligkeit)
Nehmen wir also an, dass const byte WarpEngineLights = 10;
5 sekunden brauchen soll um von 0 auf 100% hochgedimmt zu werden, und const byte MainImpulseEngineLights = 12;
soll Zeitgleich starten, aber in 2,5 Sekunden bei 100% sein... wie müsste ich meinen Code anpassen?
Aktuell scheint es so zu sein, dass const byte MainImpulseEngineLights = 12;
erst nach ca. 13 Sekunden eingeschaltet wird.
Wieso dies so ist, konnte ich aktuell leider auch noch nicht wirklich erkennen.
Vermutlich ist es wenig Sinnvoll, für jede Aktion ein eigenes "currentMillis" zu nutzen - ich war mir aber nicht Sicher, ob es nicht kontraproduktiv ist, currentMillis nur einmal zu nutzen und in allen Funktionien einzusetzen - allerdings bleibt das Verhalten identisch, wenn ich nur currentMillis = millis(); verwende.
Ah und noch etwas...
Für eine Idee, wie ich zusätzlich ein Blitzlicht hinbekommen kann, das wäre die nächste Ergänzung
Also: LED soll für ein paar ms an sein (ggf. von 0 auf 255 einfaden) - dann für 2 sekunden aus - und das ganze in einem loop.
Danke schon mal und Grüße,
Christoph