LED's über verschiedene Zeiten dimmen

Hallo zusammen,

ich bin dabei ein Prog. zu schreiben, dass folgendes können soll:
Ich habe einen Sensor, wird dieser gedrückt, fangen 4 LED's, ab einem bestimmten Druck an zu leuchten. Drückt man nicht mehr, sollen diese Zeitabhängig (2s,4s,6s,8s,10s) ausklingen (also dimmen). Die Zeiten sollen vom PC aus gesteuert werden.
Bisher alles gut, ich habe mir gedacht, ich mache die Zeiten als verschiedene Cases wo man über a,b,c,d auswählen kann (Wie bei dem SwitchCase Tutorial).
Ich hänge nun schon seit längerem daran, wie ich die PWM schreibe, damit die LED's bei dem Druck angehen und bei Druckablass langsam ausklingen. Kann mir da jemand helfen? Wäre der Wahnsinn :slight_smile:

Gruß Max

Sollen die alle gleichzeitig abdimmen und 2, 4, 6 etc. Sekunden bis zum völligen verlöschen brauchen oder sollen die nach 2, 4, 6... Sekunden anfangen dunkel zu werden? Oder hab ichs komplett falsch verstanden?

Ne, die 4 LED's sollen alle gleichzeitig, also 4 belegte Pin's, über 2 od 4 od ... Sekunden erlöschen

Vielleicht sowas?

long release;

loop() {
  if (digitalRead(BUTTON))
    release = millis();
  digitalWrite(LED1, max(0, map(millis()-release, 0, 2000, 255, 0)));
  digitalWrite(LED2, max(0, map(millis()-release, 0, 4000, 255, 0)));
  digitalWrite(LED3, max(0, map(millis()-release, 0, 6000, 255, 0)));
  ...
}

Kein Plan ob das so funktioniert, kanns hier nicht testen... :wink:

Ok Danke erstmal.
Nur ne Frage, was ich noch net so ganz raff (bin noch bissi neu dabei ;)), wo veränder ich dann die Zeiten?

2000 -> 2 Sekunden, 4000 -> 4 Sekunden, 6000 -> 6 Sekunden... :slight_smile:

Ok, macht iwie sinn :wink:
Sänks ju, ich probiers gleich amoi aus

Also ich hätte des jetzt so gemacht, könnt des gehen oder hab ich da noch iwelche Anfängerfehler drin?

long analogInPin = A0;
const int analogOutPin1= 9;
const int analogOutPin2= 10;
const int analogOutPin3= 11;
const int analogOutPin4= 5;

int sensorValue= 0;
int outputValue= 0;

void setup(){
  Serial.begin(9600);
  if (Serial.available()>0){
    int inByte = Serial.read();
  }
}

void loop(){
  if (Serial.available()>0){
    int inByte = Serial.read();
    
    switch (inByte){
      
      case 'a':
      if (analogInPin > 0)
       analogInPin = millis();
      analogWrite(analogOutPin1, max(0, map(millis()-analogInPin, 0, 2000, 255, 0)));
      analogWrite(analogOutPin2, max(0, map(millis()-analogInPin, 0, 2000, 255, 0)));
      analogWrite(analogOutPin3, max(0, map(millis()-analogInPin, 0, 2000, 255, 0)));
      analogWrite(analogOutPin4, max(0, map(millis()-analogInPin, 0, 2000, 255, 0)));
      break;
      
      case 'b':
      if (digitalRead(analogInPin))
      analogInPin = millis();
      analogWrite(analogOutPin1, max(0, map(millis()-analogInPin, 0, 4000, 255, 0)));
      analogWrite(analogOutPin2, max(0, map(millis()-analogInPin, 0, 4000, 255, 0)));
      analogWrite(analogOutPin3, max(0, map(millis()-analogInPin, 0, 4000, 255, 0)));
      analogWrite(analogOutPin4, max(0, map(millis()-analogInPin, 0, 4000, 255, 0)));
      break;
    }
  }
}

Danke schonmal :slight_smile:

Mehr was in der Gegend:

#define IN 0
#define OUT1 9
#define OUT2 10
#define OUT3 11
#define OUT4 5

byte inByte;
long millisOff;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()>0)
    inByte = Serial.read()-'a'; // 'a'->0, 'b'->1, 'c'->2 ...

  if (analogRead(IN) < 511) // Analogportwerte gehen von 0 bis 1023
    millisOff = millis();

  // 'a'->0s, 'b'->2s, 'c'->4s...
  byte val = max(0, map(millis()-millisOff, 0, inByte*2000, 255, 0));

  analogWrite(OUT1, val);
  analogWrite(OUT2, val);
  analogWrite(OUT3, val);
  analogWrite(OUT4, val);
}

Ungetestet, daher ohne Gewähr!

Ok, hab ich des richtig verstanden, dass er praktisch erst ab dem "Druckwert" "512" das LED Programm schaltet oder?

Und mit "a" schalte ich die PWM aus, da 0*2000 ja 0 ist und jeder höhere Wert steht halt für die Anzahl an Sekunden dann, oder? :slight_smile:

Tut mir leid, dass ich ab und zu bissi blöd Frage, aber bin echt neu noch drin in dem Spaß hier :wink:

Gruß Max

Almseppi:
Ok, hab ich des richtig verstanden, dass er praktisch erst ab dem "Druckwert" "512" das LED Programm schaltet oder?

Ja. :slight_smile: Natürlich kannst Du den Wert ändern wies Dir beliebt...

Almseppi:
Und mit "a" schalte ich die PWM aus

Öhm, um ehrlich zu sein kann ich Dir das garnicht sagen, das kommt darauf an wie map implementiert ist... :blush:

Theoretisch müssten alle LEDs entweder dauerhaft an oder aus sein, eins von beidem.

Almseppi:
Tut mir leid, dass ich ab und zu bissi blöd Frage, aber bin echt neu noch drin in dem Spaß hier :wink:

Gibt keine blöden Fragen, außer denen, die über die Suchfunktion zu Ergebnissen führen würden. :wink: