Ich bräuchte einmal Hilfe bei meinem Code

Hallo,

ich versuche gerade einen LED RGB Stripe anzusteuern und zwar auf folgende Weise.
Ich habe knapp 1m RGB 12 V LED stripe, dieser bekommt über ein 12v Netzteil eine Stromversorgung bei 12+ und über 3 TIP 120 NPN Transistor steuer ich die einzelnen Farbkanäle an.
Das funktioniert soweit super.
Weiterhin ist ein Taster verbaut, ein Relais und ein Drehregler. Das Relais ist erst einmal uninteressant, dieses steuert anschließend den Strom für 2 Ultraschallvernebler.

Folgendes soll passieren:

  1. Taster wird betätigt und die Werte R und G gehen jeweils auf 132 das funktioniert mit einem delay wird dann das Relais angesteuert. Das funktioniert soweit.
  2. der Drehregler soll den Wert R und G erhöhen mit rechts dreh und mit links dreh verkleinern.
  3. bei lösen des Tasters, soll der R und G Wert langsam von dem aktuellen Wert sinken. Momentan startet dieser bei 255 und senkt sich dann auf 0

Der Drehregler wird bereits erkannt und ich kann eine Wertveränderung vornehmen, allerdings springt dieser immer gleich auf 0 also startet von vorne und steigt nicht stufenweise wie im loga[i] vorgesehen beim senken der Werte das gleiche Spiel. Das Stufenweise steigen klappt beim Start mit dem Taster problemlos.

Wie schaffe ich es, dass der Anfangswert Loga[i] der zum Anfang auf 132 steigt "gespeichert" und nicht durch den Bereich void update bei einer drehung auf 0 gesetzt wird? Denn wenn ich dort einen Wert habe, könnte ich diesen beim Lösen des Tasters einsetzen und von diesem wert runter dimmen.

hier einmal dazu der Code:

#define red 9
#define blue 10
#define green 11
void update();
int start = 1;
int rela = 1;
int Taster = 6;
int relais = 7;
int pinA = 4;
int pinB = 3;
int pinAstateCurrent = LOW;
int pinAStateLast = pinAstateCurrent;
int i;
int loga[64] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  16, 18, 20, 22, 25, 28, 30, 33, 36, 39, 42, 46, 49,
  53, 56, 60, 64, 68, 72, 77, 81, 86, 90, 95, 100, 105,
  110, 116, 121, 127, 132, 138, 144, 150, 156, 163,
  169, 176, 182, 189, 196, 203, 210, 218, 225, 233, 240, 248, 255
};
int akt_wert = loga[i];



void setup() {
  Serial.begin (9600);                     // Initialise the serial monitor
  pinMode (pinA, INPUT);                   // Set PinA as input
  pinMode (pinB, INPUT);                   // Set PinB as input

  attachInterrupt(digitalPinToInterrupt(pinB), update, CHANGE);
  analogWrite(red, i);
  analogWrite(green, i);
  analogWrite(blue, 0);

}

void loop() {
  if (digitalRead(6) == HIGH && start == 1) {
    for (int i = 0; i <= 45; i++)
    {
      analogWrite(red, loga[i]);
      analogWrite(green, loga[i]);
      Serial.println(loga[i]);
      rela = 2;
      delay(100);
    }
    if (akt_wert == 132 );
    start = 2;
  }
  if (digitalRead(6) == LOW && start == 2) {
    for (int i = 63; i >= 0; i--)
    {
      analogWrite(red, loga[i]);
      analogWrite(green, loga[i]);
      Serial.println(loga[i]);
      rela = 1;
      delay(100);
    }
    if (akt_wert == 0 );
    start = 1;

  }
  if (rela == 2) {
    digitalWrite(7, HIGH);
  }
  if (digitalRead(7) == HIGH && rela == 1) {
    digitalWrite(7, LOW);
  }
}
void update() {


  pinAstateCurrent = digitalRead(pinA);

  if ((pinAStateLast == LOW) && (pinAstateCurrent == HIGH)) {
    if (digitalRead(pinB) == HIGH) {
      if (i < 60) {
        i++;
      }
      Serial.println("Right");
      Serial.println(loga[i]);
    } else {
      if (i > 0) {
        i--;
      }
      Serial.println("Left");
      Serial.println(loga[i]);
    }
    analogWrite(red, loga[i]);
    analogWrite(green, loga[i]);

  }

Ich bin dankbar für jeden Hinweis, denn ich habe so langsam keine Ahnung mehr was hier tue oder eine Idee für eine Lösung.

Sie ändern niemals den Wert von akt_wert --> das macht nicht viel Sinn

int akt_wert = loga[i];

ISR-Variablen müssen als volatile deklariert werden

Es gibt wahrscheinlich viele andere Fehler, die behoben werden müssen. Drucken Sie z.B. nicht in einem ISR, sondern halten Sie den ISR klein

Da ist doch was falsch...
Das soll doch bestimmt:

    if (akt_wert == 0 )
    {
      start = 1;
    }

werden.

Genauso bei:

    if (akt_wert == 132 );
    start = 2;

neu:

    if (akt_wert == 132 )
    {
    start = 2;
    }

zur weiteren Erläuterung:

Ein Strichpunkt nach der If-Klammer beendet den If-block.
Das heißt die Bedingung wird geprüft und das wars
Der nachfolgende Befehl wird immer ausgeführt weil er wegen des Strichpunkts außerhab des if-blocks liegt.
Kein Strichpunkt hinter der If-klammer sondern geschweifte Klammer auf um den If-block zu beginnen.

vgs

Die Serial Ausgabe musst du aus der ISR entfernen. Das geht vielleicht in Moment, aber nicht zuverlässig. Serial braucht selbst Interrupts, aber diese können innerhalb einer anderen ISR nichts drankommen

int loga[64]

Für Werte zwischen 0 und 255 reicht byte.