Arduino Taster funktioniert nicht

Hallo Leute,
ich habe eine Aufgabe, und zwar muss ich eine Ampelschaltung mit Haupt- und Querverkehr machen. Hauptverkehr habe ich schon gemacht aber der Taster funktioniert nicht. Wenn der Taster gedrückt wurde müssen alle LEDs auf LOW umgeschaltet werden.

int Pins[] {2,3,4,5,6}; 
int red =2;
int yellow=3;
int green = 4;
int RotF=5;
int GruenF =6;
int blaulichtTaster = 12;
int blaulichtTasterStellung = 0;

void setup() {
  for(int i=0;i<9; i++) {
  pinMode(Pins[i], OUTPUT);
  }
  
  pinMode(blaulichtTaster, INPUT);
}
void loop() {
  blaulichtTasterStellung = digitalRead(blaulichtTaster);
  
  if(blaulichtTasterStellung == HIGH){
    digitalWrite(red,LOW);
    digitalWrite(green, LOW);
    digitalWrite(yellow, LOW);
    digitalWrite(GruenF, LOW);
    digitalWrite(RotF,LOW);

  }


}

Kann mir wer helfen?

Liebe Grüße

Hallo
Eine schnelle Frage:
Ist der Taster richtig verdrahtet ?

Hallo,

so wie ich das sehe hast Du den Taster falsch angeschlossen. Du benötigst einen Pulldown Widerstand.

Also von plus an den Taster, vom anderen Ende des Tasters an den Eingang des UNO und ebenfalls an ein Ende des Widerstandes. Das zweite ende des Widerstandes an Minus.

Einfacher ist du schaltest den Taster zwischen Eingang des UNO und das andere Ende an Minus. Im Setup benutzt Du dann

pinMode(blaulichtTaster, INPUT_PULLUP);

und im Loop negierst Du die Abfrage mit dem ! Zeichen

blaulichtTasterStellung = !digitalRead(blaulichtTaster);

Du kannst auch print Ausgaben auf den Monitor benutzen um den Ablauf zu verfolgen.

Heinz

Nachtrag
void setup() {
for(int i=0;i<9; i++) {
pinMode(Pins*, OUTPUT);*
}
ist nicht gut , damit hast Du die beiden pins für die Serielle Schnittstelle umkonfiguriert die liegen auf pin0 ind pin1
Wenn schon dann mit 2 anfangen[/s]

Glockinc:
Kann mir wer helfen?

Wie schon erwähnt, ist der Taster falsch verdrahtet.

Anders als Heinz empfehle ich eine grundsätzlich andere Verdrahtung:
Schließe den Taster so an, dass er den Pin mit GND verbindet. So ist das üblicherweise*. Den Widerstand am Taster benutzt Du als „Pull-up“-Widerstand.

*Ein Taster wird üblicherweise benutzt, um einen Pin bei Betätigung mit GND zu verbinden. Grund: GND wird an normalerweise an vielen Stellen in einer Schaltung verwendet/benötigt und ist daher meistens überall verfügbar. Die „gedrückt heißt 'ja' bzw. 'HIGH'" klingt zwar einleuchtender, ist normalerweise aber praxisfern. der Pull-up-Widerstand sorgt dafür, dass der Pin bei ungedrücktem Taster auf HIGH „festgenagelt“ wird.
Anstatt tatsächlich einen Widerstand zu verbasteln, kannst Du auch den benutzen, der im Mikrocontroller vorhanden ist. Du musst das dann halt bei der Initialisierung des Pins in setup() angeben (die Initialisierung des Button-Pins fehlt da sowieso):

setup() {
...
   pinMode(buttonpin, INPUT_PULLUP);
... }

Gruß

Gregor

Rentner:
Hallo,
so wie ich das sehe hast Du den Taster falsch angeschlossen. Du benötigst einen Pulldown Widerstand.

Pulldown hat er, so wie ich das sehe: Er hat Ground auf der +Schiene und 5V auf der -Schiene des Breadboards (etwas verwirrend)
[Edit] der Widerstand ist wohl falsch angeschlossen :dauerhaft zwischen 5V und Ground, oder halt der Taster, je nachdem wie man es auslegt :wink: [/Edit]

Moko:
Pulldown hat er, so wie ich das sehe:

Hallo,
ja das soll einer sein , ist aber keiner weil falsch angeschlossen :wink:

Gruß Heinz

so wie ich das sehe hast Du den Taster falsch angeschlossen. Du benötigst einen Pulldown Widerstand.

Sehe ich nicht so.

Ich sehe eher das Problem daß im Sketch die LED nur ausgeschaltet werden und nie ein.

Daß der Taster unter Umständen "Falsch" angeschlossen sein könnte und ohne Drücken als "EIN" erkannt wird ist ein kosmetisches Problem.

Manche Breadbords haben nicht die ganzen seitlichen Kontakte verbunden sondern es sind 2 Teile die man in der Mitte brücken muß.

Grüße Uwe

Hallo,
@Uwe stimmt da muss ich Dir Recht geben.

Allerdings hat der T0 hier sicher nur mal den Teil vorgestellt der alle LED ausshalten soll. Denn ein Teil der Ampel funktioniert ja bereits.

Dann mach das doch mal ganz ohne Taster, nimm das eine Ende von dem grünen Draht mal raus und stecke es direkt auf 5V oder auf GND , so kannst Du den Taster erst mal ausschliessen.

Heinz

Hallo,
wie kommst du denn da drauf, dass der Taster nicht funktioniert ?
Hast du den mal durchgemessen ?
Evtl. hast du den ja auch verdreht (90°) angeschlossen, oder eben, wie schon beschrieben alles falsch angeschlossen.

Einfach mal prüfen und nach den vorhandenen Vorschlägen neu verdrahten.

Wenn der Taster in natura so aussieht wie auf der Zeichnung dann kann man den nicht um 90° gedreht einstecken weil die Füßchen-abstände in die 2 Richtungen verschieden sind.

Grüße Uwe

uwefed:
Wenn der Taster in natura so aussieht wie auf der Zeichnung dann kann man den nicht um 90° gedreht einstecken weil die Füßchen-abstände in die 2 Richtungen verschieden sind.

Grüße Uwe

Und ob man das kann.
Es gibt doch Zangen, da kann man die Beine passend hinbiegen.

Ok, macht evtl. nicht jeder. :wink:

ok ich prezisiere. Ohne Verbiegen geht der Taster nur in 2 Positionen (0 und 180°) ins Steckbrett und nicht in 4 Positionen (0,90,180, 270°)
Grüße Uwe.

Rentner:
...

Nachtrag

void setup() {
for(int i=0;i<9; i++) {
pinMode(Pins*, OUTPUT);*
}
ist nicht gut , damit hast Du die beiden pins für die Serielle Schnittstelle umkonfiguriert die liegen auf pin0 ind pin1
Wenn schon dann mit 2 anfangen
[/quote]
Das ist hier nicht das Problem!
Denn:
* *void setup() { for(int i=0;i<9; i++) { pinMode(Pins[i], OUTPUT); }* *
das [i] wird vom BBCode Parser als fehlerbehaftet ignoriert/entfernt.
Der Fehler wohnt woanders:
* *int Pins[] {2,3,4,5,6}; for(int i=0;i<9; i++)* *
Das Array hat gar keine 9 Elemente.
Der Fluch der magischen Zahlen.
Besser:
* *const byte pins[] {2,3,4,5,6}; void setup() { for(const byte p:pins) pinMode(p, OUTPUT); }* *

uwefed:
ok ich prezisiere. Ohne Verbiegen geht der Taster nur in 2 Positionen (0 und 180°) ins Steckbrett und nicht in 4 Positionen (0,90,180, 270°)
Grüße Uwe.

Ok Uwe, ich gebe dir Recht.
An der gezeigten Position ist der Taster tatsächlich nur in 2 Positionen einzustecken.

Allerdings stelle ich jetzt die Frage, hat der TO den Taster auch an dieser Stelle so wie gezeichnet montiert ?
Ok, ich erwarte keine Antwort vom TO.

Also ich hab jetzt mal versucht aus dem bisherigen rauszulesen....
Ich frage mich ernsthaft, ob überhaupt klar ist was hier passiert.

Aufgabestellung:
Wenn Blaulichttatse gedrückt, mache alle LED aus.
Soweit sogut.

ICH lese aus dem Code, das die LED niemals AN gehen!

Uwe in #6 gibt zu bedenken, das das BB eine Trennstrecke haben könnte.
Wenn die tatsächlich existiert, gehen die LED niemals AN.

Rentner in #2 gibt zu bedenken, das die PINMode zu früh anfangen würden.
In Pins[0] steht 2
In Pins[1] steht 3
In Pins[4] steht 6
Pins[5] und alles bis [9] existiert nicht.
Schlechter Stil. Aber nicht falsch.[edit] ein Suizid[/edit]

Was mir aufstösst: Das ist doch irgendwas zusammengebasteltes, was der TO liefert!
Spätestens bei blaulichtTasterStellung frage ich mich, was er wirklich will...

Und warum keiner auf die Idee kommt einfach abzufragen, was ausgegeben wird?
Wenn die Ausgabe, mit dem was auf dem BB passiert, nicht übereinstimmt kann er suchen.

int Pins[] {2, 3, 4, 5, 6};
int red = 2;
int yellow = 3;
int green = 4;
int RotF = 5;
int GruenF = 6;
int blaulichtTaster = 12;
int blaulichtTasterStellung = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (int i = 0; i < 4; i++) {
    pinMode(Pins[i], OUTPUT);
  }
  digitalWrite(red, LOW);
  digitalWrite(green, HIGH);
  digitalWrite(yellow, LOW);
  digitalWrite(GruenF, HIGH);
  digitalWrite(RotF, LOW);
  pinMode(blaulichtTaster, INPUT_PULLUP);
  writepinsserial();
}
void loop() {
  if (digitalRead(blaulichtTaster) == LOW) {
    digitalWrite(red, HIGH);
    digitalWrite(green, LOW);
    digitalWrite(yellow, LOW);
    digitalWrite(GruenF, LOW);
    digitalWrite(RotF, HIGH);
  }
  if (millis() % 1000 == 0)
  {
    writepinsserial();
  }
}

void writepinsserial()
{
  Serial.print(F("Status der Pins:"));
  for (int i = 0; i < 5; i++)
  {
    Serial.print(" ");
    Serial.print(digitalRead(Pins[i]));
  }
  Serial.print(F("Blaulicht: "));
  
  Serial.println(digitalRead(blaulichtTaster));
}

Ok. combie war schon im wichtigen Teil schneller

Pins[5] und alles bis [9] existiert nicht.
Schlechter Stil. Aber nicht falsch.

Das ist nicht richtig!
Eine Array Bereichsüberschreitung mündet lauf Spezifikation in ein undefiniertes Verhalten.
Das ist also ein Suizid in Software.

combie:
Das ist nicht richtig!
Eine Array Bereichsüberschreitung mündet lauf Spezifikation in ein undefiniertes Verhalten.
Das ist also ein Suizid in Software.

Stimmt!
Ich habs übernommen...

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.