Hur implementerar man en fade out funktion

Hej

Jag har donat vidare och lärt mig en hel del. Jag har nu kommit till V8 av detta program som känns just nu stabilt och bra. Switcharna läses av korrekt och tänder upp utgången som den skall.

Timerfunktionen ser också till att släcka ner den efter angiven tid. Så inga problem, dock har jag klurat och kodat och klurat mer för att få en Analog fade out på utgången att fungera, det har dock gått med blandade resultat. Det är inte själva fadningen som går fel.

Fadeout skall starta efter att timern har gått klart. FadeOut skall också under tiden check så att ingen switch har blivit aktiverad, har den det så skall FadeOut brytas och statusen återgå till Switchens aktiva status.

Det gör inget om fadeOut stör tidscykeln för anrop av ToggleLight ifrån Main Loop. Har räknat att en bra tid för fadeOut torde vara runt 1,5 till 2 sek.

Så här ser min kod ut idag, där finns inte något för FadeOut men detta är den mest stabila koden som jag gjort. Som alltid, tipsa gärna om det går att optimera och förbättra :smiley:

// Include external libraries
#include <Bounce2.h>

// Define ports to be used with Bounce class
#define NumButtons 3 
#define OutPin 9
const uint8_t BtnPins[NumButtons] = {2, 3, 4}; 

// Create class objects
Bounce * debo = new Bounce[NumButtons]; 

// Set variables used in the program
unsigned long PrevMillis = millis();
unsigned long TimerStartTime = 0;
unsigned long TimerStoppTime = 4000;
bool SWstate[3] = {false, false, false};   

// Initialize setup
void setup() {
  pinMode(OutPin, OUTPUT);
  // Initialize all buttonsinstances and set debounce time for each one
  for (int i = 0; i < NumButtons; i++){
    debo[i].attach(BtnPins[i]);                                 
    debo[i].interval(10);                                              
  }
}

// Initialize functions
// Function ReadSwitchState, checks the door and interiorlight switches, it stores the result in an array
void ReadSwitchState(){
  for (int i = 0; i < NumButtons; i++){
    debo[i].update();
    if (debo[i].fell()){
      SWstate[i] = !SWstate[i];
    }
  }
}
// Function ToggleLight, this function checks the status of the switches and return true or false depending on the result
bool ToggleLight(){
  if (SWstate[0] || SWstate[1] || SWstate[2]){
    TimerStartTime = millis();
    return true;
  } else if (!SWstate[0] && !SWstate[1] && !SWstate[2]){
    if (millis() - TimerStartTime >= TimerStoppTime){
      return false;
    }
  }
}

// Start main code, here you will run all your code for the program
void loop(){
  // Call the function to read the status of the switches
  ReadSwitchState();

  // Once every second check the Status stored in the SWstate array and toggle the Interiorlight OutPin 9
  if (millis() - PrevMillis >= 1000){
    digitalWrite(OutPin, ToggleLight());
    PrevMillis = millis();
  }
}