Anfängerfrage bezüglich Modellbahn-Hausbeleuchtung

pussy123:
Ja, ich möchte die erste EIN-Schaltung gerne viel früher als 3 Minuten und 40 Sekunden, z.B. nach 10 Sekunden. Die Schaltlogik wäre mir erstmal egal.

Ich habe den Sketch mal so geändert, dass im setup() die bereits abgelaufene Taktzeit auf 90% der kompletten Taktzeit gesetzt werden kann.

    ledtime[i]= -ledtakt[i]*9/10; // mit negativer Ablaufzeit initialisieren

Dadurch springen die LEDs nun das erste mal nach Ablauf von 10% der jeweiligen Taktzeit an.

Die Led mit einer Taktzeit von 220000L leuchtet also das erste mal nicht erst nach 220 Sekunden, sondern startet bereits nach 22 Sekunden. Danach geht es dann mit dem konfigurierten Schalttakt weiter.

Geänderter Code:

/*  Simulation "belebtes Haus für die Modellbahn" by jurs */
/*  Version "Flimmern nur wenn die Pin-13 LED an ist */
byte pwmFlimmerPin=10; // PWM Pin für das "analoge" Flimmern
unsigned long flimmerStart,flimmerEnd; // Anfangs- und Endzeiten für das Flimmern
// LED Pins für das normale Blinken deklarieren
byte leds[]   ={   9,   11,   12,   13};
// LED Blinktakt in Millisekunden für diese Pins
long ledtakt[]={220000L, 303330L, 500000L, 921000L};
// Variablen zum Merken von millis()-Zeiten beim Schalten/Blinken
unsigned long ledtime[sizeof(leds)];

void setup() {
//  Serial.begin(9600);
  // Alle verwendeten Pins auf OUTPUT setzen
  pinMode(pwmFlimmerPin, OUTPUT);  
  for (int i=0;i<sizeof(leds);i++)
  {
    pinMode(leds[i], OUTPUT);
    ledtime[i]= -ledtakt[i]*9/10; // mit negativer Ablaufzeit initialisieren
  }
}

boolean milliSekundenTakt(long dauer, unsigned long &alterWert) {
// Parameter "dauer": Dauer einer Blinkphase (an bzw. aus)
// Parameter "alterWert": Variable zum Speichern des millis() Timers
// Rückgabewert: true wenn die Zeit bis zum nächsten Umschalten abgelaufen ist, sonst false
  if (millis() - alterWert < dauer) return false;
  while (millis() - alterWert >= dauer) alterWert+=dauer;
  return true;  
}

void blinkenImTakt() {
  
// Alle gleichmäßig blinkenden LEDs in ihrem eigenen Takt blinken lassen  
  for (int i=0;i<sizeof(leds);i++) // alle LEDs in einer Schleife durchgehen
  {
    if (milliSekundenTakt(ledtakt[i],ledtime[i])) // Takt für diese LED abgelaufen?
    {
      digitalWrite(leds[i],!digitalRead(leds[i]));  // wenn ja ==> Umschalten
      if (leds[i]==13 && digitalRead(leds[i])) // Pin-13 LED wurde gerade eingeschaltet
      {
       flimmerStart=ledtime[i]+4000; // Anfangszeit für das Flimmern setzen
       flimmerEnd =ledtime[i]+ledtakt[i]-8000;  // Endzeit für das Flimmern setzen
      }  
//      Serial.print("Pin ");Serial.print(leds[i]);Serial.print(" = ");Serial.println(digitalRead(leds[i]));
    }
  }
}

void flimmernPwmPin() {
// Die flimmernde LED im Zufallsmodus flimmern lassen
  static unsigned long alterWert;
  static int flimmerDauer=200;
  static byte flimmerHelligkeit;
  if (milliSekundenTakt(flimmerDauer,alterWert)) // Takt abgelaufen?
  {
    flimmerDauer=1+random(200); // neue Flimmerdauer als Zufallswert
    if (millis()>flimmerStart && millis()<flimmerEnd)
    {
      flimmerHelligkeit=random(256); // neue Flimmerhelligkeit als Zufallswert
//      Serial.println(flimmerHelligkeit);
    }
    else  
      flimmerHelligkeit=0; // Flimmern aus wenn falsche Zeit zum Flimmern
    analogWrite(pwmFlimmerPin, flimmerHelligkeit); 
  }  
}

void loop() {
  blinkenImTakt();
  flimmernPwmPin();
}

Hallo "jurs",
perfekte Arbeit. Gefällt mir sehr. Vielen, vielen Dank.

Mein Dank geht auch an Herbert ("herbi39"), der mir dieses Forum empfohlen hat.

Gruß
Andreas

Jetzt muss ich das Programm irgendwie auf so ein Attiny bekommen, damit ich diesen dann in mein Modellhaus einbauen kann.
Laut herbie39 reicht ein Attiny45, ein 8poliger IC-Sockel sowie ein Stück Lötstreifenrasterplatine. Ich habe null Ahnung, werde die Sachen erst mal besorgen und mich dann durchgoogeln :o

pussy123:
Jetzt muss ich das Programm irgendwie auf so ein Attiny bekommen, damit ich diesen dann in mein Modellhaus einbauen kann.

Dafür kann man den UNO verwenden. Ich habe das nach dieser Anleitung gelernt. Die Dateien, die nach in das Verzeichnis hardware gehören, müssen zu der Version Deiner IDE passen, bei mir zu IDE 1.5.8 die Dateien in arduino-tiny-0150-0020.zip. Mit dem Googeln würde ich direkt anfangen.

pussy123:
Laut herbie39 reicht ein Attiny45, ein 8poliger IC-Sockel sowie ein Stück Lötstreifenrasterplatine.

ATtiny 45/85 haben fünf nutzbare I/Os, das illuminiert ein Haus ganz ordentlich. Wenn Du Deinen Sketch mit "Board ATtiny 45" kompilieren läßt, siehst Du, ob der Speicher ausreicht. Ich habe mir gleich den größeren '85 im Zehnerpack zugelegt. Bei Reichelt ist der '85 sogar günstiger!

Je mehr Sketche Du schreibst, desto mehr Ideen wirst Du haben. Für beispielsweise Ampelschaltungen oder größere Häuser nehme ich dem ATtiny 2313/4313. Da stehen 17 nutzbare I/Os zur Verfügung, womit auch ein Lauflicht zu realisieren ist. Mittels I2C können die ATtinys sogar untereinander oder mit dem UNO plaudern.

Wenn Du einkaufst könnte auch ein Nullkraftsockel auf der Einkaufsliste stehen, damit die IC-Beinchen schön grade bleiben.

hallo Zusammen,

ich habe dieses Forum entdeckt und wollte mich auch an der Realisierung der Beleuchtung eines "belebten Hauses" versuchen.

Bei meinem Arduino Mega ist es so, dass der Befehl

byte leds[] ={9, 11, 8, 13};

die LED an Pin 8 nicht anspricht. erst als ich auch noch PIN 12 definiert habe, funktioniert der Sketch wie gewünscht.

Gibt es dafür eine Erklärung?

Viele Grüße

Manfred

Hallo Manfred, willkommen im Forum!

N-Tracker:
Gibt es dafür eine Erklärung?

Ich habe den Sketch aus #80 auf meinen Mega2560 geladen. Ich sehe keinen Unterschied, ob nun Pin12 oder Pin8 benutzt wird. Der Fehler muß also woanders liegen.

Möglicherweise hilft ein Foto von Deinem Aufbau.

Hallo agmue,

ich werde einmal ein Foto machen, allerdings kann ich durchaus bei meinem Aufbau mit dem Beispielsketch "blink" jede LED einzeln ansteuern. Der Threaderöffner hat auf seiner HP einen Sketch verlinkt, den ich benutzt habe: Belebtes Haus - Herberts-Spur N-Projekt
Damit habe ich die Probleme. Ich werde einmal den Code aus 80 probieren.
Zwischenzeitlich schon einmal recht herzlichen Dank für die angebotene Hilfe.

Manfred

Auch der Sketch aus dem Internetlink zeigt bei mir ein "belebtes Haus".

Hallo agmue,

auch für PIN 12? Ich habe mir dem seriellen Monitor eingeschaltet und sehe alle PINS bis auf die 12.
Morgen werde ich ein foto machen und einstellen.
Noch eine Frage: zum Programmieren eines ATTINY braucht es ja einen Kondensator. Was passiert eigentlich wenn die Kapazität über 10uF liegt?

Manfred

N-Tracker:
auch für PIN 12? Ich habe mir dem seriellen Monitor eingeschaltet und sehe alle PINS bis auf die 12.

Ja, auch Pin12.

Pin 9 = 1
Pin 11 = 1
Pin 12 = 1
Pin 13 = 1
Pin 9 = 0
Pin 11 = 0
Pin 9 = 1
Pin 12 = 0

Hallo agmue,

nochmals vielen Dank für Deine Mühe

serieller Monitor.JPG

der sketch aus 80 läuft einwandfrei

Nun habe auch ich die fehlerhafte Kombination entdeckt: Sketch aus dem Internet und byte leds[] = {9, 11, 12, 13}; funktioniert nicht!

Wenn ich die Zeiten auf long ledtakt[] = {22000, 30333, 1000, 92100}; ändere, blinkt auch LED12. Es muß also mit der Größe der Werte zu tun haben.

Bist Du auch mit dem funktionierenden Sketch aus #80 glücklich?

ja, den finde ich sogar realistischer als die kurzen Leuchtzyklen im Link. Bin als blutiger Anfänger beruhigt, dass das Problem nicht meinem Intellekt geschuldet ist :wink:

N-Tracker:
Bin als blutiger Anfänger beruhigt, dass das Problem nicht meinem Intellekt geschuldet ist :wink:

Da hast Du mein Verständnis :slight_smile:

Den Sketch von #80 habe ich geringfügig für den ATtiny85 angepaßt und ausprobiert:

Der Sketch verwendet 2.030 Bytes (24%) des Programmspeicherplatzes. Das Maximum sind 8.192 Bytes.
Globale Variablen verwenden 65 Bytes (12%) des dynamischen Speichers, 447 Bytes für lokale Variablen verbleiben. Das Maximum sind 512 Bytes.

Würde also auch in einen ATtiny4313 passen.

Die auf dem Foto abgebildeten LEDs haben eingebaute Vorwiderstände!BelebtesHaus.png
Mein Freund erzählt mit dem Licht Geschichten: Frau steht auf, Licht im Schlafzimmer, kurz darauf im Bad. Licht in der Küche geht an, Licht im Schlafzimmer aus ...

Test_Forum.ino (2.91 KB)

Hallo,

ich habe nunmehr den Sketch zu meiner Zufriedenheit dem Mega zum Laufen gebracht.
Jetzt verzweifle ich allerdings beim Brennen auf einen Attiny. Bereits beim Bootloader erhalte ich folgendes:

"Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -v -v -v -pattiny45 -cstk500v1 -PCOM7 -b19200 -e -Uefuse:w:0xff:m -Uhfuse:w:0xdf:m -Ulfuse:w:0x62:m

avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch

System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

Using Port : COM7
Using Programmer : stk500v1
Overriding Baud Rate : 19200
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Send: 0 [30] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
AVR Part : ATtiny45
Chip Erase delay : 4500 us
PAGEL : P00
BS2 : P00
RESET disposition : possible i/o
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


eeprom 65 6 4 0 no 256 4 0 4000 4500 0xff 0xff
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


flash 65 6 32 0 yes 4096 64 64 4500 4500 0xff 0xff
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack


calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00

Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
avrdude: Send: A [41] . [80] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [02]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [81] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [01]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [82] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [12]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [98] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
avrdude: Send: A [41] . [84] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [85] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [86] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [87] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [89] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us

avrdude: Send: A [41] . [81] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [01]
avrdude: Recv: . [10]
avrdude: Send: A [41] . [82] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [12]
avrdude: Recv: . [10]
avrdude: Send: B [42] . [14] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [ff] . [ff] . [ff] . [ff] . [00] @ [40] . [01] . [00] . [00] . [00] . [10] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
avrdude: PAGEL and BS2 signals not defined in the configuration file for part ATtiny45, using dummy values
avrdude: Send: E [45] . [05] . [04] . [d7] . [a0] . [01] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
avrdude: Send: P [50] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################################## | 100% 0.02s

avrdude: Device signature = 0x000000 (retrying)

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################################## | 100% 0.02s

avrdude: Device signature = 0x000000 (retrying)

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [00]
avrdude: Recv: . [10]
################################## | 100% 0.02s

avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

avrdude: Send: Q [51] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]

avrdude done. Thank you.

Fehler beim Brennen des Bootloaders."

was mache ich falsch?

LG Manfred

Bei mir sieht das so aus:

avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [1e]
avrdude: Recv: . [10]
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [92]
avrdude: Recv: . [10]
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [06]
avrdude: Recv: . [10]
################################## | 100% 0.05s

avrdude: Device signature = 0x1e9206
avrdude: Send: Q [51] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]

avrdude done. Thank you.

Hallo,

ich muss mich jetzt auch erst einmal als absoluter Anfänger outen.

meine Frage ist denke ehr allgemein, da ich aber ebenfalls die Hausbeleuchtung realisieren will und das Problem mit dem hier angebotenen Code auftritt, stelle ich mal in diesem Thema die Frage.

Warum machen die Ausgänge genau das Gegenteil?

Also, es ist mir bei der Fernsehsimulation aufgefallen. Diese "flimmer" LED leuchtet ständig, lediglich wenn LED 13 aus ist, flimmer die LED an PIN 10. Ist die 13 an, so ist auch die 10 an.

Da ich da nicht durchgeblickt habe, hab ich mal dieses "Blinki" hoch geladen. Auch da ist es genau verkehrt rum. Also Board LED AN - LED 13 AUS, Board LED AUS - LED 13 AN.

Was übersehe ich hier? Weis auch nicht so genau nach was ich suchen soll, konnte jedenfalls nix wirklich aufschlussreiches finden.

Aufbau auf Steckboard, Arduino NANO, Stromversorgung über USB - Notebook

Bitte entschuldigt, wenn das blöd rüber kommt, aber mir fehlen total die Lösungsansätze.

Ach so, mein Englisch lässt übrigens auch sehr zu wünschen übrig.

Gruß
Stefan

Das kommt darauf an wie herum man die LEDs anschließt. Der Strom kann sowohl in einen Pin hinein fließen, als auch heraus. Im ersten Fall ist die LED bei Low an. Auf dem Arduino ist es egal wie herum man das macht, aber Ausgänge als Stromsenken zu betreiben ist in der Elektronik normal und manchmal geht es nur so (z.B. Open Collector Ausgänge).

Man kann die Funktion aber auch einfach im Code herumdrehen.

US-Bahner:
Warum machen die Ausgänge genau das Gegenteil?

Ausgänge machen immer(!) das, was programmiert ist!

Du müßtest aber auch beachten, dass das D in LED für "Diode" steht: In einer Richtung läßt die LEDiode den Strrom durch und leuchtet, in der anderen Richtung sperrt sie den Strom und bleibt dunkel.

Bei Verpolung von Anode und Kathode kann ggf. durchaus der Effekt auftreten, dass sie gegenteilig leuichret. Es gibt insgesamt vier Möglichkeiten, und nur bei einer leuchtet die LED

Anode HIGH und Kathode HIGH ==> leuchtet nicht (gleiches Potential, kein Stromfluß)
Anode LOW und Kathode LOW ==> leuchtet nicht (gleiches Potential, kein Stromfluß)
Anode LOW und Kathode HIGH ==> leuchtet nicht ("Sperrrichtung")
Anode HIGH und Kathode LOW ==> leuchtet (Strom fließt in "Durchlassrichtung")

Wenn man LEDs "irgendwie nach Zufallsprinzip anschließt, ist die Chance auf einen korrekten Anschluss allenfalls bei 25%