Hallo,
da dies hier mein erster Post hier im Forum ist, kurz etwas über meine bisherigen Erfahrungen mit dem Arduino :
Ich habe vor kurzen angefangen , mich mit dem Arduino Uno und der C/C++ Programmierung zu beschäftigen , stehe also noch ganz am Anfang
mein Hauptaugenmerk liegt im Moment (noch) auf der Programmierung von einfachen Sequenzen mit maximal 8 LEDs. Den Arduino Uno will ich in Zukunft unter anderem dazu nutzen, Modelle (eventuell mit dem Nano) usw, zu beleuchten.
Nun zu meinen Anliegen:
Ich habe jetzt ein Programm geschrieben, dass per Push Button verschiedene LED-Muster bzw. Programme wiedergibt. Zuden habe ich die SoftPWM-Library zum Ein- und Ausfaden eingebunden und statt delay() die millis()-Funktion benutzt.
Das Programm funktioniert soweit , allerdings gibt es noch ein paar Probleme:
-
Im ersten Programm (Case 1) sollen alle Programme mittels einer For-Schleife eine bestimmte Anzahl oft wiederholt werden. Leider klappt das irgendwie nicht. Normalerweise sollte die Funktion doch bis zum Ablauf der Schleife iteriert werden um dann zur nächsten For-Schleife springen etc. WIe kann ich das Problem beheben?
-
Zwischen den Übergängen der einzelnen Programme bleiben die zuletzt geleuchteten LEDs immer noch eine kurz Zeit stehen, sehr gut sichtbar beim Übergang von case 2 zu case 3.
Wie bekomme ich einen flüssigen Übergang hin?
Ich hoffe , das ich meine Probleme verständlich dargestellt habe. Würde mich auch sehr über Vorschläge, wie man den Code eventuell besser und effizenter gestalten kann, freuen.
anbei der Code und eine Fritzings-skizze
vielen Dank schonmal im Voraus
Gruß
Hendrik
#include <SoftPWM.h>
#define BUTTON 10
const int ledPin[8] = {2,3,4,5,6,7,8,9};
int cntr1 = 0;
int cntr2 = 3;
int cntr3 = 4;
int cntr4 = 0;
int cntr5 = 0;
int haltCounter1 = 0; // Wartezeit bis der Schweif erloschen ist
int haltCounter2 = 0; // Wartezeit bis der Schweif erloschen ist
int ledDirection = 1;
byte state = 0;
byte old = 0;
byte buttonPoll = 0;
byte ledState = 0;
unsigned long previousMillis = 0;
const long interval = 400;
void setup()
{
pinMode(BUTTON, INPUT);
SoftPWMBegin();
for (int i = 0; i < 8; i++)
{
SoftPWMSet(ledPin[i], 0);
}
//Fadezeiten
for (int i = 0; i < 8; i++)
{
SoftPWMSetFadeTime(ledPin[i], 0, 400);
}
}
void loop()
{
// Button entprellen
buttonPoll = digitalRead(BUTTON);
if(buttonPoll == 0)
{
delay(50);
buttonPoll = digitalRead(BUTTON);
if(buttonPoll == 1)
{
state = old+1;
}
}
else
{
delay(50);
}
// Programauswahl
switch (state)
{
case 1:
// Alle Programme in einer Dauerschleife
program1();
old = state;
break;
case 2:
// Alarm
program2();
old = state;
break;
case 3:
// Larson Scanner
program3();
old = state;
break;
case 4:
// von Innen nach Aussen
program4();
old = state;
break;
default:
// alle LEDs aus
for (int i = 0; i < 8; i++)
{
SoftPWMSet(ledPin[i], 0);
}
old = 0;
break;
}
}
// Alle Programme in einer Dauerschleife
void program1()
{
for (int i = 0; i < 2; i++)
{
program2();
}
for (int i = 0; i < 2; i++)
{
program3();
}
for (int i = 0; i < 2; i++)
{
program4();
}
}
// Alarm
void program2()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 800)
{
previousMillis = currentMillis;
if (ledState == 0)
{
ledState = 255;
}
else
{
ledState = 0;
}
for (int i = 0; i < 8; i++)
{
SoftPWMSet(ledPin[i], ledState);
}
}
}
// Larson Scanner
void program3()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
if (ledDirection == 1)
{
SoftPWMSet(ledPin[cntr1-1], 0);
SoftPWMSet(ledPin[cntr1], 255);
cntr1++;
haltCounter1++;
if (cntr1 > 7)
{
cntr1 = 7;
if (haltCounter1 > 12)
{
haltCounter1 = 0;
ledDirection = 2;
}
}
}
if (ledDirection == 2)
{
SoftPWMSet(ledPin[cntr1+1], 0);
SoftPWMSet(ledPin[cntr1], 255);
cntr1--;
haltCounter1++;
if (cntr1 < 0)
{
cntr1 = 0;
if (haltCounter1 > 11)
{
haltCounter1 = 0;
ledDirection = 1;
}
}
}
}
}
// von Innen nach Aussen
void program4()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
if (cntr2 == 3 || cntr3 == 4 )
{
SoftPWMSet(ledPin[0], 0);
SoftPWMSet(ledPin[7], 0);
}
else
{
SoftPWMSet(ledPin[cntr2+1], 0);
SoftPWMSet(ledPin[cntr3-1], 0);
}
SoftPWMSet(ledPin[cntr2], 255);
SoftPWMSet(ledPin[cntr3], 255);
cntr2--;
cntr3++;
if (cntr2 < 0 || cntr3 > 7)
{
cntr2 = 0;
cntr3 = 7;
haltCounter2++;
if (haltCounter2 > 2)
{
cntr2 = 3;
cntr3 = 4;
haltCounter2 = 0;
}
}
}
}