Forum: Mikrocontroller und Digitale Elektronik Arduino UNO Taster und 3 LEDs


von Harald G. (tueftler1971)


Lesenswert?

Guten Morgen liebe Gemeinde, bin erst umgestiegen auf Arduino und habe 
ein kleines Problem.
Ich möchte mit einem Taster folgendes machen:

Wenn:
- Taster LOW, dann alle LEDs aus
- Taster HIGH, dann LED1 leuchtet für 1Sekunde, danach LED3 leuchtet so 
lange Taster gedrückt!

- Taster wird losgelassen, LED3 geht aus, LED2 leuchtet für 1Sekunde.

Wäre gut, wenn Taster noch entprellt wäre.

Leider weiß ich nicht, welche Schleife ich nehmen muß.

Hier mein Sketch nur als Übersicht:

int Taster=7;
int Tasterstatus=0;
int LED1=6;
int LED2=5;
int LED3=4;


void setup() {
pinMode(Taster, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}

void loop() {
Tasterstatus=digitalRead(Taster);
if (Tasterstatus == HIGH)
{
digitalWrite(LED1, HIGH);
delay (1000);
digitalWrite(LED1, LOW);
delay (50);
digitalWrite(LED3, HIGH);
}
else
{
digitalWrite(LED3, LOW);
delay (50);
digitalWrite(LED2, HIGH);
delay (1000);
digitalWrite(LED2, LOW);
}
}

Vielen Dank im Voraus

von variable (Gast)


Lesenswert?

Schau dir nochmal die Grundlagen zum Arduino Programmieren an.
Warum hast du für den Tasterstatus einen Integer und keinen Bool 
genommen?
Die Beispielprogramme der IDE könnten dir auch schon helfen.

von Karl M. (Gast)


Lesenswert?

Hallo Harald G.,

und wie sind die Eingänge der Taster beschaltet?
So dass diese immer einen definierten Eingangspegel haben?

von Stefan F. (Gast)


Lesenswert?

> danach LED3 leuchtet so lange Taster gedrückt!

Dein Code wiederholt den Block *if (Tasterstatus == HIGH) {...}* immer 
wieder, solange der Taste gedrückt gehalten wird. Du willst ihn aber nur 
einmal ausführen, wenn der Taster von "losgelassen" nach "gedrückt" 
wechselt.

Entsprechend willst du auch den Block *else {...}* nur einmal ausführen, 
wenn der Taster von "gedrückt" nach "losgelassen" wechselt.

Und wenn der Taster-Status unverändetr ist (losgelassen oder gdrückt), 
soll gar nichts passieren.

Vorschlag:
1
void loop() 
2
{
3
    Tasterstatus=digitalRead(Taster);
4
    if (Tasterstatus != VorherigerStatus)
5
    {
6
        if (Tasterstatus == HIGH)
7
        {
8
            digitalWrite(LED1, HIGH);
9
            delay (1000);
10
            digitalWrite(LED1, LOW);
11
            delay (50);
12
            digitalWrite(LED3, HIGH);
13
        }
14
        else
15
        {
16
            digitalWrite(LED3, LOW);
17
            delay (50);
18
            digitalWrite(LED2, HIGH);
19
            delay (1000);
20
            digitalWrite(LED2, LOW);
21
        }
22
    }
23
    VorherigerStatus = Tasterstatus;
24
}

von Harald G. (tueftler1971)


Lesenswert?

Vielen Dank für die Antworten!

Der Lösungsvorschlag habe ich probiert und funktioniert! Vielen Dank!

von Harald G. (tueftler1971)


Lesenswert?

Ich habe noch eine Frage....
momentan ist der Taster über 5Volt und einem 1kΩ Widerstand gegen Masse 
aufgebaut, würde der Arduino auch mit einem Taster der gegen Masse 
geschaltet ist, funktionieren? Also ohne die 5Volt

von Hubert G. (hubertg)


Lesenswert?

Wenn du INPUT_PULLUP schreibst, dann  kannst du den Taster gegen GND 
schalten, ohne weitere Bauteile.

von Harald G. (tueftler1971)


Lesenswert?

Da ich über die Leitung, wo der Taster hängt, noch mit 2 Taster über 
Widerstände, etwas steuern möchte (nicht mit Arduino), soll nun am 
analogen Eingang des Arduino (statt bisher am digitalen), erst ab einen 
Wert unter 1KΩ der Ablauf starten.
Wie gehe ich am besten vor?

Mein bisheriges Sketch:

//Taste - Eingang Masse
int LED1=13;     //wartet
int LED2=12;    //gestartet
int Taster=11;  //Taste gedrückt gegen Masse, ansonsten kein starten von 
Programm, wenn Widerstand über 1kΩ
int Tasterstatus=0;
int VorherigerStatus;

//alle gegen Masse mit genannten Widerstand
int LED3=10;
int LED4=9;
int LED5=8;

void setup() {
pinMode(Taster, INPUT);
digitalWrite(Taster, HIGH);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}

void loop() {
Tasterstatus=digitalRead(Taster);
if (Tasterstatus != VorherigerStatus)
{
if (Tasterstatus == LOW)
{
digitalWrite(LED1, LOW);
delay (10);
digitalWrite(LED2, HIGH);
delay (10);
digitalWrite(LED4, HIGH);
delay (100);
digitalWrite(LED4, LOW);
delay (100);
digitalWrite(LED5, HIGH);
}
else
{
digitalWrite(LED5, LOW);
delay (100);
digitalWrite(LED4, HIGH);
delay (100);
digitalWrite(LED4, LOW);
delay (10);
digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
}
}
VorherigerStatus = Tasterstatus;
}

: Bearbeitet durch User
von Harald G. (tueftler1971)


Angehängte Dateien:

Lesenswert?

Nach längerer Überlegung habe ich eine andere Idee....
Möchte über den Arduino nun doch alle Schaltvorgänge steuern, abhängig 
vom jeweiligen Widerstand.

S1 = Abfolge von Programm, siehe Sketch unten

neu hinzu:
S2 = nur LED3 leuchtet
S3 = nur LED4 leuchtet

Mein bisheriges Sketch:

//Taste - Eingang Masse
int LED1=13;     //wartet
int LED2=12;    //gestartet
int Taster=11;  //Taste gedrückt gegen Masse, ansonsten kein starten von
Programm, wenn Widerstand über 1kΩ
int Tasterstatus=0;
int VorherigerStatus;

//alle gegen Masse mit genannten Widerstand
int LED3=10;
int LED4=9;
int LED5=8;

void setup() {
pinMode(Taster, INPUT);
digitalWrite(Taster, HIGH);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}

void loop() {
Tasterstatus=digitalRead(Taster);
if (Tasterstatus != VorherigerStatus)
{
if (Tasterstatus == LOW)
{
digitalWrite(LED1, LOW);
delay (10);
digitalWrite(LED2, HIGH);
delay (10);
digitalWrite(LED4, HIGH);
delay (100);
digitalWrite(LED4, LOW);
delay (100);
digitalWrite(LED5, HIGH);
}
else
{
digitalWrite(LED5, LOW);
delay (100);
digitalWrite(LED4, HIGH);
delay (100);
digitalWrite(LED4, LOW);
delay (10);
digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
}
}
VorherigerStatus = Tasterstatus;
}

Vielen Dank und einen schönen Feiertag

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

Wenn du mehrere Taster an Analogeingang hast, wie in deinem Plan 
gezeichnet, dann musst du auch analogRead(Taster)nehmen.
Du brauchst drei Widerstände in Serie von +5V zum A0. Dazwischen legst 
du die Taster nach GND. Du kannst ja keinen Widerstand messen sondern 
nur die Spannung am A0.

von Harald G. (tueftler1971)


Lesenswert?

Vielen Dank Hubert, leider sind die Taster und Widerstände extern, daher 
kann ich Sie auch nicht auf 5Volt schalten.
Irgendwo ich auch schon mal gesehen, dass es eine Lösung gibt, die 
sogenannte Referenz über einen anderen analogen Eingang gibt, wird diese 
Referenzspannung überschritten, dann schaltet er durch. Sowas müsste ja 
auch bei 3 Referenz Spannungen gehen?
Und wenn, wie sieht dann der Sketch aus?
Bin leider noch nicht ganz durchgestiegen.

von Harald G. (tueftler1971)


Angehängte Dateien:

Lesenswert?

Habe die Fernsteuereinheit nochmals auseinandergenommen und bemerkt, 
dass wie von Hubert vorgeschlagen, im Ruhezustand 5Volt an den 
Widerständen anliegen.
Soweit so gut, nun habe ich aber nur 2 Leitungen zur Verfügung, die 
Messeleitung und die Steuerleitung, die jenach welche Taste gedrückt 
wird, Spannung leitet, da steig ich noch nicht durch,
oder kann ich A0 einfach auf 5Volt legen?
Das hieße aber auch, dass wenn S1 gedrückt, ein Kurzschluss auf der 
5Volt Versorgung wäre.

Wie würde der Sketch aussehen in etwa, um diese 3Spannungen 
3verschiedenen Aktionen, zu zu ordnen?

: Bearbeitet durch User
von Walta S. (walta)


Lesenswert?

Es gibt bei Fritzing auch eine Schaltplanansicht - verwende die und 
nicht die unnötige Steckbrettansicht.

walta

von Hubert G. (hubertg)


Lesenswert?

Deine Beschreibung ist mir nicht ganz klar. Ein richtiger Schaltplan 
wäre da schon sehr hilfreich.

von Harald G. (tueftler1971)


Angehängte Dateien:

Lesenswert?

Bin noch nicht so geübt darin, sorry!

von Hubert G. (hubertg)


Lesenswert?

Wenn du zwischen A0 und 5V einen Widerstand einfügst, z.B. 4k7, dann 
funktioniert es.

von Harald G. (tueftler1971)


Angehängte Dateien:

Lesenswert?

okay, das habe ich mir auch gedacht.
Wie sieht es mit dem Sketch aus,damit ich die 3 Spannungen in meinen 
einfügen könnte?
Da blicke ich bislang noch nicht durch, obwohl ich schon mit Schaltungen 
mit Potentiometer angesehen habe, war trotzdem nichts brauchbares dabei.

von Harald G. (tueftler1971)


Lesenswert?

Habe die Schaltung ohne LEDs aufgebaut und über SerialMonitor 
ausgelesen.
Dabei kamen folgende Werte heraus:

S1 = 0
S2 = 469
S3 = 330

wie kann ich nun diese in meine Schaltung integrieren, dass S1 das 
Programm wie gehabt durchläuft, und wenn S2 oder S3 was anderes macht?

von Hubert G. (hubertg)


Lesenswert?

In den Beispielen Analog / Calibration ist die Abfrage schön 
beschrieben.
Anstelle den min oder max Abfrage muss du nach deinen Werten fragen.
if (sensorvalue < 10){
    digitalWrite(LED1, HIGH);
   }
else{digitalWrite(LED1, LOW);}

und so weiter mit den anderen Werten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.