Lautsprecher

Guten Tag liebe Arduino Gemeinde.

Ich habe jetzt am Wochenende eine Lärmampel für meine Klasse gebaut. Ich würde ganz gerne, wenn es zu laut ist, ebenfalls einen "schrecklichen" bzw. "piepsigen" Ton ausgeben. Der sollte auch eine entsprechende Lautstärke hinbekommen.

Jetzt wäre meine Frage, hat einer von Erfahrung? Ich denke nicht, dass ich einen Lautsprecher direkt an einen Arduino Uno anschließen kann, oder?

Habt ihr Empfehlungen, welchen Lautsprecher ich nutzen kann? Und eventuelle Verstärker oder gar 2in1 Lautsprecher?

Vielen lieben Dank!

Grüße Sascha

Wenn du nur einen lauten Ton erzeugen willst, brauchst du keinen Lautsprecher, sondern einen aktiven Piezo mit entsprechender Lautstärke. Die gibt es schon in einer nervigen Lautstärke und werden dann mit einer Gleichspannung angesteuert.
Dazu brauchst du dann noch einen Steuertransistor.

Du kannst auch eine Mopedhupe nehmen. Über Relais oder Treibertransistor. Aber Du musst die Lärmerkennung ausschalten, solange der Alarm an ist. Sonst geht der nicht mehr aus.

Und wenn das Ding zu laut wird, dann darfst du dich auf unerfreuliche Termine einstellen.

Vielen Dank für eure Ideen und Hilfe.

Wenn ich einen Aktiv Piezo nehmen würde, scheint er mindestens 12V - 24V zu brauchen um eine entsprechende Lautstärke zu erzeugen.

Wäre der Steuertransistor für die Spannung? Welchen könnte ich nehmen, wenn ich folgenden Piezo nutzen würde?

https://www.ebay.de/itm/12V-Elektrische-Piezosummer-Alarmsirene-Buzzer-Piezo-Alarm-Signalgeber/153441476886?_trkparms=aid%3D555018%26algo%3DPL.SIM%26ao%3D1%26asc%3D20140117130753%26meid%3De325ee213b5d4e7caf0f1e209af01967%26pid%3D100005%26rk%3D2%26rkt%3D12%26sd%3D281968422257%26itm%3D153441476886&_trksid=p2047675.c100005.m1851

Vielen Dank für eure Hilfe!

Leider steht nichts von Lautstärke und Strombedarf dabei. Aber ich vermute mal, ein BC337 sollte da funktionieren.

Dieser Piezo ist schön laut.

Habe mir für meine Soundmaschine einen solchen Lautsprecher (Amazon-Link) bestellt.

Dazu das passende DFPlayer-Modul und ich kann jeden Ton, Lied, Sound, was auch immer abspielen. Die Lautstärke ist echt anständig! Hätte ich nicht erwartet :)

Vielen Dank für eure Tipps. Der genannte Piezo ist laut genug und macht seine Arbeit gut.
Sollte ich bei dem Steuertransistor Widerstände einlöten?

Jetzt stehe ich vor einem weiteren Problem. Ich habe 3 Phasen. Wenn alles ok ist (grün) soll eine SD Karte beschrieben werden mit Datum - Uhrzeit - grün

Bei der gelben Phase soll es so ähnlich sein:
Datum - Uhrzeit - gelb

und in der roten Phase:
Datum - Uhrzeit - rot.

Nur wie bekomme ich das am besten hin? Folgenden Code hätte ich (im loop):

//RTC Daten aktualisieren
  now = rtc.now();
  showDate();
  showDay();
  showTime();

und

if (wert>=grenze_rot) { // Für hohe Lautstärke
    for(int i=0; i<NUMPIXELS; i++) { 
      pixels.setPixelColor(i, pixels.Color(255, 0, 0));
      pixels.show(); 
     }
     
 //SD Karte beschreiben
file = SD.open("file.txt", FILE_WRITE); // open "file.txt" to write data
  if (file) {
    
    file.println(number); // write number to file
    file.close(); // close file
    Serial.print("Wrote number: "); // debug output: show written number in serial monitor
    Serial.println(number);
  } else {
    Serial.println("Could not open file (writing).");
  }
    
    tone(A1,100);
    delay(dauer); //Warten
    noTone(A1);   
}
else if (wert>grenze_gelb){ //Für mittlere Lautstärke ...
for(int i=0; i<NUMPIXELS; i++) { 
    pixels.setPixelColor(i, pixels.Color(255, 255, 0));
    pixels.show();   
  }   
  delay(dauer); //Warten  
}
else {
for(int i=0; i<NUMPIXELS; i++) { 
    pixels.setPixelColor(i, pixels.Color(0, 255, 0));
    pixels.show(); 
  }     
}

Hätte jemand einen Tipp für mich?

Vielen lieben Dank!
Grüße und einen schönen Vatertag morgen!
Sascha

Nimm für die Basis einen Widerstand ( nur mit i) von 470 Ohm, das sollte passen. Vorausgesetzt du hast den BC337 genommen.

Sollte ich bei dem Steuertransistor Widerstände einlöten?

Verstehe Deine Frage nicht ganz weil ich nicht weiß wie Deine Schaltung aussieht. Basiswiderstand ist unbedingt erforderlich! Der Piezo braucht keinen Widerstand.

Vielen Dank für eure Hilfe! Die Teile sind mittlerweile gekommen und direkt verbaut worden. Es funktioniert fast alles einwandfrei. Leider nur fast :confused:

Ich bräuchte noch mal kurze eure Hilfe. In einem Bereich, wenn er grün ist, möchte ich das der Wert jede Minute nur gespeichert wird.

Wie folgt bin ich das ganze angeganen:

Erst habe ich folgendes definiert:

unsigned long WRITE_INTERVAL = 60000; // 1 Minuten
unsigned long lastWrite = WRITE_INTERVAL;

In lastWrite wird die letzte Aktualisierung gespeichert.

Im Loop-Bereich befindet sich folgender Code:

void loop() {
  //RGB auf 0 stellen
  pixels.clear();

  //RTC Daten aktualisieren
  now = rtc.now();
  showDate();
  showDay();
  showTime();

  //Mikrofon einstellen
  int lautstaerke = analogRead(mikrofon); // Lautstärke einlesen
  float wert = lautstaerke;
  Serial.println(wert);

  if (wert >= grenze_rot) { // Für hohe Lautstärke
    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.setPixelColor(i, pixels.Color(255, 0, 0));
      pixels.show();
    }

    //SD Karte beschreiben
    String line = String(now.day()) + "." + String(now.month()) + "." + String(now.year()) + "-" + String(now.hour()) + ":" + String(now.minute()) + ";" + "rot";
    writeToSD(line);

    tone(A1, 100);
    delay(dauer); //Warten
    noTone(A1);
  }
  else if (wert > grenze_gelb) { //Für mittlere Lautstärke ...
    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.setPixelColor(i, pixels.Color(255, 255, 0));
      pixels.show();
    }
    String line = String(now.day()) + "." + String(now.month()) + "." + String(now.year()) + "-" + String(now.hour()) + ":" + String(now.minute()) + ";" + "gelb";
    writeToSD(line);
    delay(dauer); //Warten
  }
  else {
    for (int i = 0; i < NUMPIXELS; i++) {
      pixels.setPixelColor(i, pixels.Color(0, 255, 0));
      pixels.show();
    }
    if (millis() - lastWrite > WRITE_INTERVAL) {
      String line = String(now.day()) + "." + String(now.month()) + "." + String(now.year()) + "-" + String(now.hour()) + ":" + String(now.minute()) + ";" + "gruen";
      writeToSD(line);
      lastWrite = millis();
    }
  }
}

Der untere Teil (nach dem else) schreibt dennoch jede Sekunde einen Eintrag auf die SD Karte.

   if (millis() - lastWrite > WRITE_INTERVAL) {
      String line = String(now.day()) + "." + String(now.month()) + "." + String(now.year()) + "-" + String(now.hour()) + ":" + String(now.minute()) + ";" + "gruen";
      writeToSD(line);
      lastWrite = millis();
    }

Dabei sollte er mit Hilfe der Funktion “millis()” und der if-Abfrage nur jede Minute auf die SD Karte schreiben.

Hat jemand von euch einen Tipp für mich? Und vielen Dank für eure Hilfe!

Grüße und schönen Sonntag
Sascha