Projekt Modellfeuerwehrauto: Blinken without delay, Lauflicht, später Ton

Hallo, ich bin der Tobi, neu hier und wollte Euch um Hilfe bitten. :D

Ich habe mir im November ein Arduino Uno zugelegt um ein paar Modellbauprojekte zu realisieren. (Standmodelle: Feuerwehr, Hubschrauber, Flugzeug, Schiff mit Licht und Servo funktion :slight_smile: )

Und zwar ist eines davon ein Modellfeuerwehrauto mit Licht und später dann auch mal mit Ton (Martinshorn) ausstatten.

Das Auto soll Scheinwerfer, Rücklichter, Blinker, Blaulicht, Arbeitsscheinwerfer und Geräteraumbeleuchtung haben.

Die Dauerbeleuchtungen; Scheinwerfer, Rücklicht, Geräteraumbeleuchtung und Arbeitsscheinwerfer sind kein Problem. Die möchte ich direkt an die Stromversorgung anschließen.

Mein Problem sind der Blinker und das Blaulicht. Das Blaulicht soll eine Rundumleuchte imitieren. Dazu würde ich LEDs kreisförmig anordnen und mittels Lauflicht ansteuern. Den Blinker würde ich gerne mittels blinken without delay realisieren.

Ich habe hierzu folgeneden Sketch geschrieben:

const int Blinker = 13;   //Warnblinker
const int BL1 = 1;  //BL = Blaulicht Lauflicht
const int BL2 = 2;
const int BL3 = 3;
const int BL4 = 4;
const int BL5 = 5;

int ledState =LOW;
int zeit = 75;
long previousMillis = 0;

long interval = 750;

void setup() {
  pinMode (Blinker, OUTPUT);
  pinMode (1, OUTPUT);
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
}

void loop()
{
  digitalWrite (BL1, HIGH); delay (zeit); digitalWrite (BL1, LOW);
  digitalWrite (BL2, HIGH); delay (zeit); digitalWrite (BL2, LOW);
  digitalWrite (BL3, HIGH); delay (zeit); digitalWrite (BL3, LOW);
  digitalWrite (BL4, HIGH); delay (zeit); digitalWrite (BL4, LOW);
  digitalWrite (BL5, HIGH); delay (zeit); digitalWrite (BL5, LOW);
  
  unsigned long currentMillis = millis();
  
  if (currentMillis - previousMillis > interval){
    previousMillis = currentMillis;
    
    if (ledState == LOW)
    ledState = HIGH;
    else
    ledState = LOW;
    
    digitalWrite (Blinker, ledState);
  }
}

Der Sketch läuft auch, allerdings immer wieder mit Unterbrechungen und ich erkenne nicht, worin das Problem liegt.

Vielleicht könnte mir hier jemand auf die Sprünge helfen oder einen Tipp geben.

Würder Ihr dies auch so realisieren oder gibt es eine noch elegantere Lösung? :relaxed:

Danke und beste Grüße

Tobi 8)

Hallo Tobi und willkommen, endlich mal ein Modellbauer! Ich habe mit einer Hausbeleuchtung und einer Ampel angefangen.

Zunächst mal hast Du schon vieles richtig gemacht :smiley: aber, wie Du schon bemerkt hast, gibt es noch Verbesserungsbedarf. Ich fange vorne an:
const int BL1 = 1; sieht gut aus, aber dann pinMode (1, OUTPUT);
Das funktioniert zufällig, besser wäre es wie beim Blinker.

 digitalWrite (BL1, HIGH); delay (zeit); digitalWrite (BL1, LOW);
  digitalWrite (BL2, HIGH); delay (zeit); digitalWrite (BL2, LOW);
  digitalWrite (BL3, HIGH); delay (zeit); digitalWrite (BL3, LOW);
  digitalWrite (BL4, HIGH); delay (zeit); digitalWrite (BL4, LOW);
  digitalWrite (BL5, HIGH); delay (zeit); digitalWrite (BL5, LOW);

Das ist nun Blinken mit delay, was Du nicht gebrauchen kannst, da Du zwei unabhängige “Blinkzyklen” realisieren möchtest. Ein Lauflicht ist sozusagen nur etwas spezielleres Blinken. Mein Vorschlag: schau Dir hier die zweite Aufgabe an.

Ich habe Dein Programm auf einem ATtiny 4313 (der UNO ist belegt) laufen lassen, sieht besser aus, als ich theoretisch dachte. Meine LEDs haben intergrierte Widerstände!

Feuerwehrauto01.png

hi,

herzlich willkommen im forum.

Du mischt delays mit blinkwithoutdelays. entweder so oder so...

gruß stefan

agmue, Wo sind da die Vorwiderstände für die LED? Bitte nicht gleich was falsches anlernen.
Grüße Uwe

Er sagte bereits das seine LEDs widerstände eingebaut haben.

hi,

wo sagte er das?

gruß stefan

Meine LEDs haben intergrierte Widerstände!

agmue hat das mit den Leds+Widerständen geschrieben. Das hat soweit ich das sehe nichts mit dem TE zu tun. Wobei mir die Teile viel zu teuer wären. Lernen tut man besser mit Leds ohne verbauten Widerstand.

hi,

eben. ich hab' nur den einzigen post der TO gelesen, und da is nix mit widerständen.

frage zum thema: angenommen, led braucht 2,2V und 20 mA. wenn ich jetzt den vorwiderstand berechne, wird der benötigte widerstand immer kleiner, je näher ich an die 2,2V komme. wenn ich bei 2,2V versorgungsspannung ankomme, muß der widerstand 0 ohm sein. aber wer begrenzt dann den strom? das kann doch so nicht hinhauen. wo ist die grenze? 100 ohm? 10 ohm? 1 ohm?

gruß stefan

Das mit den Widerständen in den LED hatte ich übersehen und muß auch zugeben daß ich sie nicht kannte.

@Eisebaer Je kleiner der Vorwiderstand ist desto weniger konstant ist der Strom, wenn die Eingangsspannung sich etwas ändert. Annahme LED zu 2,2V bei 20mA und Widerstand 140 Ohm für I=20mA bei 5V. Es sind ca Werte weil die Durchlaßspannung Uf sich leicht mit dem Strom ändert (Diodenkennlinie). Ich nehme mal an Uf bleibt konstant und vernachläßige auch die Produktionsstreuung der LED. Ich nehme als Widerstände die errechneten Werte und nicht reale Werte aus einer E-Reihe.

Bei 140 Ohm und 5V+/- 0,1V ist der Strom ca 20,71mA bzw 19,29mA Bei 55 Ohm und 3,3V+/-0,1V ist der Strom ca 21,82mA bzw 18,18mA Bei 15 Ohm und 2,5V+/-0,1V ist der Strom ca 26,67mA bzw 13,33mA

Die Grenze ist wie konstant Du die LED leuchten lassen willst. Wenn Du den Widertand für den max- Wert der Spannung berechnest (damit die LED nicht kaputgeht) und dann mit den Schwankungen 10 bis 20 mA hast und für Dich OK ist dann geht da in Ordnung. Hängt alles von Deinen Erfordernissen und der Konstanz der Versorgungspannung ab.

Grüße Uwe

@Eisbaer: Den Strom begrenzt dann die LED. Wenn Du mal eine LED an ein Labornetzteil anschließt, bei dem Du die Spannung fließend einstellen kannst, wirst Du sehen, dass sie immer heller wird, umso mehr Spannung Du anlegst, und überproportional immer mehr Strom zieht, bis sie irgendwann den Hitzetod stirbt; da können 0,2 Volt mehr an Spannung schon mal 50% mehr Strom bedeuten. Prinzipiell gehts aber auch mit 0,1V weniger oder mehr, einhergehend mit weniger oder mehr Strom und Leuchtkraft… Eine LED in einer Fernsehfernbedienung z.B. wird gerne mal über ihrer “normalen” Betriebsspannung betrieben, was sie im Dauerbetrieb wegen der Wärmeentwicklung töten würde, in dem Fall aber funktioniert, weil sie nur kurz pulsieren muss.

@Fire_Minion: Ich skizzier jetzt mal etwas Code, kann ihn aber nicht testen, da ich grade auf Arbeit bin. Hat also keinen Anspruch auf Funktion. :wink:

// Konstante werden nach Konvention immer mit Grossbuchstaben beschriftet
const int BLINKER = 13; // Warnblinker
const int BL1 = 1; // Blaulicht Lauflicht
const int BL2 = 2;
const int BL3 = 3;
const int BL4 = 4;
const int BL5 = 5;

const int BLAULICHTDELAY = 75;
const int BLINKERDELAY = 750;

void setup() {
  pinMode (Blinker, OUTPUT);
  pinMode (BL1, OUTPUT);
  pinMode (BL2, OUTPUT);
  pinMode (BL3, OUTPUT);
  pinMode (BL4, OUTPUT);
  pinMode (BL5, OUTPUT);
}

void loop() {
  digitalWrite (BL1, (millis() / BLAULICHTDELAY) % 5 == 0); // '%' nennt sich "modulo" und ist der Restwert der Ganzzahldivision
  digitalWrite (BL2, (millis() / BLAULICHTDELAY) % 5 == 1);
  digitalWrite (BL3, (millis() / BLAULICHTDELAY) % 5 == 2);
  digitalWrite (BL4, (millis() / BLAULICHTDELAY) % 5 == 3);
  digitalWrite (BL5, (millis() / BLAULICHTDELAY) % 5 == 4);

  digitalWrite (BLINKER, (millis() / BLINKERDELAY) % 2 == 0);
}

Btw, ich hab jetzt mal “const” benutzt, weil Du damit angefangen hast; prinzipiell würde ich bei Konstanten mit “#define” arbeiten, dann wird während des Compilierungsprozesses an der entsprechenden Stelle direkt die Zahl in den Code eingefügt und Du sparst RAM.

Joghurt: Prinzipiell würde ich bei Konstanten mit "#define" arbeiten, dann wird während des Compilierungsprozesses an der entsprechenden Stelle direkt die Zahl in den Code eingefügt und Du sparst RAM.

Probiers mal aus: Der Compiler legt in der Regel (d.h. jedenfalls hier) Konstanten nicht in den RAM und erzeugt den gleichen Code wie bei #define.

const hat den Vorteil, dass eine Typprüfung stattfindet (die leider nur manchmal sinnvoll ist) Dadurch erhöht sich evtl. auch die Chance, dass ein Fehler dort gemeldet wird, wo er tatsächlich (?) ist :

#define PIN WEISS_NOCH_NICHT  // Hier ist kein Fehler
const byte PIN2 = Unklar;  // Hier ist ein Fehler
const char* MSG = "Hello"; // kann nicht als Zahl verwendet werden
const float pi = 3.14159;


void setup() 
{
  pinMode(PIN, OUTPUT); // liefert eine Fehlermeldung hier statt oben
  pinMode(MSG, INPUT);  // Fehler 
  pinMode(pi, INPUT);     // c lässt leider viel Unsinn zu
}
void loop () {}

Macht ja Sinn; die Ersetzung des #define macht ja der Präprozessor vor dem eigentlichen Compilieren, deshalb knallt es auch an der Stelle, wo dann im Endeffekt der Mist drin steht, anders als beim const.

Das der Arduino-Compiler #define (also die eigentlichen Werte) und const-Variablen gleich behandelt ist gut zu wissen, danke. :)

Aber nur bei elementaren Datentypen! Bei Arrays/Strings musst du da etwas weiter ausholen um die ins Flash zu schaffen.

Jo, PROGMEM 8)

uwefed: Das mit den Widerständen in den LED hatte ich übersehen und muß auch zugeben daß ich sie nicht kannte.

Hallo Uwe, dass ich etwas nutze, was Du nicht kennst, hätte ich nicht erwartet. So geht auch mal eine Klitzekleinigkeit zurück. Und weil wir schon mal bei den Nettigkeiten sind: danke für's Moderieren!

An alle anderen: Ich bin faul und leiste mir gerne mal einen kleinen Luxus :grin: Die LEDs mit integriertem Widerstand nutze ich nur auf dem Steckbrett. Ich hatte übrigens wegen der "fehlenden" Widerstände tatsächlich einen Augenblick gezögert. Nun bin ich aber zuversichtlich, dass der Thread-Schreiber es gelesen hat.

Joghurt: @Fire_Minion: Ich skizzier jetzt mal etwas Code, kann ihn aber nicht testen, da ich grade auf Arbeit bin. Hat also keinen Anspruch auf Funktion. :wink:

Getestet: Funktioniert, wenn überall "BLINKER" steht.

agmue: wenn überall "BLINKER" steht

Na, das ist ja nicht Sinn der Sache... ;)

@Fire_Minion: Die Pins 0 und 1 sind für die Schnittstelle zum PC, die lass ich nach Möglichkeit frei, wenns irgendwie geht...

Hallo,

erst mal vielen Dank für die raschen Antworten :-) und Sorry, dass ich mich erst jetzt dazu zu Wort melde, aber ich konnte leider nicht früher. Ich werde mich jetzt mal hinsitzen und in Ruhe alles ausprobieren. Echt Klasse!!! :-) dass hier einem sofort geholfen wird!

Das mit den Widerständen vor den LEDs habe ich schon mitbekommen. Habe bereits etwas Erfahrung mit analogen selbstgebastelten Schaltungen und dabei gleich im Selbstversuch gelernt dass die sonst nur einmal leuchten :-) (dabei auch gelernt dass man bei Kondensatoren auf die Polung achten muss, sonst wirds laut :-) aber aus Fehlern lernt man ja bekanntlich!!)

Fire_Minion: dabei auch gelernt dass man bei Kondensatoren auf die Polung achten muss, sonst wirds laut :-)

Kommt auf den Kondensator an: Bei Tantal- und Elektrolytkondensatoren musst Du aufpassen; Keramik- und Folienkondensatoren ist das wurscht. :D

Hallo, ich weiß es ist schon eine Weile her, aber ich bin leider nicht dazugekommen, die Sache weiter zu verfolgen. Ich habe Eure Vorschläge getestet. Sie haben alle wunderbar funktioniert, nur leider ist die Sache mit dem Aussetzten noch nicht behoben. Ich kann mir leider nicht erklären, wo da der Fehler ist. Kann mir hier jemand nochmals helfen? Das Aussetzten zeigt sich dadurch, dass alle LEDs ausgehen und Pin 13 zwei-drei mal kurz aufblinkt, dann geht alles wieder weiter. Nur leider sieht dieses Aussetzen als Blaulicht doof aus :-(.

@ agmue: ich habe deinen Link mit der zweiten Aufgabe mir mal durchgelesen und versucht auf das Lauflicht zu übertragen, indem ich jeweils die delay Zeiten bei der darauffolgenden LED zugegeben habe, leider funktioniert das gar nicht. Könntest du nochmals darübersehen?