Dringendes Taster problem im code! Selbstgelöst

HI, ich habe hier ein projekt wo ein ton ab gespielt werden soll wen zeit=2 oder 4 ist und der taster gedrückt wird. leider funktioniert das bei mir hier nicht so

int zeit = 0;
int zeitsolange = 1000;
void Unterprogramm2();

void Unterprogramm1();


void setup() {
  pinMode( 2 , INPUT);
  pinMode( 5 , OUTPUT);
  pinMode( 6 , OUTPUT);
  pinMode( 7 , OUTPUT);
  zeit = 0;

  zeitsolange = 1000;

}

void loop() {
zeitsolange = millis();
      Unterprogramm1();
      Unterprogramm2();
    

  zeit = ( zeit + 1 );
  while ( ( zeit == 5 ) ) 	
      zeit = 1;

}

//Dies ist Unterprogramm2
void Unterprogramm2() {
  if (( zeit == 1 )) {
      digitalWrite( 5 , HIGH );
      digitalWrite( 6 , LOW );
      digitalWrite( 7 , LOW );
    }
  if (( zeit == 2 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , HIGH );
      digitalWrite( 7 , LOW );
    }
  if (( zeit == 3 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , LOW );
      digitalWrite( 7 , HIGH );
    }
  if (( zeit == 4 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , HIGH );
      digitalWrite( 7 , LOW );
    }
}

//Dies ist Unterprogramm1
void Unterprogramm1() {
  if (( digitalRead(2) && ( ( zeit == 2 ) || ( zeit == 4 ) ) )) {
      tone(3, 800, 1000);
      for (int i = 0; i < 5; i++){
        digitalWrite( 6 , HIGH );
        delay( 100 );
        digitalWrite( 6 , LOW );
        delay( 100 );
      }
      zeitsolange = ( zeitsolange - 50 );
      if (( zeit == 0 )) {
          zeitsolange = 1000;
          for (int i = 0; i < 25; i++){
            digitalWrite( 6 , HIGH );
            delay( 100 );
            digitalWrite( 6 , LOW );
            delay( 100 );
          }
        }
    }
  if (( digitalRead(2) && ( ( zeit == 1 ) || ( zeit == 3 ) ) )) {
      tone(3, 180, 1000);
      zeitsolange = 1000;
    }
}


der taster läuft über D2
könnt ihr mir helfen eine lösung zu finden?
bis jetzt wird immer ein anderer ton abgespielt wenn die lampe aus ist bei 3 oder 4 . es soll halt nur bei taster gedrückt abgespielt werden

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

es ist doch im deutchen...

Jetzt, nach Verschiebung durch einen Moderator schon.

Du verschwendest Klammern.

Für was soll "zeitsolange" sein?
Mal millis() mal 1000 und mal 50 subtrahiert, sonst aber nicht verwendet.

while ( ( zeit == 5 ) ) 	
      zeit = 1;

besser if als while und auch noch besser auf >= (größer gleich) kontrollieren und nicht auf gleichstand.

if (( zeit == 1 )) {
      digitalWrite( 5 , HIGH );
      digitalWrite( 6 , LOW );
      digitalWrite( 7 , LOW );
    }
  if (( zeit == 2 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , HIGH );
      digitalWrite( 7 , LOW );
    }
  if (( zeit == 3 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , LOW );
      digitalWrite( 7 , HIGH );
    }
  if (( zeit == 4 )) {
      digitalWrite( 5 , LOW );
      digitalWrite( 6 , HIGH );
      digitalWrite( 7 , LOW );
    }

Besser switch case nehmen.

tone(3, 800, 1000);
...
tone(3, 180, 1000);

UND was hängt an Pin 3?
Ein Lautsprecher?
Dann soll Pin 3 ein ....
Ausgang sein.
Wo hast Du das geschrieben??

Grüße Uwe

an pin 3 ist ein activer summer

anfangs habe ich es auf ardublock gemacht und nachträglich dan normal den code verändert.

Kann schon sein aber damit der Summer was von sich gibt sollte er schon an einem Ausgang hängen.

was meinst du mit switch case?

er ist auch verbunden mit 5v

Kann schon sein aber wenn Du an einem Input den Pullupwiderstand ein und ausschaltest dann ist es halt was anderes als wenn Du an einem Ausgang 0V und 5V rausschickst.

Grüße Uwe

das ist der plan wie es geteckt ist. wo denkst du wäre es besser es rein zu stecken?

wo ist 0v bin leider mit arduino noch ein bissien neu

Ich denke mit einem
pinMode(3,OUTPUT);
im setup()
könnte hilfreich sein.

pin mode 3 output ist schon in setup drinnen

oh sorry ist nicht

was wäre der unterschied wenn ich while mit iff erstetze?

grafik

Der rote Kabel muß statt dem grünen Kabel gesteckt werden.
Der grüne Kabel (Eingang) muß neben dem Widerstand / Taster gesteckt werden.

Nur so hast Du mal 0V (GND) und bei gedrückten Taster 5V vom roten kabel am Eingang.

aha, hab ich trotzem recht.

Funktioniert es jetzt?
Grüße Uwe

1 Like

Mit while kannst Du leicht eine Endlosschleife fabrizieren wo der Controller dann einsam seine Runden dreht.

Grüße Uwe

1 Like

also muss ich nur die verbindung von den beiden tauchen?