AND-Funktion // &-Funktion

Ach noch Einer der drauf schaut :wink:

Ich komm mit den IF/ELSE digitalWrite() HIGH/LOW nicht klar.

Wenn die Bedingung nicht erfüllt ist, dann geht der immer LOW.
Durch das delay() merkt er das nur nicht? Ist meine Annahme richtig?

da passt leider irgendwas nicht, der lautsprecher spielt nach der betätigung vom button mehrere versch. töne ab in versch. zeiten und abständen

Ich hab das blind gemacht ... Las mir mal nen Moment, vielleicht sehe ich es ja.

alles klar

Das mal ersetzen durch:

    case ende:
      if (millis() - laststart >= pause2) {
        noTone(Speaker);
        zustand = warten;
      }
      break;

Da fehlt zum einen das ausschalten des Tones und das Ende des Case .

Das ist schön!

Dann wäre vorher eine Überarbeitung sinnvoll:

int buttonState = 0;
int switchStateI = 0;
int switchStateII = 0;
int switchStateIII = 0;
int switchStateIV = 0;

Der Typ bool wäre vorzuziehen, geht doch nur HIGH oder LOW.

tone(8, 750);

Wozu definierst Du Konstanten, wenn Du sie dann nicht nutzt? Also besser tone(Speaker, 750);.

Was willst Du mit digitalWrite(Speaker, HIGH); bewirken?

Weil Du was gibst, gibt es auch was zurück. Hier mein getesteter Vorschlag (hat sich jetzt leider mit dem Kollegen überschnitten, zwei Leute, ein Gedanke, zwei kreative Lösungen):

struct Schalter {
  const byte pin;
  const uint16_t frequenzL;
  const uint16_t zeitL;
  const uint16_t frequenzH;
  const uint16_t zeitH;
};

Schalter schalter[] = {
  //pin, frequenzL, zeitL, frequenzH, zeitH
  {3, 750, 100, 2500, 100}, // Schalter I
  {4, 750, 500, 2500, 500}, // Schalter II
  {5, 750, 1000, 2500, 2000} // Schalter III
};

const byte anzahl = sizeof(schalter) / sizeof(schalter[0]);
const byte speaker = 8;   // Pinbelegung des Lautsprechers
const byte buttonPin = 2;   // Pinbelegung des Tasters

void setup() {
  pinMode(speaker, OUTPUT);   // Lautsprecher als Ausgang, Output festlegen
  pinMode(buttonPin, INPUT_PULLUP);   // Taster als Eingang, Input festlegen
  for ( byte j = 0; j < anzahl; j++) {
    pinMode(schalter[j].pin, INPUT_PULLUP);   // Schalter als Eingang, Input festlegen
  }
}

void loop() {
  if (!digitalRead(buttonPin)) {
    for ( byte j = 0; j < anzahl; j++) {
      if (!digitalRead(schalter[j].pin)) {
        tone(speaker, schalter[j].frequenzL);
        delay(schalter[j].zeitL);
        noTone(speaker);
        tone(speaker, schalter[j].frequenzH);
        delay(schalter[j].zeitH);
        noTone(speaker);
      }
    }
  }
}

:wink:
Ich habe nur Wartezeit... Da fiel mir nichts anderes ein - und ich wollte unbedingt das delay da raus haben...
Beste Grüße...

Dann könnte man beide Ideen ja kombinieren :slightly_smiling_face:

könntest du mir eventuell noch einmal erläutern was du mit den aussagen meinst?

  • also den typ bool vorziehen ? heißt im endeffekt weg lassen ?

und zu dem skript, also es funktioniert, nur leider ist das glaube ich noch eine stufe zu hoch für mich .. aber dank dir trotzdem für das zeigen, dass es auch kürzer/einfacher geht

Du speicherst 1 Bit von digitalRead() in 16 Bits vom Typ int, das ist Verschwendung. Daher spart dies Speicher:

bool buttonState = 0;
...
   buttonState = digitalRead(buttonPin);

Aber selbst wenn der selbstoptimierende Kompiler Deine Ungenauigkeit wegoptimieren sollte, empfehle ich Dir von Anfang an einen nachvollziehbaren Programmierstil, damit Du auch in späterer Zeit nachvollziehen kannst, was Du programmiert hast. Außerdem hilft es anderen Menschen beim Verständnis eines fremden Programms.

Das ist mir vollkommen bewußt, aber eventuell möchtest Du sie ja erklimmen? Bist Du in der Lage, eine Frage zu formulieren?

Wenn Du diese Zeile duplizierst und die Werte anpaßt, hast Du einen weiteren Taster definiert:

  {4, 750, 500, 2500, 500}, // Schalter II

Magst Du es versuchen?