Martinhorn mit ESP32

Guten abend,
ich möchte gerne mit meinem Mikrocontroller (ESP32) ein Martinhorn simulieren. Das ganze soll über einen passiven Buzzer funktionieren.
Als Frequenz habe ich 420 und 560 Hz genommen. So richtig habe ich keine andere gefunden.
Jetzt möchte ich, wenn ich eine Taste drücke, dass sich die Frequenz immer abwechselt. Am besten sollte die jeweilige Frequenz auch mindestens 1 Sekunde laufen. Habe den Code hier aus einem ähnlichen Beitrag im Forum gefunden, komme aber momentan nicht weiter.

int frq0 = 0;
int frq = 560;
int frq1 = 420;

const long TONDAUER = 1000;
void martinhorn()
{
  unsigned long vorhin;
  if ((merkerAlarm == true) && (merkerBlaulicht == true))
  {
    if (jetzt - vorhin >= TONDAUER) {
      vorhin = jetzt;
      if (frq == 560)
        frq = frq1;
      else
        frq ;
      ledcWriteTone(CHANNEL2, frq);
    }
  }
  else 
  ledcWriteTone(CHANNEL2, frq0);
}

Hallo
schaue dir dazu das IDE Beispiel an.

Wo kommen denn die Kästen um die Links her?
Wenn ich normal einen Link einfüge, ist das einfach ein Link und kein Werbebanner.

Gruß Tommy

Das ist ein "Feature" - Websiten, die einen Inhalt haben, der passt, werden automatisch mit einem "Vorschauattribut" dargestellt.

Danke. Ich habs zwar nicht ganz verstanden aber egal. Wenn meine Links einen Kasten bekommen, dann hat das komische System sie als relevant eingestuft. Will ich das überhaupt? :wink:

Gruß Tommy

Mir ist das auch schon passiert, ohne es angestrebt zu haben, hat mir aber kein Geld eingebracht, also keine Werbung.


Was ist das?

Das ist eine unspezifische Fehlerbeschreibung zusammen mit einem Programmfragment. Ich habe einen ESP32, kann Dein Programm aber leider nicht ausprobieren.

sowas ist das.

Mein Programm besteht aus mehreren Tabs. Ich habe über einen LDR ein Licht gesteuert, über Taster bringe ich zwei LEDs zum blinken und wenn das Licht an ist und die LEDs blinken soll halt der Lautsprecher mit zwei Frequenzen Töne abspielen.

Ich hatte das sonst bisher mit delay() als Tonlänge gemacht, aber das wäre ja für den Rest des Programms nicht vom Vorteil.

Das geht?

also das wird nicht klappen:

der else Zweig... was erwartest du da?
Debugge mal dein Programm Zeile für Zeile.

frq (560) ... frq wird zu frq1 (420)
zweiter durchlauf
frq (420) ... else Zweig ... nix
dritter durchlauf
frq(420) ... else Zweig ... nix
vierter durchlauf
frq(420) ... else Zweig ... nix

würdest du dir deine frq mittels serial print Ausgaben ausgeben, würdest du sowas sehen (hören sowieso auch).

Versuche mal dies (ungetestet):

const int frq0 = 0;
const int frq1 = 420;
const int frq2 = 560;
const long TONDAUER = 1000;

void martinhorn()
{
  static int frq = frq0;
  static unsigned long vorhin;
  if ((merkerAlarm == true) && (merkerBlaulicht == true))
  {
    if (jetzt - vorhin >= TONDAUER) {
      vorhin = jetzt;
      if (frq == frq1)
      {
        frq = frq2;
      }
      else
      {
        frq = frq1;
      }
    }
  }
  else 
  {
    frq = frq0;
  }
  ledcWriteTone(CHANNEL2, frq);
}

Du hast auch noch diese Zeile vergessen:

  ledcSetup(CHANNEL2, FREQUENCY, RESOLUTION);

Jetzt getestet mit ESP32 :slightly_smiling_face:

danke, das funktioniert soweit :slight_smile:

Hätte nur nochmal eine Frage zu dem Taster. Würde das gern mit dem internen Pulldown-Widerstand machen. Jedoch ist es egal, wie ich den Taster verdrahte, ich kriege immer einen Kurzschluss.

Ich hatte das mal aufgebaut damit, komme aber nicht mehr drauf, wie es funktioniert.

Ich habe einen Microtaster mit 4 Pins. Auf einem Pin setzte ich meine 3V Spannungsversorgung, auf den zussamenhängenden Pin momentan einen 10k-Ohm Widerstand. Auf dem Pin, welcher erst bei Tastendruck eine Verbindung herstellt, ist mein Eingangspin angeschlossen.

Jetzt würde ich gern den Widerstand weglassen.

Im Programm habe ich das folgendermaßen eingegeben.

pinMode(Alarmtaste, INPUT_PULLDOWN);
pinMode(Blaulichttaste, INPUT_PULLDOWN);

oder müsste ich das als Pullup aufbauen?

Ich nehme eigentlich immer die internen Widerstände.

Bei mir funktioniert das , ganz ohne Kurzschluß, mit Draht gegen 3,3 V.

ok, bei mir auch. hatte den Widerstand noch auf GND, bzw. dann die Verbindung zum GND. :see_no_evil:

Na dann Tatütatü :slightly_smiling_face:

Du könntest das Thema noch als gelöst markieren.