RE: Arduino - Beleuchtung eines Bahnstellwerks

#1 von Bierrudl , 13.04.2015 22:00

Einen schönen guten Abend an das Forum,

inspiriert durch das "Belebte Haus" von Herbert und durch die tatkräftige Unterstützung verschiedener Forenmitglieder habe ich inzwischen die ersten "Gehversuche" mit dem Arduino und Attiny hinter mir und einige kleinere Projekte erfolgreich abgeschlossen.

Aktuell arbeite ich am Bahnstellwerk. Die Räume wurden mit Leds bestückt, die nach dem Zufallsprinzip ein- und ausschalten. Auf dem "Balkon" steht ein Bahnwärter, der eine Laterne hält (angeklebte smd-Led), die blinkt.
Das Ganze habe ich mittels Arduino (Version 1.0.5-r2) und Attiny 85 programmiert.

Nachstehend der Sketch (die Ausgänge für led1 - led4 sind bereits für den Attiny):

/* Bahnhofstellwerk mit Blinken für Bahnwärter und Ein-/Ausschalten für Erdgeschoss */


int led1 = 0;
int led2 = 1;
int led3 = 2;
int led4 = 3;


void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}

void loop () {
Bahnwaerter();
Erdgeschoss();
}

void Bahnwaerter() {
digitalWrite(led1, HIGH);
delay(1000);
digitalWrite(led1, LOW);
delay(1000);
}

void Erdgeschoss() {
if (random(1500) < 900)
digitalWrite(led2, HIGH);
else
digitalWrite(led2, LOW);
delay(1500);
if (random(2000) < 1000)
digitalWrite(led3, HIGH);
else
digitalWrite(led3, LOW);
delay(500);
if (random(1000) < 500)
digitalWrite(led4, HIGH);
else
digitalWrite(led4, LOW);
delay(1500);
}

Der Sketch funktioniert soweit auch ganz gut.

Einen Punkt würde ich gerne verbessern wollen, soweit das möglich ist. Die "Delays" beim void "Erdgeschoss" sind relativ kurz, d.h. die Leds schalten entsprechend zügig, was etwas unrealistisch wirkt. Wenn ich bei den "Delays" höhere Werte eingebe, entsteht dadurch eine nicht gewollte Verzögerung beim Blinkintervall beim void "Bahnwärter".
Ist es möglich, das Programm so zu gestalten, dass die beiden voids unabhängig voneinander arbeiten? Das ist meine Frage an die Experten.

Im Voraus ein großes Dankeschön für Eure Hilfe.

Einen schönen Abend wünscht

Bierrudl


Bierrudl  
Bierrudl
S-Bahn (S)
Beiträge: 16
Registriert am: 23.12.2012


RE: Arduino - Beleuchtung eines Bahnstellwerks

#2 von digi_thomas2003 , 13.04.2015 22:30

Hallo,

auf der Aduino HP findest Du im Playground ein Tutorial "Blinken ohne delay":
http://playground.arduino.cc/Learning/BlinkWithoutDelayDe

Da wird genau beschrieben, wie Du unter Nutzung der Funktion millis() das delay vermeiden kannst.

Freundliche Grüße
Thomas


Thomas
------------------
Anlage H0: U-Form, im kreativen Bau
Fahren: Tams MC
Schalten: IB
Melden: HSI 88
Steuern: TrainController 9.0 Gold
Denken: Brain 4.1


 
digi_thomas2003
InterRegioExpress (IRE)
Beiträge: 305
Registriert am: 03.05.2005
Gleise sind vorhanden
Spurweite H0
Steuerung TrainController
Stromart AC, Digital


RE: Arduino - Beleuchtung eines Bahnstellwerks

#3 von spielbahn ( gelöscht ) , 13.04.2015 23:58

Hallo!

Wie Thomas schon schrieb: Nie mit delay(), wenn mehrere Dinge parallel laufen sollen.


spielbahn

RE: Arduino - Beleuchtung eines Bahnstellwerks

#4 von Bierrudl , 14.04.2015 21:25

Vielen Dank Thomas und Uli für Eure Tipps.
Ihr habt mich auf den richtigen Weg gebracht.
Ich habe meinen Sketch umgearbeitet (und dabei etwas von Herberts "Belebtes Haus" abgekupfert).
Jetzt funktionierts so, wie ich mir das vorgestellt habe.

Nochmals vielen Dank und einen schönen Abend wünscht

Bierrudl


Bierrudl  
Bierrudl
S-Bahn (S)
Beiträge: 16
Registriert am: 23.12.2012


RE: Arduino - Beleuchtung eines Bahnstellwerks

#5 von spielbahn ( gelöscht ) , 19.04.2015 12:44

Ich habe hierzu einen Sketch-Vorschlag, mit welchem sich die LEDs abwechslungsreicher schalten lassen. Die Funktion millis() dient dazu, die Variablen tick[] in 1/10-Sekundenschritten hochzuzählen.Je nach Zählerstand der einzelnen Variablen können nun Schaltereignisse programmiert werden.

/* Blinken und Schalten ohne delay()
*
*/
unsigned long altmillis;
// in folgendem Array stehen die Pins der LEDs, beim UNO z.B. max 20 von 0 bis 19
byte ledPin[]={2,4,6,8,10,12};
const byte tickZahl=sizeof(ledPin);
//Falls als maximale Zeit 25 Sekunden reichen, kann tick[] auch als byte deklariert werden
int tick[tickZahl];

void setup(){
for(byte x=0;x<tickZahl;x++){
pinMode(ledPin[x],OUTPUT);
}
}

void loop(){
//ticks im 0,1-Sekundentakt hochzählen
if(millis() - altmillis > 99){
altmillis=millis();
for(byte x=0;x<tickZahl;x++){
tick[x]++;
}
}
//Blinken
if(tick[0]==10){
tick[0]=0;
digitalWrite(ledPin[0],!digitalRead(ledPin[0]));
}
//Ein- Ausschalten
if(tick[1]==30){
digitalWrite(ledPin[1],HIGH);
}
if(tick[1]>40){
tick[1]=0;
digitalWrite(ledPin[1],LOW);
}
//Ein- Ausschalten abhängig vom Zufall
if(tick[2]==20 && random(2)<1){
digitalWrite(ledPin[2],HIGH);
}
if(tick[2]>100){
tick[2]=0;
digitalWrite(ledPin[2],LOW);
}
//Blinksequenz
if(tick[3]==1){
digitalWrite(ledPin[3],HIGH);
}
if(tick[3]==2){
digitalWrite(ledPin[3],LOW);
}
if(tick[3]==3){
digitalWrite(ledPin[3],HIGH);
}
if(tick[3]==4){
digitalWrite(ledPin[3],LOW);
}
if(tick[3]>9){
tick[3]=0;
}
//Ein- Ausschalten mit Zufall
if(tick[4]==100){
digitalWrite(ledPin[4],HIGH);
}
if(tick[4]>300 && random(3)<1){
tick[4]=0;
digitalWrite(ledPin[4],LOW);
}
//Blinken in Abhängigkeit von LED4
if(tick[5]==1 && digitalRead(ledPin[4])==HIGH){
digitalWrite(ledPin[5],HIGH);
}
if(tick[5]>2){
tick[5]=0;
digitalWrite(ledPin[5],LOW);
}

}


spielbahn

RE: Arduino - Beleuchtung eines Bahnstellwerks

#6 von moppe , 20.04.2015 22:52

"Multikonfigurierbar", 16 Ausgänge jeder mit seiner eigenen Zeitdauer

// Anzahl vairabeln in array.
int pinCount = 16;


// Welcher pins sind genutzt als ausgang
int ledPin []= {2,3,4,5,6,7,8,9,10,11,12,A0,A1,A2,A3,A4};

// Minimum und maximum zein "on" jeder ausgang
unsigned long ledontimermin [] = {3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000 };
unsigned long ledontimermax [] = {16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000, 16000 };

// Minimum und maximum zein "of" jeder ausgang
unsigned long ledofftimermin [] = {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000 };
unsigned long ledofftimermax [] = {10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000};

// Alle LED's an
int ledState [] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};


long currentMillis [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
long previousMillis [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
long interval [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};



void setup() {
// Setzen alle pins als ausgang
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPin[thisPin], OUTPUT);
}

// Seeding zufalls generator
randomSeed(analogRead(A5));
}


void loop(){
// Laufen durch der array
for (int thisPin = 0; thisPin < pinCount; thisPin++) {

// currentMillis für jeder ausgang
currentMillis[thisPin] = millis();

// Ist es zeit für der ausgang sich zu ändern?
if(currentMillis[thisPin] - previousMillis[thisPin] > interval[thisPin]) {

previousMillis[thisPin] = currentMillis[thisPin];

// Ob der ausgang sin aus geht es an
if (ledState[thisPin] == LOW)
{ledState[thisPin] = HIGH;

// Neuer zufallswert zwischen ledontimermin und ledontimermax
interval[thisPin] = random(ledontimermin[thisPin],ledontimermax[thisPin]);}

else {ledState[thisPin] = LOW;

// Neuer zufallswert zwischen ledofftimermin und ledofftimermax
interval[thisPin] = random(ledofftimermin[thisPin],ledofftimermax[thisPin]);}

// Udgangen sættes med værdien af ledState (HIGH/LOW):
digitalWrite(ledPin[thisPin], ledState[thisPin]);


Klaus


"Meine" Modellbahn:http://www.modelbaneeuropa.dk
Dänisches Bahnforum: http://www.baneforum.dk
PIKO C4 "Horror Gallery": http://moppe.dk/PIKOC4.html


 
moppe
Trans Europ Express (TEE)
Beiträge: 8.729
Registriert am: 07.08.2011
Homepage: Link
Ort: Norddeusche halbinsel
Gleise Roco, PECO, Märklin/Trix, PIKO,
Spurweite H0, H0e, N, Z
Steuerung Z21, Lenz, MpC Gahler+Ringsmeier, Games on Track/Faller
Stromart AC, DC, Digital, Analog


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz