PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Knopf LED einschalten und mit Timer ausschalten



darksider
14.12.2014, 21:04
Hallo liebe Gemeinschaft

ich bin ziemlich neu im Bereich der Arduino programmierung, bitte vergebt mir daher das Unwissen.
Folgendes Problem versuche ich zu lösen:

Ich möchte eine LED über einen Schalter einschalten, diese sollte für eine vordefinierte Zeit leuchten und von alleine wieder aus gehen. Mit dem Delay Befehl habe ich es geschafft, allerdings möchte ich das ganze lieber mit dem millis() Befehl durchführen, um das komplette Programm nicht zu beeinflussen.
Die LED soll über eine KSQ mithilfe von PWM hoch- und herunterdimmen.

Hier ist der Code, den ich geschrieben habe. Leider leuchtet in diesem Fall die LED nur, wenn man den Taster drückt. Beim Loslassen geht sie direkt wieder aus.
Kann mir jemand meinen Fehler zeigen?


int LED=9;
int taster=8;
int tasterstatus=0;
unsigned long timer;

void setup()
{
pinMode(LED, OUTPUT);
pinMode(taster, INPUT);
}

void loop()
{
tasterstatus=digitalRead(taster);

if(tasterstatus == HIGH)
{
timer = millis(), digitalWrite(LED, LOW);
}
else
{
digitalWrite(LED, HIGH);
}

if (millis() - timer >=3000)
{
digitalWrite(LED, HIGH);
}

}


Aufgrund der KSQ sind die HIGH und LOW Werte für die LED vertauscht.



Und hier der Code, in der die LED dimmen kann, allerdings mit dem Delay Befehl den ich gern ersetzen würde


int LED=9;
int taster=8;
int tasterstatus=0;
int faderschritte = 30;
int faderschritte_down = 5;



void setup()
{
pinMode(LED, OUTPUT);
pinMode(taster, INPUT);
}

void loop()
{
tasterstatus=digitalRead(taster);
if(tasterstatus == HIGH)
{
for (int helligkeit = 255; helligkeit >0;)
{
analogWrite(LED, helligkeit);
helligkeit = helligkeit - faderschritte;
delay(30);
}

delay (3000);

for (int helligkeit = 0; helligkeit < 255;)
{
analogWrite(LED, helligkeit);
helligkeit = helligkeit + faderschritte_down;
delay(25);
}

}
else
{
digitalWrite(LED, HIGH);
}

}

Rabenauge
14.12.2014, 21:53
Beim ersten Programm ist der Fall klar:
Wenn gedrückt, einschalten-soweit richtig.
Aber wenn nicht gedrückt: ausschalten?
Klar geht sie sofort aus wenn du den Taster los lässt.
Zumindest sollte der laufende Timer dort mit rein, ungefähr so:

if(taster_losgelassen && timer_abgelaufen)
{
machsLichtAus;
}

Sisor
14.12.2014, 22:13
Ich würds so lösen:

#define LED_PIN 9
#define TASTER_PIN 8
#define DELAYTIME 3000 // 3 sec
unsigned long tasterMoment;

void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(TASTER_PIN, INPUT);
}

void loop() {
if(digitalRead(TASTER_PIN))
{
tasterMoment= millis();
digitalWrite(LED_PIN, LOW);
}
if (millis() - tasterMoment >= DELAYTIME)
{
digitalWrite(LED_PIN, HIGH);
}
}

darksider
15.12.2014, 20:40
Vielen Dank für eure Antworten.
Das heißt, ich frage vor der Anweisung die aktuelle Zeit ab, speicher sie in einer Variablen und ziehe diese nachher wieder von der aktuellen Zeit ab... Okay, hab's soweit :)

Können in dem Programm 2 alle Delay Funktionen ebenfalls durch millis() ersetzt werden? Müsste ich dann mehrere Timer laufen lassen?!

Sisor
15.12.2014, 21:48
Können in dem Programm 2 alle Delay Funktionen ebenfalls durch millis() ersetzt werden? Müsste ich dann mehrere Timer laufen lassen?!

Versuch mal so:

#define TIMER_AUS -1
#define TIMER_AN 0
#define LED_PIN 9
#define TASTER_PIN 8
#define TICTIME 30 // 30 ms
#define TICCOUNTMAX 100

void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(TASTER_PIN, INPUT);
}

void loop() {
timer();
// tue was anderes
}

void timer() {
static unsigned long tic = millis();
static int ticcount = TIMER_AUS;
if(millis() - tic > TICTIME && ticcount >= TIMER_AN) // 30 ms vergangen und Timer gestartet?
{
tic = millis(); // nächsten 30ms Zyklus starten
ticcount++;
if (ticcount > TICCOUNTMAX) { // Timer fertig?
ticcount = TIMER_AUS;
digitalWrite(LED_PIN, HIGH);
}
else
blinkfunction(ticcount); // Timer läuft noch -> blinkfunction()
}
if(digitalRead(TASTER_PIN)) // Taste betätigt? Timer startet (neu)
ticcount = TIMER_AN;
}

void blinkfunction(int ticcount) // in 30 ms Zeitabständen aufgerufen
{ // ticcount wird jeden Aufruf um 1 erhöht
digitalWrite(LED_PIN, LOW);
}

Die Funktion blinkfunction(int ticcount) kannst du jetzt so umbauen, wie du willst. Also in Abhängigkeit von ticcount die Led dimmen. Z.B.
if(ticcount < 32) analogWrite(ticcount*8-1);...