LED Dimmen

Hallo Leute!

Ich hab da mal eine Frage. Ich möchte eine kleine LED über einen digitalen Input dimmen. Die LED soll, auch wenn nur ganz kurz ein High Signal am digitalen Input liegt, vollständig hochdimmen und beim hellsten Zustand bleiben. Dann soll die LED nach einer einstellbaren Zeit wieder runterdimmen und aus bleiben, bis wieder ein kurzes High-Signal kommt.

LG Euer Hermann

Hallo Herrmann,

das geht. Was ist denn deine Frage?

BG Thorsten

Wie geht denn der Programmcode dafür? Bin nämlich nicht so ein guter Programmierer :)

Hi Hermann,

also dir komplett helfen wäre ja langweilig...du willst doch lernen??? :sunglasses:

Also du brauchst folgendes:

DIgital Input auslesen: http://arduino.cc/en/pmwiki.php?n=Reference/DigitalRead Analog Output: http://arduino.cc/en/pmwiki.php?n=Reference/AnalogWrite Fade: http://arduino.cc/en/Tutorial/Fading Delay ohne Delay: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Damit solltest du eigentlich dein problem lösen, zumindest mal einen ersten Ansatz hier posten können

BG Thorsten

So was gehört doch zu den ersten Programmierübungen. Schau dir die Arduino-Grundbeispiele Fade und Button an und kombiniere sie.

Dann kannst du dich mit Blinkwithoutdelay beschäftigen, falls das ganze komplizierter werden soll.

Ok, ich hab mir mal alle Programme angeschaut und probiert. Nur wie kann man jetzt einmal einfach nur Hochdimmen und dass das auf den maximalen Wert bleibt? LG

Was hast du denn bis jetzt?

Zeige doch mal etwas Code was du gemacht hast, ....

Kannst du deine LED denn schon Heller oder Dunkler machen? ohne das es automatisch Dimmt?

du kannst For Schleifen machen ;-)

Gruß Mücke

Ich verzweifle schon langsam :confused:

Derzeitiger Stand

int inPin = 2; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
int ledPin = 9; // LED connected to digital pin 9

void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}

void loop() {
val = digitalRead(inPin); // read the input pin

if(value = HIGH) { // fade in from min to max in increments of 5 points:

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
digitalWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30); }
}

Hermann_88: Wie geht denn der Programmcode dafür? Bin nämlich nicht so ein guter Programmierer :)

Was du da suchst, ist ein "Einfacher endlicher Automat".

Und da ich sowas in der Schublade habe, kann ich dir das ja mal zeigen. Leicht für deine Anforderungen angepasst. Ungetestet. Kann sein, dass da Fehler drin stecken....

const unsigned int dimpin     = 3; // pin -- R -- LED -- GROUND
const unsigned int tasterpin  = 4 ; // Pin -- Taster -- GROUND
const unsigned int dimSpeed   = 50; // mS pro dimschritt 
const unsigned long warteZeit = 5000; // mS zwischen up und down


enum  AutomatenStatus {A_Taster,A_DimUp,A_Warte,A_DimDown};

struct Automat {
                  AutomatenStatus status;
                  unsigned long lastHit;
                  byte dim;
                  Automat() // Konstruktor
                  {
                    lastHit = millis();
                    dim     = 0;
                    status = A_Taster;
                  }
                } Astatus;


void setup() 
{
  pinMode(tasterpin,INPUT_PULLUP);
  analogWrite(dimpin, Astatus.dim);
}

void loop() 
{
  handleDim();
}  

void handleDim() 
{
  switch(Astatus.status)
  {
    case A_Taster: if(!digitalRead(tasterpin)) // low = taster gedrückt
                   {
                     Astatus.status = A_DimUp;
                     Astatus.lastHit = millis();
                   }
                   break;
  
    case A_DimUp:  if(millis() - Astatus.lastHit > dimSpeed) // low = taster gedrückt
                   {
                     Astatus.lastHit = millis();
                     Astatus.dim++;
                     analogWrite(dimpin, Astatus.dim);
                   }
                   if(Astatus.dim == 255)
                   {
                    Astatus.status = A_Warte;
                   } 
                   break;

    case A_Warte:  if(millis() - Astatus.lastHit > warteZeit) 
                   {
                     Astatus.lastHit = millis(); 
                     Astatus.status = A_DimDown;
                   }
                   break;
  
    case A_DimDown:  if(millis() - Astatus.lastHit > dimSpeed) // low = taster gedrückt
                   {
                     Astatus.lastHit = millis();
                     Astatus.dim--;
                     analogWrite(dimpin, Astatus.dim);
                   }
                   if(Astatus.dim == 0)
                   {
                    Astatus.status = A_Taster;
                   } 
                   break;
   }
}

Ok danke. Ich werds dann gleich mal ausprobieren!

Hermann_88:
Ich verzweifle schon langsam :confused:

Derzeitiger Stand

int inPin = 2; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
int ledPin = 9; // LED connected to digital pin 9

void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}

void loop() {
val = digitalRead(inPin); // read the input pin

if(val == HIGH) { // fade in from min to max in increments of 5 points: Korrektur: Variablenname ist val und nicht value; Vergleich==, =ist eine Wertzuweisung

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
digitalWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30); }
}

Ich habe mal rot den Fehler korrigiert, den ich in dem Codestück gesehen habe.