Bewegungssteuerung soll Leds faden

Hallo,

bin Arduino -Anfänger. Habe mittels Photodiode und Infrarot Led einen Bewegungsschalter gebaut. Damit soll einmal in der Küche eine Led-Unterbaubeleuchtung bedient werden. Die Schaltzustände für eine Led (Testbetrieb) funktionieren, aber ich würde gerne noch eine Fadefunktion beim ein-und ausschalten hinzufügen.
Ab hier geht es einfach nicht weiter.
Hier der Code

// test Küchenzeilenbeleuchtung
// Photodiode und Infrarot Led als Bewegungsschalter
// Pin 8 geht über 1K Widerstand an INT0

int InputPin = 0;      // Input für Photodiode
int OutputPin = 8;   // Output für Schaltsignal
int val = 0;         // 
int ledpin = 10;        // Output für Led
volatile int state = LOW;    // Status Schaltzustand Schaltsignal

void setup()
{
  pinMode(OutputPin, OUTPUT);    
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
  digitalWrite(2, LOW);     // INT0 auf Low
  attachInterrupt(0, toggle, RISING); // ISR auf INT0
}

void loop()
{
  digitalWrite(OutputPin, LOW);    // Output initial auf Low
  val = analogRead(InputPin);        // Input von 0 zu 1023
  Serial.println (val);
  if (val < 500)                              // wenn Sensor unter 500 dann Output auf HIGH
{
  digitalWrite(OutputPin, HIGH);    // Output auf HIGH 

}
 
}

// Interrupt Service Routine
// Hier wird die Led mittel Bewegung ein- und ausgeschaltet
// Hier sollte auch glaube ich die Fadefunktion eingefügt werden
// Dachte an sowas hier
//    for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
//    analogWrite(ledPin, fadeValue);
void toggle()
{
  if(state == LOW) {    
    state = HIGH;
     
    }
   else {
    state = LOW;
   
   } 
  
  digitalWrite(ledpin, state);
}

Habe mir das aus Einzelteilen zusammengebastelt.
Vielleicht kann mir bitte jemand weiterhelfen.

  1. brauchst du sicher keine ISR

  2. kannst du in einer ISR nichts machen, was Zeit dauert. Also kein Fade

  3. in deinem Fade-Versuch fehlt eine Wartezeit/je Schritt. Für den vollen Bereich (0 <-> 255) eine ViertelSekunde ist Minimum, damit du einen schnellen Effekt siehst. Also bei 5er Schritten ein delay(5) oder mehr in jedem Schritt. Ausserdem ist der beobachtete Unterschied zwischen analogWrite(A0,1); und analogWrite(A0,2); größer als zwischen analogWrite(A0,201); und analogWrite(A0,202);
    Aber das geht jedenfalls nicht in einer ISR.

  4. Hab ich leider nicht kapiert, wie an Pin2 etwas passiert und wofür OutPutPin gut ist.
    Aber wenn es so funktioniert, dann lass doch das digitalWrite(ledpin, state) in der ISR weg,
    merke dir in loop den alten Zustand der Led, und bei einem Unterschied fadest du entweder rauf oder runter.
    Wenn du das Faden auf jeden Fall komplett machen willst, geht das mit einer for Schleife mit delays.

Sonst ( wenn du halb hochgefadet wieder umkehren willst ), nur einen Schritt je loop Durchlauf und der geht entweder rauf oder runter:

void loop()
{

  // ... deine Outputvalue- Geschichte wie bisher ...

   static byte fadevalue;
   if (state == HIGH && fadevalue < 255) fadevalue++;
   if (state == LOW && fadevalue > 0)   fadevalue--;
   analogwrite(ledPin, fadevalue);
   delay(2); // größer um den FadeEffekt besser zu sehen
}

edit: mit weniger Fehlern evtl. klarer

Es gibt in der Arduino-IDE unter "Basics" ein Beispiel "Fade" dazu eine Beschreibung: http://arduino.cc/en/Tutorial/Fade

Das, denke ich, könnte dir helfen.

ostbike: Die Schaltzustände für eine Led (Testbetrieb) funktionieren, aber ich würde gerne noch eine Fadefunktion beim ein-und ausschalten hinzufügen.

Im Prinzip mußt Du Dir eine Programm-Ablaufsteuerung machen, bei der ein Status sich sowohl bei Betätigung eines Schalters als auch nach Zeitablauf ändern kann.

Im Prinzip ein wenig so wie hier: http://forum.arduino.cc/index.php?topic=229611.msg1657494#msg1657494

Nur dass Du im Programm zu verwalten hast: enum {AUS, FADEUP, EIN, FADEDOWN};

Mit dem Schalter wird von Status "AUS" auf "FADEUP" geschaltet bzw. von "EIN" auf "FADEDOWN". Den Schaltzeitpunkt merkt sich das Programm. Während der Status FADEUP oder FADEDOWN ist, ändert sich die Helligkeit in bestimmten Zeitabständen. Am Ende des Fadevorgangs nach Zeitablauf ändert sich der Status von FADEUP auf EIN oder von FADEDOWN auf AUS, und ab da wird einfach nur auf den nächsten Schaltvorgang gewartet.

Vielen Dank für die schnellen Antworten. Das mit Zeiten in der ISR habe ich total vermasselt.

Starte das Projekt jetzt nochmal neu unter Berücksichtigung Eurer Hinweise.