Vorstellung und erste Fragen zur Selbstabschaltung (Transistorschaltung)

Hallo in Forum!
Ich bin Thomas, 37 Jahre und wohne an der holländischen Grenze. Ich bin Arduino-Neuling. Vor zwei Jahren habe ich eine kurze Einführng mit Bascom und dem Tiny13 bekommen. Jetzt habe ich mich endlich dazu durchgerungen einen Arduino zu kaufen. Ich bin begeister, wie leicht der Umgang damit ist. So langsam treffen auch die kleinen Varianten aus China ein und ich freu mir nen Keks. Mein erster TV B Gone läuft (leider nicht durch Glasscheiben durch) und ich bin angefixt. Gegenwärtig suche ich mir noch Teile aus verschiedenen Sketches raus und verbinde / verändere sie. Zum eigenständigen SChreiben reicht es noch nicht ganz.
Meine aktuelle Bastelei ist ein Blaulicht mit Sirene für ein Playmobilauto meines Sohnes. Das Heulen und Blinken geht auch super. Nur soll der Arduino nicht ständig an der Batterie hängen, da die dann irgendwann leer ist. Ein Kippschalter wird vom sohn nicht immer ausgeschaltet, deshalb soll der Arduino über einen Taster aktiviert werden und nach einer bestimmten Zeit wieder ausgehen. Aus einem anderen Fricklerforum kam der Tip, einen Transistor zwischen Batterie und Arduino zu häckeln. Das habe ich auch mit einem BC 547 versucht, es läuft aber nicht. Gerne lade ich die komplette Schaltung und das Programm hoch, der Einfachheit halber füge ich aber erstmal das Schema der Transistorschaltung ein. Wenn das Arduino startet soll Pin 7 für X Durchläufe des Blaulichts anbleiben. Kann mir irgend jemand helfen?
Vielen Dank,
Thomas

Was ist es für ein Transistor?

So wird es nicht funktionieren, da die Basis ja keine Spannung bekommt, kann der Transistor nicht durchschalten. Damit erhält der Uno auch keine Spannung.
Eine einfache Lösung wäre mit zwei Dioden, eine in Serie zum Basiswiderstand. Katode an Widerstand, Anode an Arduino. Die zweite Diode Katode an Widerstand + Katode der ersten Diode und Anode über einen Taster an Pluspol der Batterie.

Wenn der Taster lange genug gedrückt wird, startet Arduino und über Port D7 bekommt der Transistor Spannung (wenn Sketch richtig funktioniert ist). Ist die Zeit um, Port D7 auf LOW und Arduino geht aus.

Hallo HotSystems!
Ich habe einen NPN BC 547 und einen PNP BC328 ausprobiert. Stimmt, das habe ich nicht verzeichnet / beschrieben. Über einen Taster habe ich den Transistor kurzzeitig gebrückt. Dann läuft das Prg durch. Ich hatte die Hoffnung, dass nach dem Brücken der Transistor durchschaltet und den Arduino für die definierte Zeit bestromt.
Ich füge zum (hoffentlich) besseren Verständnis das Programm mal ein:

/*
 Blink
 Wechselblinker (je 3x). Dauerschleife.
 Ton wechselt nachdem beide LEDs durchgelaufen sind.
 Zwei unterschiedlcihe Sketche aus dem Netz verbunden.
 Ach ja, laüft mit Taster

 This example code is in the public domain.
*/

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led1 = 8;
int led2 = 9;
int speaker = 10;
int transe = 7;
int hiNote = 659;
int lowNote = 440;
int ledDelay = 60;
int tone_number = 0;
int loop_number = 0;
// TODO check and see how to do this with a buffer
// TODO arduino timer library

// the setup routine runs once when you press reset:
void setup() {                
 // initialize the digital pin as an output.
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);        
 pinMode(speaker, OUTPUT);    
 pinMode (transe, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite (speaker, LOW);
 digitalWrite(transe, LOW);

}


void loop() {
for (int i=0; i<1000; i++){
digitalWrite(transe, HIGH);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);


digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);


digitalWrite(transe, LOW);
if (loop_number >= 1){
   loop_number = 0;
   changeTone();  
   }
 loop_number++;
// GPIO to flip switch to turn off siren and lights
}
}

void changeTone()
{
 tone_number = !tone_number;
  if (tone_number) {
   tone(speaker, lowNote, 1000);
   } else {
   tone(speaker, hiNote, 1000);
 }

}

Ist das Einfügen so ok, oder gibt es da irgendwelche Tricks?

Setze deinen Sketch bitte in Code-Tags (Button </>), das geht auch noch nachträglich.
So kann man das nicht lesen.

/*
 Blink
 Wechselblinker (je 3x). Dauerschleife.
 Ton wechselt nachdem beide LEDs durchgelaufen sind.
 Zwei unterschiedlcihe Sketche aus dem Netz verbunden.
 Ach ja, laüft mit Taster

 This example code is in the public domain.
*/

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led1 = 8;
int led2 = 9;
int speaker = 10;
int transe = 7;
int hiNote = 659;
int lowNote = 440;
int ledDelay = 60;
int tone_number = 0;
int loop_number = 0;
// TODO check and see how to do this with a buffer
// TODO arduino timer library

// the setup routine runs once when you press reset:
void setup() {                
 // initialize the digital pin as an output.
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);        
 pinMode(speaker, OUTPUT);    
 pinMode (transe, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite (speaker, LOW);
 digitalWrite(transe, LOW);

}


void loop() {
for (int i=0; i<1000; i++){
digitalWrite(transe, HIGH);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);


digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);


digitalWrite(transe, LOW);
if (loop_number >= 1){
   loop_number = 0;
   changeTone();  
   }
 loop_number++;
// GPIO to flip switch to turn off siren and lights
}
}

void changeTone()
{
 tone_number = !tone_number;
  if (tone_number) {
   tone(speaker, lowNote, 1000);
   } else {
   tone(speaker, hiNote, 1000);
 }

}

Ich hoffe, dass es jetzt geht. Leider kann ich hier nur wenige Posts innerhalb von 5 Minuten machen. Liegt vielleicht am neuen Account?

Warum nochmal das selbe?

Wenn du die Schaltfläche "Preview" klickst, hast du eine Vorschau.

Ansonsten "How to use this forum - please read. "
Und nimm bitte eine aussagekräftige Überschrift für deinen Thread.

Und du kannst den vorhandenen Sketch direkt bearbeiten oder wieder löschen.

Ich bin am Tablet und habe nur viele delays gesehen. und du willst Sirene, Blinklicht und automatisches Ausschalten. Das mag quick n dirty gerade noch so zusammengehen, ist aber eher suboptimal.

Aber welches konkrete Problem hast du nun damit?

und wie ein npn beschaltet wird, weisst du schon?

Du verwendest sehr viele "delays", das ist nicht gerade optimal.

Setze digitalWrite(transe, HIGH);" in das Setup.

Und digitalWrite(transe, LOW);
außerhalb der for-Schleife, damit der Uno danach wieder ausschaltet.

Und optimal ist es mit dem NPN auch nicht. Ich würde dafür einen P-Kanal Mosfet einsetzen.

HotSystems:
Ich würde dafür einen P-Kanal Mosfet einsetzen.

Das ist doch nur für ein Spielzeugauto.

Mit einem NPN geht es aber so wie gezeigt nicht. Um die Betriebsspannung zu schalten braucht man einen PNP/P-FET. Und dann wie üblich einen NPN um die Basis- bzw. Gatespannung auf 9V anzuheben.

Serenifly:
Mit einem NPN geht es aber so wie gezeigt nicht. Um die Betriebsspannung zu schalten braucht man einen PNP/P-FET

Deswegen ja meine Frage in Post 6. Aber weiter oben schrieb der TE, dass er es auch mit pnp probierte.

Na ja, so wie die Schaltung aussieht hat er den PNP auch falsch angeschlossen.

eben. oder halt falsch gezeichnet. aber bis dato kenne ich das konkrete Problem immer noch nicht.

ElEspanol:
Das ist doch nur für ein Spielzeugauto.

Das ist doch kein Problem, oder?
Für kleine Dinge verwende ich den IRLML6402

ElEspanol:
eben. oder halt falsch gezeichnet. aber bis dato kenne ich das konkrete Problem immer noch nicht.

Hat er doch beschrieben. Allerdings in zwei Steps.

Hallo,

ich verweise mal kurzerhand auf den AVR Transistortester.
http://www.mikrocontroller.net/articles/AVR-Transistortester#Hardware

Hier sieht man genau für das Problem die Beschaltung und weiter unten die Beschreibung dafür.
Per Taster ein und nach einer gewissen Zeit schaltet er sich selbst ab.
Den 5V Spannungsregler brauchste ja nicht. Bleibt außen vor. Gehst von Batterie über den PNP zu VIN. Der Spannungsregler sitzt ja auf dem Arduino der dann den Rest macht.

Du kannst mit nur einem Transistor keine vernünftige Spannungsabschaltung machen.
Du brauchst einen PNP, der die Batterie schaltet, und einen zweiten (NPN) mit Massebezug, der die Logik übernimmt.

Hier der Schaltplan:
Ubatt-Schalter_mit_Selbsthaltung.jpg

Wenn der Taster gedrückt wird, wird Q2 bestromt, der dann Q1 durchsteuert, worauf VIN auf 9V steigt.
VIN wiederum hält nun über R4 Q2 leitend, der Taster kann wieder losgelassen werden. D7 bleibt auf INPUT.
Zum Abschalten wird D7 als OUTPUT deklariert und auf LOW gesetzt.

Und hier noch als Steckbrett, falls dir das Schaltplanlesen schwer fällt. Aber gewöhne dich an Schaltpläne, die sich besser zu lesen.
Ubatt-Schalter_mit_Selbsthaltung_Steckbrett.jpg

Für mich ist Aus, wenn es klack macht, daher würde ich ein Subminiatur- oder Reedrelais mit Selbsthaltung per Sketch wählen. Bei einem Relais mit Diode kann die eingezeichnete entfallen. Schaltung:
Selbsthaltung.png

Mein bisher kleinster Sketch hier im Forum:

#define selbsthaltungPin     7    // 
const unsigned long abschaltzeit = 60000UL;

void setup() {
  pinMode(selbsthaltungPin, OUTPUT);
  digitalWrite(selbsthaltungPin, HIGH);
}

void loop() {
  if (millis() > abschaltzeit) {
    digitalWrite(selbsthaltungPin, LOW);
  }
}

@ Alle: Danke schon mal für die vielen Hinweise und den vielen Hirnschmalz, den ihr für mich verwendet!
@ guntherb: Das kommt meiner Idealvorstellung sehr nahe und ich habe vor allen Dingen alle Bauteile dafür hier. Danke für den Schaltplan (noch etwas fremd, aber ich kann ihn lesen), die gute Erklärung und die Skizze!
@ agmue: Auch ein interessanter Plan, scheitert gegenwärtig noch am Reedrelais. Das wird bei der nächsten Bestellung mitgeordert und die Schaltung ausprobiert. Danke hierfür!

Leider habe ich schon wieder eine Frage.
Gunter schreibt:
"D7 bleibt auf INPUT. Zum Abschalten wird D7 als OUTPUT deklariert und auf LOW gesetzt."

Ich kann den Pin im Setup deklarieren --> pinMode (Pin7, INPUT);
Wie kann ich den Pin innerhalb des Sketches umdeklarieren? Habe ich einen Knoten im Kopf, oder ist das einfach nur mehr als ich nach meinem Einsteiger-Tutorial weiß?
Viele Grüße,
Thomas

pinMode() ist eine ganz normale Funktion. Die kannst du nicht nur in setup() aufrufen