Ich versuche, einen Arduino zu programmieren. Durch PWM eine LED-Matrix durch schnelles Ein- und Ausschalten der LEDs. Um die Helligkeit zu steuern, möchte ich zusätzliche Anweisungen zwischen den Ein- und Aus-Zuständen der LEDs hinzufügen. Die Helligkeit sollte durch eine Präprozessorvariable eingestellt werden. Der Arduino verfügt über einen 84MHz Cortex-M3 ARM-Prozessor.Wie Einfügen einer Anweisung zwischen Zeilen mit Hilfe von Präprozessordirektiven in C++?
Dies ist eine Vereinfachung, wie mein Code erhöht sich zur Zeit die Helligkeit:
uint8_t volatile dummy = 0;
uint8_t i;
for (i=0;i<1<<current_layer;i++) { // every next layer has double the amount of pulses
LED_STATE = ON; // several pulses in one go speeds up the for loop
dummy = 0; // increases ON-time
LED_STATE = OFF;
LED_STATE = ON;
dummy = 0;
LED_STATE = OFF;
LED_STATE = ON;
dummy = 0;
LED_STATE = OFF;
LED_STATE = ON;
dummy = 0;
LED_STATE = OFF;
}
Jetzt möchte ich in der Lage sein, um die Helligkeit zu erhöhen, basierend auf einer Präprozessor Variable wie so:
#define BRIGHTNESS 2
// inside loop
LED_STATE = ON; // several pulses in one go speeds up the for loop
#if BRIGHTNESS > 0
dummy = 0; // increases ON-time
#if BRIGHTNESS == 2
dummy = 0; // increases ON-time even more
#endif
#endif
LED_STATE = OFF;
LED_STATE = ON;
#if BRIGHTNESS > 0
dummy = 0;
#if BRIGHTNESS == 2
dummy = 0;
#endif
#endif
LED_STATE = OFF;
LED_STATE = ON;
#if BRIGHTNESS > 0
dummy = 0;
#if BRIGHTNESS == 2
dummy = 0;
#endif
#endif
LED_STATE = OFF;
LED_STATE = ON;
#if BRIGHTNESS > 0
dummy = 0;
#if BRIGHTNESS == 2
dummy = 0;
#endif
#endif
LED_STATE = OFF;
Wie Sie sehen, das macht den Code sehr unlesbar. Ich möchte ein Präprozessor-Makro definieren, das diese Dummy-Anweisungen basierend auf dem Wert BRIGHTNESS
hinzufügt.
Dies ist, wie der Code sollte wie folgt aussehen:
#define BRIGHTNESS 2
#define B1 ... // adds dummy=0; when BRIGHTNESS > 0 or else nothing at all
#define B2 ...
#define B3 ...
#define B4 ...
// inside loop
LED_STATE = ON;
B1 B2 B3 B4 // adds a number of dummy statements based on the value of BRIGHTNESS
LED_STATE = OFF;
LED_STATE = ON;
B1 B2 B3 B4
LED_STATE = OFF;
LED_STATE = ON;
B1 B2 B3 B4
LED_STATE = OFF;
LED_STATE = ON;
B1 B2 B3 B4
LED_STATE = OFF;
Noch besser wäre eine Funktion sein, die diese Aussagen fügt auf einer variablen Basis:
#define ADD_DUMMIES ...
// inside loop
LED_STATE = ON;
ADD_DUMMIES(BRIGHNESS)
LED_STATE = OFF;
Wie würde ich Präprozessormakros definieren, so dass sie fügen Dummy-Anweisungen basierend auf dem Wert BRIGHTNESS
ein?
Warum verwenden Sie keine regulären 'if' Anweisungen? – DimChtz
@DimChtz Wie können Aussagen die Lesbarkeit verbessern? – uzumaki
Wenn Sie eine wechselnde Helligkeit der LED wünschen, warum ist sie eine Konstante? Habe ich etwas verpasst? –