Pages: [1]   Go Down
Author Topic: LED bei ein/aus langsam ein- und ausblenden  (Read 841 times)
0 Members and 1 Guest are viewing this topic.
Hessen
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich bin neu dabei und habe leider auch schon das erste Problem, auch nach 3 Tagen Recherche im Netz komme ich nicht weiter.

Ich möchte für eine Signalsteuerung (Modellbahn) die angeschlossenen LED beim Einschalten langsam heller werden lassen und beim Ausschalten sollen sie auch langsam wieder erlöschen. Die Zeit zum auf und abblenden sollte nachher ca. 1500 -2000 ms betragen. Der Sketch steht soweit dass über 3 Taster die Signalbilder geschaltet werden können. Später werden die Taster durch Optokoppler ersetzt.

Der Sketch ist sehr einfach, bildet aber die Grundlage für eine Vorbildgerechte Ansteuerung eines Lichtsignals.

Vielleicht kann mir jemand verraten wie ich ab hier weiter machen muß.

Gruß,

Ingo

Quote
/**************************************************
* Autor: Ingo Mögling                              *
* Mai 2013                                         *
* Beschreibung                                     *
* Sketch zum steuern eine Lichthauptsignals        *
* mit mehreren LEDs                                *
* http://www.arduino-tutorial.de/schaltungen/
* http://www.youtube.com/watch?v=ZOtfcejS21c       *
* http://books.google.de/books?id=LiGw4IhN0RUC&pg= *
***************************************************/

int led1 = 3;        // integer variable ledPin1 rot
int led2 = 5;        // integer variable ledPin2 gelb
int led3 = 6;        // integer variable ledPin3 grün


int buttonPin1 = 10;    // integer variable buttonPin1 Hp0
int buttonPin2 = 11;    // integer variable buttonPin2 Hp2
int buttonPin3 = 12;    // integer variable buttonPin3 Hp1

void setup() {
  // pinMode(led1,OUTPUT);    // Pin3 ist jetzt ein Ausgang
  // pinMode(led2,OUTPUT);    // Pin5 ist jetzt ein Ausgang
  // pinMode(led3,OUTPUT);    // Pin6 ist jetzt ein Ausgang
  pinMode(buttonPin1,INPUT);   // Pin10 ist jetzt ein Eingang
  pinMode(buttonPin2,INPUT);   // Pin11 ist jetzt ein Eingang
  pinMode(buttonPin3,INPUT);   // Pin12 ist jetzt ein Eingang
  analogWrite(led1,HIGH);      //LEDrot ist zum Start ein
}

void loop(){
  
  if (digitalRead(buttonPin1)==HIGH)
  if (digitalRead(buttonPin2)==LOW)
  if (digitalRead(buttonPin3)==LOW)
  {
      analogWrite(led1,HIGH);      //LEDrot ist an
      analogWrite(led2, LOW);      //LEDgelb ist aus
      analogWrite(led3, LOW);      //LEDgrün ist aus
     
  } 
    {
  if (digitalRead(buttonPin2)==HIGH)
  if (digitalRead(buttonPin1)==LOW)
  if (digitalRead(buttonPin3)==LOW)
  
  {
      analogWrite(led1,LOW);        //LEDrot ist aus
      analogWrite(led2,HIGH);       //LEDgelb ist an
      analogWrite(led3,HIGH);       //LEDgrün ist an
  }
    {
  if (digitalRead(buttonPin3)==HIGH)
  if (digitalRead(buttonPin1)==LOW)
  if (digitalRead(buttonPin2)==LOW)
  
  {
      analogWrite(led1,LOW);        //LEDrot ist aus
      analogWrite(led2,LOW);        //LEDgelb ist aus
      analogWrite(led3,HIGH);       //LEDgrün ist an
    }
   } 
  } 
 }


Logged

Meine Interessen: Meine POLA Homepage, Modellbahn, Computer, Norwergische Waldkatzen und jetzt noch Arduinos.

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Auffälligster Fehler: analogWrite() in Kombination mit LOW und HIGH ist keine brilliante Idee, denn dieser Befehl erwartet einen Wert zwischen 0 (aus) und 255 (volle Helligkeit).

Weiterhin: Gut ist, dass du deinen Code ordentlich kommentierst, du solltest allerdings noch die entsprechenden Einrückungen beachten. Wenn du das machst, falle dir bestimmt eher die zusätzlichen - aber unnützen - geschweiften Klammern auf.

Code:
int led1 = 3;        // integer variable ledPin1 rot
int led2 = 5;        // integer variable ledPin2 gelb
int led3 = 6;        // integer variable ledPin3 grün

int buttonPin1 = 10;    // integer variable buttonPin1 Hp0
int buttonPin2 = 11;    // integer variable buttonPin2 Hp2
int buttonPin3 = 12;    // integer variable buttonPin3 Hp1

void setup() {
  // pinMode(led1,OUTPUT);    // Pin3 ist jetzt ein Ausgang
  // pinMode(led2,OUTPUT);    // Pin5 ist jetzt ein Ausgang
  // pinMode(led3,OUTPUT);    // Pin6 ist jetzt ein Ausgang
  pinMode(buttonPin1,INPUT);   // Pin10 ist jetzt ein Eingang
  pinMode(buttonPin2,INPUT);   // Pin11 ist jetzt ein Eingang
  pinMode(buttonPin3,INPUT);   // Pin12 ist jetzt ein Eingang
  analogWrite(led1,HIGH);      //LEDrot ist zum Start ein
}

void loop(){
 
  if (digitalRead(buttonPin1)==HIGH)
    if (digitalRead(buttonPin2)==LOW)
      if (digitalRead(buttonPin3)==LOW){
        analogWrite(led1,255);      //LEDrot ist an
        analogWrite(led2,0);      //LEDgelb ist aus
        analogWrite(led3,0);      //LEDgrün ist aus
     }

  if (digitalRead(buttonPin2)==HIGH)
    if (digitalRead(buttonPin1)==LOW)
      if (digitalRead(buttonPin3)==LOW){
        analogWrite(led1,0);        //LEDrot ist aus
        analogWrite(led2,255);       //LEDgelb ist an
        analogWrite(led3,255);       //LEDgrün ist an
      }

  if (digitalRead(buttonPin3)==HIGH)
    if (digitalRead(buttonPin1)==LOW)
      if (digitalRead(buttonPin2)==LOW){
        analogWrite(led1,0);        //LEDrot ist aus
        analogWrite(led2,0);        //LEDgelb ist aus
        analogWrite(led3,255);       //LEDgrün ist an
      }
 }
« Last Edit: April 30, 2013, 06:27:44 am by sth77 » Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Überprüfe mal deine "{" da stehen einige vor if-Anweisungen.

und:
if (digitalRead(buttonPin1)==HIGH)
  if (digitalRead(buttonPin2)==LOW)
  if (digitalRead(buttonPin3)==LOW)
  {

geht auch nicht.

sollte so sein:

if ((digitalRead(buttonPin1)==HIGH) && (digitalRead(buttonPin2)==LOW) && (digitalRead(buttonPin3)==LOW))
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
ich habs mal ein wenig umgeschrieben, versuch es mal so.
Wenn die LEd von ganz nach Null gehen soll muß man halt von max bis min runterzählen.
gruß
Bernward

Code:
/**************************************************
* Autor: Ingo Mögling                              *
* Mai 2013                                         *
* Beschreibung                                     *
* Sketch zum steuern eine Lichthauptsignals        *
* mit mehreren LEDs                                *
* http://www.arduino-tutorial.de/schaltungen/
* http://www.youtube.com/watch?v=ZOtfcejS21c       *
* http://books.google.de/books?id=LiGw4IhN0RUC&pg= *
***************************************************/

int led1 = 3;        // integer variable ledPin1 rot
int led2 = 5;        // integer variable ledPin2 gelb
int led3 = 6;        // integer variable ledPin3 grün
int i, min = 1 , max = 255, schrittweite = 10;

int buttonPin1 = 10;    // integer variable buttonPin1 Hp0
int buttonPin2 = 11;    // integer variable buttonPin2 Hp2
int buttonPin3 = 12;    // integer variable buttonPin3 Hp1

void setup() {
  // pinMode(led1,OUTPUT);    // Pin3 ist jetzt ein Ausgang
  // pinMode(led2,OUTPUT);    // Pin5 ist jetzt ein Ausgang
  // pinMode(led3,OUTPUT);    // Pin6 ist jetzt ein Ausgang
  pinMode(buttonPin1,INPUT);   // Pin10 ist jetzt ein Eingang
  pinMode(buttonPin2,INPUT);   // Pin11 ist jetzt ein Eingang
  pinMode(buttonPin3,INPUT);   // Pin12 ist jetzt ein Eingang
  analogWrite(led1,HIGH);      //LEDrot ist zum Start ein
}

void loop(){
 
  if (digitalRead(buttonPin1)==HIGH && digitalRead(buttonPin2)==LOW && digitalRead(buttonPin3)==LOW)
  {
  for (i = min; i < max; i = i + schrittweite){
   analogWrite(led1, i);        //LEDrot ist an
   analogWrite(led2, LOW);      //LEDgelb ist aus
   analogWrite(led3, LOW);      //LEDgrün ist aus
  } 
  }
   
  if (digitalRead(buttonPin2)==HIGH)
  if (digitalRead(buttonPin1)==LOW)
  if (digitalRead(buttonPin3)==LOW)
 
  {
      analogWrite(led1,LOW);        //LEDrot ist aus
      analogWrite(led2,HIGH);       //LEDgelb ist an
      analogWrite(led3,HIGH);       //LEDgrün ist an
  }
    {
  if (digitalRead(buttonPin3)==HIGH)
  if (digitalRead(buttonPin1)==LOW)
  if (digitalRead(buttonPin2)==LOW)
 
  {
      analogWrite(led1,LOW);        //LEDrot ist aus
      analogWrite(led2,LOW);        //LEDgelb ist aus
      analogWrite(led3,HIGH);       //LEDgrün ist an
    }
   }
  }

Logged

Hessen
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Erst mal Danke für Eure schnellen Antworten.

wie Ihr unschwer erkennen könnt bin ich totaler Anfänger und arbeite mich gerade in die Materie ein. (Das Arduino Kochbuch wird noch bestellt, Ehrenwort !).

Das mit den Einrückungen und dem Numerischen Wert zw. 0 und 255 habe ich begriffen. Wie bekomme ich es denn hin dass beim Einschalten der Wert von 0 bis 150 ansteigt. Ich habe eine Menge über LED gefunden die hoch und runter gedimmt werden aber das sind immer Loops und mir ist nicht klar wie ich das bei meinem Sketch einbauen kann/muss.

Gruß,

Ingo
Logged

Meine Interessen: Meine POLA Homepage, Modellbahn, Computer, Norwergische Waldkatzen und jetzt noch Arduinos.

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Ingo,
hab ich doch in deinen Sketch eingebaut.

for (i = min; i < max; i = i + schrittweite){
   analogWrite(led1, i);        //LEDrot geht an
   analogWrite(led2, LOW);      //LEDgelb ist aus
   analogWrite(led3, LOW);      //LEDgrün ist aus
  } 

hier wird i von min bis max (hier 0 und 255) in 10-er Schritten (schrittweite) hochgezählt.
min, max und schrittweite kannst du im Kopf des Programms zum testen ändern, andere Werte oder andere Schrittweite.
Gruß
Bernward
Logged

Hessen
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Bernward,

da haben sich unsere Antworten wohl überschnitten. Werde es gleich mal probieren und Feedback geben.

Gruß,

Ingo
Logged

Meine Interessen: Meine POLA Homepage, Modellbahn, Computer, Norwergische Waldkatzen und jetzt noch Arduinos.

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Füge mal diese class Dimmable am Anfang deines Sketches ein:

Code:
class Dimmable {
 unsigned long lasttime;
 byte _pin;
 unsigned int _delay;
 byte _value;
public:
 Dimmable(byte pin, unsigned int duration)
 {
  _pin = pin; _delay = (duration>>8)+1; // _delay per step,  min 256 msec  for complete range
 }

 void fade(byte target)
 {
    if (_value != target)
      if ( millis() - lasttime > _delay)
      {
         if (target < _value) _value--;
         else _value++;
         analogWrite(_pin, _value);
         lasttime = millis();
      }
 }
};

Und definiere danach deine PWM-LED Pins als

Code:
Dimmable led1(3, 3000);   // Pin , Dauer von AUS nach EIN in ms

void loop() {
if (digitalRead(buttonPin1)==HIGH)
    led1.fade(255); // langsam hochfahren
else
    led1.fade(0); // langsam hochfahren
}

Wenn du den buttonPin1 lange genug gedrückt hältst, sollest du die LED langsam kommen sehen und nach loslassen wieder dunkler werden.
( Wenn der buttonPin1 mit Pulldown an 5 V angeschlossen ist )

(Ungetestet, kann ich mir heute abend mal ansehen bei Bedarf)
Logged

Hessen
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Zusammen,

leider bin ich mit Euren Hinweisen/Beispielen nicht wirklich weiter gekommen. ABER Eure Tipps haben den Denkprozess bei mir neu in Gang gesetzt  smiley-wink
Ich bin jetzt zumindest so weit dass die LEDs nach Tastendruck langsam heller werden. Der nächste Step ist jetzt das herunter dimmen der nicht mehr benötigten LEDs beim Wechsel auf ein anderes Signalbild, aber die Nacht ist ja noch lang.

Ich habe den Sketch mal beigefügt, aber bin mir darüber im Klaren dass man da sicher noch einiges dran verbessern kann.

Code:
[quote]/**************************************************
* Autor: Ingo Mögling                              *
* Mai 2013                                         *
* Beschreibung                                     *
* Sketch zum steuern eine Lichthauptsignals        *
* mit mehreren LEDs                                *
* http://www.arduino-tutorial.de/schaltungen/
* http://www.youtube.com/watch?v=ZOtfcejS21c       *
* http://books.google.de/books?id=LiGw4IhN0RUC&pg= *
***************************************************/

int led1 = 3;        // integer variable ledPin1 rot
int led2 = 5;        // integer variable ledPin2 gelb
int led3 = 6;        // integer variable ledPin3 grün
// int i, min = 1 , max = 255, schrittweite = 10;



int buttonPin1 = 10;    // integer variable buttonPin1 Hp0
int buttonPin2 = 11;    // integer variable buttonPin2 Hp2
int buttonPin3 = 12;    // integer variable buttonPin3 Hp1

void setup() {

  pinMode(buttonPin1,INPUT);   // Pin10 ist jetzt ein Eingang
  pinMode(buttonPin2,INPUT);   // Pin11 ist jetzt ein Eingang
  pinMode(buttonPin3,INPUT);   // Pin12 ist jetzt ein Eingang
  int i=0; i<=100; i++; // aufsteigender Wert für i
  analogWrite(led1, i++);      //LEDrot ist zum Start ein
}

void loop(){
 
  if (digitalRead(buttonPin1)==HIGH && digitalRead(buttonPin2)==LOW && digitalRead(buttonPin3)==LOW)
  {
  for (int i=0; i<=100; i++){ // aufsteigender Wert für i
    // Original: for (i = min; i < max; i = i + schrittweite){
   analogWrite(led1, i);    //LEDrot ist an
   delay(50);
   analogWrite(led2, 0);      //LEDgelb ist aus
   analogWrite(led3, 0);      //LEDgrün ist aus
  } 
  }
  if (digitalRead(buttonPin2)==HIGH && digitalRead(buttonPin1)==LOW && digitalRead(buttonPin3)==LOW)
 
  {
  for (int i=0; i<=100; i++){ // aufsteigender Wert für i
   
  analogWrite(led1, 0);       //LEDrot ist aus
  analogWrite(led2, i);       //LEDgelb ist an
  analogWrite(led3, i);       //LEDgrün ist an
  delay(50);
  }
  }
 
  if (digitalRead(buttonPin3)==HIGH && digitalRead(buttonPin1)==LOW && digitalRead(buttonPin2)==LOW)
 
  {
    for (int i=0; i<=100; i++){ // aufsteigender Wert für i
    analogWrite(led1, 0);       //LEDrot ist aus
    analogWrite(led2, 0);       //LEDgelb ist aus
    analogWrite(led3, i);       //LEDgrün ist an
    delay(50);
  }
  }
  }

[/quote]

Gruß,

Ingo
« Last Edit: April 30, 2013, 01:41:46 pm by Sharp57 » Logged

Meine Interessen: Meine POLA Homepage, Modellbahn, Computer, Norwergische Waldkatzen und jetzt noch Arduinos.

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn das funktioniert, kannst du es auch so lassen, Ingo.
Was passiert aber, wenn einer der 3 Schalter länger an ist ? ( Die LED geht schlagartig aus und läuft erneut hoch. )
Oder ist der Normalfall, dass keiner der 3 Schalter an ist, und dies nur Trigger-Impulse sind?

Runterfahren geht eigentlich genauso, du müsstest eventuell nur wissen, welche LED vorher an war.
Und/Oder du brauchst mehr Taster, denn sobald einer der Taster einen Impuls kriegt, läuft das zugehörige Programm "gnadenlos" durch ...
Zwei Taster gleichzeitig kommt also nicht vor.
entweder:
Code:
if (digitalRead(buttonPin2)==HIGH && digitalRead(buttonPin1)==LOW && digitalRead(buttonPin3)==LOW)
 {
    for (int i=0; i<=100; i++)
    {
       analogWrite(led1, 100-i);       //LEDrot geht aus
       analogWrite(led2, i);       //LEDgelb geht an
       analogWrite(led3, i);       //LEDgrün geht an
       delay(50);
    }
 }
oder:
Code:
if (digitalRead(buttonPin2)==HIGH && digitalRead(buttonPin1)==LOW && digitalRead(buttonPin3)==LOW)
 {
    for (int i=100; i>=0; i--)
    {
       analogWrite(led1, i);       //LEDrot geht aus
       delay(50);
    }
    // danach ...
    for (int i=0; i<=100; i++)
    {
       analogWrite(led2, i);       //LEDgelb geht an
       analogWrite(led3, i);       //LEDgrün geht an
       delay(50);
    }
 }

Mein voriges Beispiel (Dimmable) ging davon aus, dass loop() ohne delay läuft und die LED solange an bleibt wie der Schalter ein ist. Das ist leicht auf mehr LED (mit einem Schalter je LED) zu erweitern.
Wenn du die LED nicht bis 255, sondern ( wie bei dir ) nur bis 100 hochfährst, ist der Effekt, dass sich im hellen Bereich nicht mehr viel ändert, auch geringer.


Nachtrag: Hab mein Dimmable-Beispiel mal ausprobiert mit 2 LED und unterschiedlichem Zeitverhalten ( s. Anhang )






 




* TestDimmable.ino (1.01 KB - downloaded 9 times.)
« Last Edit: April 30, 2013, 04:47:20 pm by michael_x » Logged

Hessen
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin Michael,

Du hast mit dem verhalten der Schaltung auf Tastendruck vollkommen Recht, genau so läuft es ab: .......wenn einer der 3 Schalter länger an ist ? ( Die LED geht schlagartig aus und läuft erneut hoch. )
Für ein rein mechanisches Stellwerk, also händische Bedienung, vollkommen in Ordnung. So ließe er sich schon auf einen ATtiny übertragen, auf einer kleinen Platine mit den passenden Vorwiderständen bestückt, verwenden um dann in ein Tastenstellwerk eingebaut zu werden. Dieses würde dem Wunsch vieler Analogfahrer nach einem langsamen Aufblenden ihrer Lichtsignale schon mal erfüllen.


Für eine Auslösung über Optokoppler, und das wäre die zweite gewünschte Variante, ist das suboptimal und müsste geändert werden. Ebenso habe ich auch schon gemerkt dass das herunter dimmen nur vernünftig funktioniert wenn man weiß welches Schaltbild vorher an war, sonst laufen die merkwürdigsten Lichtbilder ab.  smiley-sad Da werde ich sicher noch eine Weile drüber nachdenken müssen.

Ich werde mal versuchen Deinen Sketch umzusetzen, vielleicht schaffe ich das heute ja noch.

Die Idealvorstellung wäre beide Möglichkeiten auf einem Board zu haben, da einige Modellbahnen analog und andere wiederum digital geschaltet werden. Aber ich glaube so weit bin ich noch nicht wirklich, da fehlt mit die Erfahrung mit dem Arduino.

Gruß,

Ingo

Logged

Meine Interessen: Meine POLA Homepage, Modellbahn, Computer, Norwergische Waldkatzen und jetzt noch Arduinos.

Pages: [1]   Go Up
Jump to: