"Zwitscherbox" / Musik mit Bewegungsmelder

Hallo,

Über mich

Ich bin ganz neu hier im Forum und auch in der Welt von Arduino / Elektronik. Ich habe mich bislang mit den Einsteiger-Tutorials befasst und habe versucht eine gewisse Grundlage zu schaffen, um mich an mein erstes kleines Projekt zu wagen.

Wie schon gesagt, ich bin komplett neu hier und mein Beruf hat überhaupt nichts mit diesem Thema zu tun. Deshalb zerreist mich bitte nicht, wenn ich vieles nicht weiß. Ich bin “stets bemüht” mich einzulesen :slight_smile:

Zu meinem Projekt

Ich möchte mir eine “Zwitscherbox” bauen. Ich verfolge damit natürlich keinen kommerziellen Zweck sondern möchte damit lediglich mein Wissen erweitern und “tüfteln”.

Funktionsweise:

  • Man betritt einen Raum
  • Eine Bewegungsmelder (PIR) registriert die Person
  • Über ein DFPlayer und dazugehörige Lautsprecher wird ein Natursound (Wellenrauschen, Vogelgezwitscher, usw.) abgespielt
  • Nach einer gewissen Zeit soll die Box wieder ausgehen

Wichtige Nebenbedingung:

  • Das ganze soll mit Akkus / Powerbank oder ähnliches Betrieben werden
  • Daher soll möglichst wenig Energie benötigt werden

Stand der Dinge

Benutzte Materialien:

  • Arduino Mega 2560 (habe ich mir zum Üben gekauft)
  • DFPlayer
  • Lautsprecher Visaton VS-FR 7/4
  • PIR HC-SR501
  • MicroSD-Karte
  • Kabel

Sicher funktioniert:

  • Sound wird abgespielt bei Bewegung (PIR) und endet, wenn keine Bewegung mehr registriert wird

Unsicher:

  • Der Arduino geht bei keiner registrierten Bewegung in den Sleep Mode
  • Ich habe den Bewegungsmelder (PIR) als Interrupt gesetzt. Das heißt bei Bewegung sollte er aufwachen

Ich bin mir unsicher, ob der Arduino tatsächlich schläft. Vermute aber, dass er das tut. Es leuchten jedoch weiterhin die entsprechenden LEDs. Ein Oszilloskop habe ich nicht.

Was mir fehlt:

1. Ausschalten der Lautsprecher

  • Auch im Schlafmodus (sofern er funktioniert) “brummen” die Lautsprecher leicht. Ich gehe daher davon aus, dass diese auch aktiv sind, wenn der Arduino schläft.
  • Wie bekomme ich diese “ausgeschaltet”, damit nahezu kein Strom verbraten wird?

2. Versorgung mit Akku / Powerbank

  • Wie versorge ich das ganze letztlich mit Akku etc. ?
  • Was muss ich hier beachten?

3. Wie kann ich den Energieverbrauch weiter verringern?

  • Ich habe keine Ahnung wie lange der Arduino mit DFPlayer + Sensor + Lautsprecher über Batterie betrieben werden können
  • Der Raum wird täglich schätzungsweise ca. 1 Stunde genutzt.
  • Ist meine Programmierung sinnvoll / gut / verbesserungswürdig?
  • Wie kann man sie noch sparender machen

CODE

[code]

#include <avr/sleep.h>    // Sleep Modes
#include <avr/power.h>    // Power management
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

// Benennt die Schnittstelle und legt die PINs für RX und TX fest. Zukünftig verwendet man anstatt den PINs die die Variable 'SchnittstellezumMP3' anstatt immer die PINs zu schreiben
SoftwareSerial SchnittstellezumMP3(10, 11);

// Bezeichnung des MP3Players
DFRobotDFPlayerMini MP3Player;

int Sensor = 20;
int Sensorstatus = LOW;

void setup() {
  pinMode(Sensor, INPUT);
  Serial.begin(9600);

  // Legt die baud-Rate für die Kommunikation auf den RX,TX-PINs fest
  SchnittstellezumMP3.begin(9600);

  // Startet die serielle Kommunikation mit dem MP3 Player durch die oben definierte Funktion vom Arduino zum MP3 über die PINS
  MP3Player.begin(SchnittstellezumMP3);
  delay(3000);

  // Einstellung der Lautstärke zwischen 0 und 30
  MP3Player.volume(1);
  delay(1000);


  Serial.println("------- Programm aktiviert --------");
  delay(1000);

}

void goToSleep() {

  Serial.println("Dann gute Nacht!");
  delay(20);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  attachInterrupt(digitalPinToInterrupt(20), wakeUpNow, HIGH);
  sleep_mode();
  // wake up here
  sleep_disable();
  //delay(200);
  detachInterrupt(digitalPinToInterrupt(20));


  Serial.println("Guten Morgen");
  delay(50);
}

void wakeUpNow() {
  detachInterrupt(digitalPinToInterrupt(18));

  Serial.println("wach");
  //delay(2000);

}

void loop() {
  Serial.println("LOOP");
  // Beginnt das entsprechende Lied abzuspielen. So lange wie in Delay angeben. ABER evtl. Schelcht wegen delay. Vermutlich mit dem if-Befehl besser zu programmieren (siehe 2.)
  MP3Player.play (1);
  delay(4000);
  Serial.println("Bewegt sich was?");
  delay (2000);
  Sensorstatus = digitalRead(Sensor);
  if (Sensorstatus == LOW) {
    Serial.println("Offentsichtlich nicht");
    delay (1000);
    Serial.println("Schlafe in ...");
    delay (1000);
    Serial.println("... 2 ...");
    delay (1000);
    Serial.println("... 1 ...");
    delay (1000);
    goToSleep();
  }

  else {
    Serial.println("Ja");
    delay(2000);
  }

}

[/code]

Musst du schauen, was die Serial.print Ausgaben sagen...
Wenn dann noch Fragen sind, auch hier mitteilen.

1 Like

Was müsste Serial.print ausgeben?

Serial.print gibt nichts aus, bis wieder Bewegung registriert wird. Dann kommt entsprechend "wach" usw.

--> Deshalb gehe ich seither davon aus, dass er auch wirklich schläft. Gibt es, außer den aufgenommen Strom zu messen, eine Möglichkeit dies zu überprüfen? :slight_smile:

Wenn du das nicht siehst, ist die Frage, was nach "Bewegt sich was?" kommt....
Wenn das unerwartet ist, fragst du evtl. zu selten den PIR ab?

Soooo viele Möglichkeiten gibts ja nicht in deinem Sketch ...

1 Like

Ich befürchte wir schreiben etwas aneinander vorbei :slight_smile:
Anhand der Ausgabe am Seriell-Monitor glaube ich, dass es tatsächlich funktioniert und der Arduino schläft. Da die LEDs am Arduino im Sleep Mode ja nicht ausgehen, hat man halt keine direkte Bestätigung darüber, dass jetzt weniger Strom benötigt wird.

Das gibt mein Seriell-Monitor aus:

Bisher erscheint bei Programmbeginn und Bewegung folgendes:

----- Programm aktiviert -----
LOOP

Bei vorliegender Bewegung während des Loops:
Bewegt sich was?
Ja
Loop

Wenn keine Bewegung:

Offensichtlich nicht
Schlafe in ...
...2...
...1...
Dann gute Nacht!

Jetzt hoffe ich, dass er in den Sleep-Mode geht :slight_smile:

Er verbleibt hier so lange bis Bewegung kommt:

wach
Guten Morgen
LOOP
Bewegt sich was?
...
...
...

Aus meiner Sicht müsste daher alles mit dem Sleep Mode und Interrupt funktionieren. Da man es ja leider nicht "visuell" sieht (z.B. daran dass alle LEDs am Arduino ausgehen würden) wollte ich wissen, ob die Programmierung korrekt ist und er tatsächlich wenig Strom dann benötigt.

Aufgrund des Ausgegebenen im Seriell-Monitor gehe ich aber davon aus :slight_smile:

sieht erstmal so aus.
Ich würde einen Pin nehmen und damit VCC des Dfplayer steuern.
Wenn der Arduino schlafen geht erst den Power vom dfplayer weg und ggfls. die LED13 auf dem Board zwangsweise auf LOW stellen.

1 Like

Also einen DigitalPin als OUT und damit den DFPlayer zunächst mit Strom versorgen. Kurz vor dem Schlafen auf LOW?

Das habe ich mir tatsächlich auch schon überlegt. Ich wusste nur nicht, ob ein DigitalPIN einen entsprechenden Strom für diese Lautsprecher zur Verfügung stellen kann (ich habe 20 mA irgendwo gelesen). Ich kann aber nicht abschätzen wieviel Strom der Player und der Lautsprecher benötigen.

Lautsprecher: Visaton FR7, 4 Ohm, 5 Watt.

Ich weiß leider nicht, wie man das berechnet :roll_eyes:

Sorry, ich bin wirklich absoluter Neuling und will mir den Arduino nicht zerschießen. Ich bin auch absolut gewillt mich weiter in die Materie einzulesen. Manchmal benötige ich allerdings gewisse Denkanstöße... :hugs:

Transistor dazwischen.
Nicht direkt den DF da ran. Die Pins sind für max 40mA ausgelegt, aber 20mA je Pin empfohlen und nur je Port nur 100mA und insgesamt nur 200mA als Obergrenze...
ChipDatenblatt https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf Seite 356

1 Like

Wäre folgende Schaltung richtig?

Der Ground des DFplayer verbunden mit dem Collector des Transistors, dann den Emitter mit dem GRD des Arduino.

Von DigitalPIN X zur Basis des Transistors. Dazwischen ein Widerstand? Wenn ja, welcher? Ich habe Beispiele mit 1kOhm gefunden.

Ich habe hier nur aus meinem Starterset den TIP 120-Transistor. Wäre der geeignet?

Vielen herzlichen Dank schon vorab an alle, die bisher geantwortet haben.

Ein Arduino ist nicht wirklich zum Stromsparen gedacht.
Da ist eine Power - LED und der Controller für die USB-Schnittstelle, die nicht schlafen.
Auch der Linear-Regler zwischen Vin und 5V könnte evtl. durch etwas besseres ersetzt werden.
Ein nackter atmega328 in Minimalbeschaltung (evtl. Arduino micro) wäre eine bessere Basis.

Deine Idee "Powerpack" ist auch zweifelhaft. Die sind eher dafür gedacht, relativ schnell ein Händy zu laden und sich abzuschalten, wenn kein (kaum) Strom gebraucht wird.

Wenn du den Lautsprecher direkt an den DFPlayer hängst, wird der wohl kaum seine 5W abgeben. Laut DFPlayer-Datenblatt immerhin 3W. Das wäre > 0,6 A bei 5V.
Da wäre dann schon ein MOSFET der passende Transistor, aber wenn du einen TIP120 rumliegen hast, geht der auch (aber keinen Ersatz dafür besorgen :stuck_out_tongue: ) . Da passte auch der Basis-Widerstand 1k.

1 Like

Zum Schalten des DFPlayers ist besser ein Mosfet (wie @michael_x geschrieben) zu verwenden.
Z.B. entsprechend nachfolgendem Schaltbild.
P-CH-Mosfet-Schalter
Wenn du SMD löten kannst, nimm den gezeigten. Oder einen IRF9520, der ist etwas besser zu verlöten.

1 Like

@michael_x
Yeah :partying_face: Es scheint zu funktionieren. Ich musste natürlich den Code etwas anpassen. Musste natürlich vieles bezüglich des dfplayers vom setup() in loop() übernehmen, da sich der dfplayer vermutlich bei fehlender Stromversorgung resetet?!

Danke nochmal.

Eine Frage bezüglich des Transistors habe ich jedoch noch. Wie wird denn entschieden, welcher Transistor verwendet wird? Also wie "dimensioniere" ich den richtig?
Das gleich gilt für den Vorwiderstand?

@HotSystems und @michael_x :
Warum ist ein MOSFET besser geeignet?

Ich habe übrigens jetzt noch ein Potentiometer zur Regulierung der Lautstärke integriert.

Mit eurer Hilfe bin ich heute deutlich weitergekommen. Danke! :partying_face: :partying_face:

ne.
da nicht rein.
setup ändern, wakeup ändern, neue Funktion für den Start:

void setup()
{
  pinMode(Sensor, INPUT);
  Serial.begin(9600);
  // Legt die baud-Rate für die Kommunikation auf den RX,TX-PINs fest
  SchnittstellezumMP3.begin(9600);
  delay(1000);
  dfPlayerInit();
  Serial.println("------- Programm aktiviert --------");
  delay(1000);
}


void dfPlayerInit()
{
  // Startet die serielle Kommunikation mit dem MP3 Player durch die oben definierte Funktion vom Arduino zum MP3 über die PINS
  MP3Player.begin(SchnittstellezumMP3);
  // Einstellung der Lautstärke zwischen 0 und 30
  MP3Player.volume(1);
}


void wakeUpNow()
{
  detachInterrupt(digitalPinToInterrupt(18));
  Serial.println("wach");
  dfPlayerInit();
  //delay(2000);
}
2 Likes

Bipolar-Transistoren schalten per Basis-Strom, alte Leistungs-Transistoren hatten einen miesen Verstärkungsfaktor und hohe Verluste.
MOSFET schalten per Gate-Spannung. Die Verluste (Leistungsgrenzen) ergeben sich aus dem RDSon - Widerstand.

Meine Faustregel: Bis 100 mA BC337 (2ct + 1 ct für den Widerstand), ab 1A MOSFET.
In deinem Starterkit ist ein TIP120, weil davon noch so viele übrig sind auf der Welt ... :slight_smile:

1 Like

Den Transistor wählst du abhängig vom benötigten Strom und Spannung, sowie ob du + Spannung oder GND schaltest. Einen Mosfet steuerst du mit Spannung, daher ist er in vielen Schaltungen besser geeignet. Und er schaltet die Nutzspannung niederohmiger auf den Verbraucher. Deshalb verlustarmer.

1 Like

Die genannten Typen sind NPN. Für den Pluspol- schalten braucht es PNP bzw P-MOSFETs.

Die meisten Arduino-Modelle sind ungeeignet fürs Stromsparen weil da so viel Elektronik drauf ist die bei sleepmodus des ATmega fröhlich weiter Strom verbraucht.

Nimm einen Arduino MINI oder PRO MINI bzw dessen Nachbau. Da sind keine zusätzlichen Verbraucher drauf. Zum Programmieren braucht Du einen dazugesteckten USB zu Serial adapter.

Grüße Uwe

1 Like