PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Variable Blinkfrequenz



Greensiver
29.06.2013, 23:02
Hi liebe Community,

Ich hab mal versucht ein Sketch zu basteln, der die Auszeiten beim Blinken einer LED regelt. Folgender Sketch lässt die LED zwar Blinken aber das Regeln der Auszeit klappt noch nicht. Wer cool, wenn Ihr mir ein paar Verbesserungsmöglichkeiten und Ratschläge geben könntet.

Hier mein Code:



int LED_PIN = 13;
int LED_ON = 1000;
int LED_OFF = 3000;
unsigned long ms;
unsigned long msLast;
boolean ledState;
int writebyte=0;
int blink_on=0;
int serialinput;

void setup(void)
{
pinMode(LED_PIN, OUTPUT);
Serial.begin(19200);
}

void loop(void)
{
serialinput = Serial.read();

if(blink_on == 1)
{
ms = millis();
blinkloop();
}

if(serialinput == 'x')
{
writebyte=1;
}

if(serialinput == 'y')
{
writebyte=0;
}

if(writebyte == 1)
{
serialinput = LED_OFF;
}

if(writebyte == 0){
if(serialinput == 'a')
{
blink_on=1;
}
if(serialinput == 'b')
{
blink_on=0;
digitalWrite(LED_PIN,LOW);
}
}
}


void blinkloop(void)
{
if(blink_on == 1)
{

if (ms - msLast > (ledState ? LED_ON : LED_OFF))
{
digitalWrite(LED_PIN, ledState = !ledState);
msLast = ms;
}
}
}



______________________
Danke schon mal, Green

shedepe
30.06.2013, 02:08
Hallo,
sind die * Überreste der Formatierung oder dereferenzierungs Operatoren (Was eig kaum sein kann ,aber ich frage mal lieber nach).
Weiterhin wäre es für Außenstehenden schön wenn du deinen Code etwas kommentieren könntest und zudem das Prinzip deiner bisherigen Überlegung schilden könntest.
(Nicht dass man das nicht aus dem Code lesen könnte, aber es würde die Hilfsbereitschaft wesentlich erhöhen)

Nun zu deinem Code:


1. Wenn du beim Aufrufen von blinkloop schon abfragst ob blink_on == 1 entspricht brauchst du das nicht noch mal in der Methode zu machen.
2. Was willst du damit bezwecken ?

serialinput*=*LED_OFF;

3. Zum Blinken: versuch mal msLast einen wert bei der initialisierung zu geben, da in C nicht definiert ist mit was ein int initialisiert wird.
Zudem sehe ich keine stelle an der ledState gesetzt wird. Also wird ledState wohl immer false sein.

Greensiver
30.06.2013, 10:15
Danke für die Antwort,
diese " * " hat das Forum alleine rein gemacht (Hab in der ArduinoIDE einfach auf "Für Forum kopieren" geklickt). Den Fehler zu beheben wäre nicht schlecht. Naja, da sieht der Code jetzt eben nicht mehr so schön farbig aus:(.

@shedepe
1. War nur eine Sicherheit, dass die Methode nur läuft wenn blink_on wirklich nur 1 ist. (kann man das auch weglassen?)
2. Ich wollte wenn der µC ein "x" bekommen hat, die neue Auszeit in die Variable LED_OFF schreiben, und das ganze mit "y" bestätigen. Sozusagen das eigentliche Problem. Wie macht man das?
3. ledState gibt bei mir die Werte 1 und 0 aus. Je-nachdem ob die LED an Pin 13 An oder Aus ist. Also kann ledState nicht immer false sein (zumindest wenn es blinkt). Das Blinken funktioniert tadellos.
Das ledState wird hier:
digitalWrite(LED_PIN, ledState = !ledState); geschrieben und gleichzeitig negiert für den nächsten "Blinkanlauf", das ! ist das Zauberzeichen ;).

Funktionsprinzip:
schreibe a:xxxxxxxxxxxxxxxxxxxxxxxxBlinker AN
schreibe b:xxxxxxxxxxxxxxxxxxxxxxxxBlinker AUS
schreibe x:xxxxxxxxxxxxxxxxxxxxxxxxSchreibmodus AKTIV (Wobei der Blinker wenn er an ist weiter läuft)
schreibe nach x Irgendeine Zahl:yDie geschriebene Zahl soll die Auszeit beim Blinken verändern.
schreibe y:xxxxxxxxxxxxxxxxxxxxxxxxSchreibmodus INAKTIV

Achso, ja ich werde den Code demnächst mal Kommentieren :)