LED-Matrix Tisch + TTP223 Touchsensor - Projektvorstellung und -untersützung

Hallo,

ich bin neu hier im Forum und habe bereits fleißig gelesen und auch das ein oder andere Video geschaut.
Ich habe vor einen Tisch mit 165 WS2812b LEDs als Matrix zu bauen. Die Matrix alleine, ist ja unproblematisch mit fastLED Beispielen steuerbar.
Ich möchte aber auch mit dem Tisch interagieren können, daher sollen die LEDs in 25 Gruppen aufgeteilt werden und jede Gruppe mit einem Touchsensor ansteuerbar sein.
Sprich Sensor1 steuert LED-Gruppe1; Sensor2 die Gruppe2, usw.

Noch kurz zur Hardware:
Also Borad kommt ein Elegoo Mega R3 zum Einsatz in Kombination mit einem 10 A Netzteil.
Dass die 10 A für 165 LEDs knapp sind, ist mir bewusst, daher werden die LEDs, wenn die gesamte Matrix eingeschaltet ist nie 100% Helligkeit erreichen.

Da ich bisher keine großen Erfahrungen mit Arduino gesammelt habe würde ich das Projekt und die Fortschritte hier gerne vorstellen und hoffe, das mir der ein oder andere den kleinen Roman verzeiht und auch bei ein paar Programmierfragen helfen kann. (Spoileralarm, ich habe schon welche :laughing:)

Begonnen habe ich bisher mit dem Ein-/Ausschaltablauf, welcher durch die Sensoren ausgelöst werden sollen. Glücklicherweise funktioniert das schonmal.
Wenn ich mich richtig eingelesen habe, sollte das ein einfacher Automat sein.

Der Ablauf sollte so aussehen:

  • Sensor wird berüht und gehalten -> LEDs dimmen von 0% auf 100%
  • Sensor wird gehalten -> LEDs leuchten
  • Sensor wird losgelassen -> LEDs dimmen von 100% auf 0%
  • Sensor wird nicht berührt -> LEDs sind aus

Zum Vermeiden von einer "Fehlbedienung" erfolgt der Wechsel von State0 auf State1 nur, wenn der Sensor auch eine gewisse Zeit gehalten wird.
Den Abschnitt "Hilfe" musste ich einbauen, da ansonsten das Ausdimmen nicht über das vorgegebene Intervall erfolgt ist.

Zur Zeit beschränkt sich das ganze noch auf einen Sensor.
Außerdem gebe ich die Aktion zur Zeit testweise noch als Text aus und schalte noch keine LEDs.
Später wird dann Serial.println durch Code aus der fastLED Library ersetzt.

Da dieser Ablauf für jeden Sensor gleich sein soll frage ich mich, ob man den Code noch vereinfachen kann bzw. habe ich mir das zu kompliziert gemacht?
Wie ich das für 25 Gruppen wiederholen kann ist mir auch noch nicht klar, außer eben 25 mal copy&paste...


#define BPin1 6 //TTP223
  
int buttonState = 0; 
long TimerEIN = 0;
long IntervallEIN = 400;
long TimerAUS = 0;
long IntervallAUS = 2000;
   
void setup() {
 pinMode(BPin1, INPUT);
 Serial.begin(9600);
}

void loop() {
//------------------ DIMMEN+ -------------------------
if ((digitalRead(BPin1) == HIGH) && buttonState == 0)  {                                             
  Serial.println("State 1 - läuft");
  if (millis() > TimerEIN + IntervallEIN) {
    buttonState = 1;
    Serial.println ("State 1 - FERTIG");
    }
    else buttonState = 0;                                      
  }
  else TimerEIN = millis();
  
//------------------ AN -------------------------
if ((digitalRead(BPin1) == HIGH) && buttonState == 1)  {                                            
  Serial.println("State 2 - AN");                                    
  }

//------------------ HILFE -------------------------
if ((digitalRead(BPin1) == LOW) && buttonState == 1)  {                                            
  Serial.println("HILFE");
  buttonState = 2;
  TimerAUS = millis();                                    
  }

//------------------ DIMMEN- -------------------------
if ((digitalRead(BPin1) == LOW) && buttonState == 2)  {                                            
  Serial.println("State 3 - läuft");
  if (millis() > TimerAUS + IntervallAUS) {
    buttonState = 3;
    Serial.println ("State 3 - FERTIG");
    }                                    
  }

//------------------ AUS -------------------------
if ((digitalRead(BPin1) == LOW) && buttonState == 3)  {                                            
  Serial.println("State 4 - AN");
  buttonState = 0;                                   
  }

}
#define BPin1 25 //TTP223
#define BPin2 26 // die pins von Mega2560
#define BPin3 27 // später, wenn alle 5 angeschlossen werden,
#define BPin4 28 // kann man das ganze PINA Register auslesen, (nicht jeden pin für sich allein) 
#define BPin5 29 // das heisst Portmanipulation

byte bS1 = 0;
unsigned long TimerEIN = 0; // beide Timers trennen muss man nicht . es wird ja 5 mal (ein für jeden Segment)
unsigned long IntervallEIN = 400;
unsigned long TimerAUS = 0;
unsigned long IntervallAUS = 2000;

void setup() {
  pinMode(BPin1, INPUT); // eigentlich überflüssig, denn nach dem Start fast alle Pins sind Input
  Serial.begin(9600);
}

void loop() {
  //------------------ DIMMEN+ -------------------------
  if ((digitalRead(BPin1) == HIGH) && (bS1 == 0))  {
    TimerEIN = millis();
    Serial.println("State 1 - läuft");
    bS1 = 1;
  }


  //------------------ AN -------------------------
  if ((digitalRead(BPin1) == HIGH) && bS1 == 1)  {
    if (millis() - TimerEIN > IntervallEIN) {
      Serial.println ("State 1 - FERTIG");
      Serial.println("State 2 - AN");
      bS1 = 2;
      ////  hier LED Strip Segment1 voll einschalten       <<<<<<<<<<<<<<<<<<<<<<
    }
    else {
      Serial.println ("warte noch");
      ////  hier LED Strip Segment1 langsam anleuchten lassen   <<<<<<<<<<<<<<<<<<
    }
  }

  //------------------ HILFE -------------------------
  if ((digitalRead(BPin1) == LOW) && bS1 == 1)  {
    Serial.print("HILFE  ");
    Serial.print( millis() - TimerEIN);
    bS1 = 0;
    TimerEIN = 0;
  }

  //------------------ DIMMEN- -------------------------
  if ((digitalRead(BPin1) == LOW) && bS1 == 2)  {
    Serial.println("State 3 - läuft");
    bS1 = 3;
    TimerAUS = millis();
  }

  //------------------ AUS -------------------------
  if ((digitalRead(BPin1) == LOW) && bS1 == 3)  {
    if (millis() - TimerAUS >  IntervallAUS) {
      Serial.println ("State 3 - FERTIG");
      Serial.println("State 4 - AN");
      bS1 = 0;
    } else {
      /* >>>>> hier dimmen <<<<<<<<*/
    }
  }
}


Bedenke aber daß der TTPP223 nach einiger Zeit wieder eine Calibration macht und somit die ON-Zeit begrenzt ist.
Das Datenblatt sagt: https://files.seeedstudio.com/wiki/Grove-Touch_Sensor/res/TTP223.pdf
Have the maximum on time 100sec by pad option(MOTB pin)
Auto calibration for life
And the re-calibration period is about 4.0sec, when key has not be touched

Das MOTB Pin existiert auf dem Silizium-Die . Da das IC aber in ein 6 - Pin Gehäuse montiert ist ist MOTB intern auf 1 geschaltet.

Probier mal aus ob der TPP223 Für Deine Aplikation geeignet ist.

Grüße Uwe

Vielen Dank für das Feedback.
Das mit dem PINA Register bzw. der Portmanipulation schaue ich mir mal genauer an.
Ich dachte eigentlich an eine Art von Array für die Inputs und die einzelnen LED-Gruppen.

Ich finde heute leider keine Zeit mehr nochmal am Code zu arbeiten, werde mir aber die Tage anschauen was du genau geändert hast.

Hallo Uwe, das ist ein sehr guter Hinweis. Soweit hatte ich noch gar nicht getestet.

Ich habe eben ein paar Durchläufe gestartet.
Die ON-Zeit beschränkt sich bei mir sogar nur auf 8 Sekunden anstatt den 100 Sekunden.
Einen Aussetzter von den 4 Kalibrierungssekunden konnte ich nicht feststellen.

Jetzt bin ich noch am überlegen, ob mir die 8 Sekunden ausreichen oder ob ich nach Alternativchips suchen soll. Fällt dir da spontan eine Alternative ein?
Wobei ich aktuell eher dazu tendiere, mich mit den 8 Sekunden ON-Time abzufinden.

Gruß Tobias

Hallo,
ich stehe vor dem selben Problem.. hast du einen alternativen Touchesensor gefunden oder eine Möglichkeit die 8 Sekunden zu verlängern?
LG

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.