KY040 und LCD = Problem

Hallo zusammen

Ich habe einen Versuchsaufbau zusammengesteckt und komme bei einem Problem nicht weiter.
Folgender Aufbau:

  • Arduino Nano
  • 3 x KY040 (jeweils einen um Rot, Grün, Blau einzustellen)
  • WS2812b-LED-Streifen über Fastled gesteuert
  • ein 2-Zeilen LCD-Display über I2C angeschlossen

Ich will den Anteil an Rot, Grün und Blau in der LED mit dem jeweiligen Drehregler einstellen. Dazu verwende ich die Encoder.h (hat aber nix mit dem Problem zu tun, hab es auch mal manuell geschrieben, gleiches Problem)
Die eingestellten Farbanteile werden dann auf den LED-Streifen übertragen/angezeigt.

Alles klappt so weit hervorragend bis ich die eingestellten Werte auf dem LCD-Display anzeigen will (den im Code-Beispiel auskommentierten Code-Teil am Ende).

Sobald ich da die Kommentare weg nehme passiert folgendes:
Der Rot-Regler funktioniert ganz normal.
Die Regler für Grün und Blau hingegen machen kompletten Blödsinn: Die Zahlenwerte ändern sich nicht mehr passend zur Drehgeschwindigkeit (wie es bei Rot ist bzw. bei den beiden anderen auch ohne Displayanzeige war). Beim Rückwärtsdrehen sinken die Werte nicht wirklich, manchmal steigen sie oder schwanken um den eingestellten Wert. Nur wenn man ganz langsam dreht sinken die Werte aber auch nicht in den Schritten wie vorher.

Hat jemand eine Idee wo das Probelem liegen könnte? Ich hab keine Ahnung mehr was ich da übersehen habe…

#include <Encoder.h>
  //rot
     const int CLK_R = 2;
     const int DT_R = 3;
     int alt_R = -1;
     Encoder encR(DT_R,CLK_R);
  
  //grün
     const int CLK_G = 6;
     const int DT_G = 5;
     int alt_G = -1;
     Encoder encG(DT_G,CLK_G);
  
  //blau
     const int CLK_B = 9;
     const int DT_B = 8;
     int alt_B = -1;
     Encoder encB(DT_B,CLK_B); 
     
     

#include <FastLED.h>
#define DATA_PIN 11                     //PIN LED-Streifen  //nano
#define NUM_LEDS 1                      //Anzahl LEDs im System
#define BRIGHTNESS 100                  //Helligkeit 0-255
CRGB leds[NUM_LEDS];



#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);

  lcd.begin(16,2);
  lcd.backlight();
 
  lcd.setCursor(7,0);
  lcd.print("Hallo");
  delay(2000);
  lcd.clear();
}


void loop() {
    long WertRot = encR.read();  
    if (WertRot > 255)
         {
          WertRot = 255;
          encR.write(255);
         }
    if (WertRot < 0)
         {
          WertRot = 0;
          encR.write(0);
         }

              
    long WertGruen = encG.read();  
    if (WertGruen > 255)
         {
          WertGruen = 255;
          encG.write(255);
         }
    if (WertGruen < 0)
         {
          WertGruen = 0;
          encG.write(0);
         }
    
    long WertBlau = encB.read();  
    if (WertBlau > 255)
         {
          WertBlau = 255;
          encB.write(255);
         }
    if (WertBlau < 0)
         {
          WertBlau = 0;
          encB.write(0);
         }

if (  (alt_R != WertRot) or (alt_G != WertGruen) or (alt_B != WertBlau)  )
  {
       alt_R = WertRot;
       alt_G = WertGruen;
       alt_B = WertBlau;
       
       Serial.print("R: ");
       Serial.print(WertRot);
       Serial.print(" - ");
       Serial.print("G: ");
       Serial.print(WertGruen);
       Serial.print(" - ");
       Serial.print("B: ");
       Serial.println(WertBlau);

       for (int i=0; i < NUM_LEDS; i++) 
          leds[i].setRGB(WertGruen,WertRot,WertBlau);
       FastLED.show(); 
    
//       lcd.setCursor(0,0); 
//       lcd.print(" Rot  Gruen Blau");
//       
//       lcd.setCursor(0,1); 
//       lcd.print(WertRot);
//     
//       lcd.setCursor(6,1); 
//       lcd.print(WertGruen);
//
//       lcd.setCursor(12,1); 
//       lcd.print(WertBlau);
  }
}

Mein Verdacht: Dein erster KY-040 "verbraucht" alle Interrupt-Kapazitäten deines Nano (Pin 2 u.3). Encoder 2 und 3 hängen an non-interrupt-Ports, wobei die Bibliothek vielleicht davon ausgeht, dass alle interruptgetrieben sind.

Zudem: 3 Drehencoder, um 3 Farbwerte einzustellen? Ich stelle mit einem 23 (komplexere) Paramerer ein, und wüsste nicht, warum ich einen weiteren brauchen sollte.

Ok, ich werde wohl einfach 3 normale Potis anschließen. Dann müsste das Problem ja weg sein.

3 Drehregler sollen es sein weil die Schülerinnen und Schüler eben jede Farbe einzeln variieren können sollen. Der Regler der Rot einstellt bekommt dann eine rote Kappe auf den Regler usw.

Zu den Interrupt-Kapazitäten: Warum tritt das Problem dann erst auf nachdem ein LCD-Display über I2C angesprochen wird und nicht schon vorher?

Ja, für eine solch banale Aufgabe, speziell zu Schulungszwecken, ist ein Encoder Overkill. Poti oder Taster passt hier besser.

Encoder und LCD dürften nicht kollidieren, die Encoder untereinander schon, speziell, da wohl im Mischbetrieb (Interrupt vs. non-Interrupt) betrieben.

Ansonsten verwirrt mich die Instanzierung der LCD-Bibliothek. Es gibt ärgerlicherweise mehrere LCD Bibliotheken mit exakt gleichem Namen - und viele davon haben noch Forks. Vielleicht mal zum Test die Bibliothek wechseln.