Das selbe Programm auf mehreren Pins ausgeben

Hallo ,
möchte mir gerne eine kleine Tischplatte mit Touch Oberfläche machen .
jedes einzelne Feld das berührt wird , sollte danach aufleuchten.

Mein erster Code den ich jetzt fertig gestellt habe läuft super ,
aber ich bekomme es nicht gebacken mehrere ein und Ausgange damit zu belegen.

mein Wunsch ist : 2,3,4,5,6, Touch Input ,
8,9,10,11,12, Output

int touchPin = 2; // connect output from TTP223 to this
int touch = 0;
int ledPin = 9; // Connected to relay

void setup() {
  
  Serial.begin(9600);
  pinMode(touchPin, INPUT);
  pinMode(ledPin, OUTPUT);

  analogWrite(ledPin, 255);
  
}

int faded = 0;
int touched = 0;

void loop() {

  touch = digitalRead(touchPin);
  //Serial.println(touch);
  
  if(touch==1) {

    if(faded==0) {
      for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
        analogWrite(ledPin, fadeValue);
        delay(10);
      }
      faded = 1;
    }
    
    Serial.println("touched");
    
  } else {

    if(faded==1) {
      for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
        analogWrite(ledPin, fadeValue);
        delay(30);
      }
      faded = 0; 

    }
    Serial.println("not touched");
      
  }
  
  delay(30);
  
}

a) editiere dein erstes Post und stelle deinen Code in Code Tags. Sonst kann man das nicht lesen. Im Forum How to steht beschrieben wie man Code in lesbar postet.
https://forum.arduino.cc/t/wie-man-dieses-forum-benutzt-bitte-lesen/902274/2

b) ich vermute du sollst dich ein wenig zu Arrays einlesen:
https://www.arduino.cc/reference/de/language/variables/data-types/array/

und weils Sinn mach, vieleicht zu Strukturen / struct

und weil du darum nicht hinwegkommst die Mutter aller Sketche:
[url= https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay]Blink Without Delay[/url]

oder du sagst - ist zu viel - dann gibts sicher was fertiges...

ich glaube du suchst sowas , Lesen und dann unters Kopfkissen legen.
https://www.wikinger-tommy.de/rentner/index.html

Schritt für Schritt-Anleitung - nun obsolet
  1. Du kannst Deine Beiträge editieren indem Du auf den Stift unter dem Beitrag klickst:
    image

2a) Vor dem Code und nach dem Code auf einer jeweils eigenen Zeile die drei umgekehrten Schrägstrichlein einfügen:

```
Hier der eigentliche Programmcode
```

ergibt

Hier der eigentliche Programmcode

oder alternativ:
2b) Vor dem Code [code] und nach dem Code [/code]auf einer jeweils eigenen Zeile einfügen

[code]
Hier der eigentliche Programmcode (ergibt dasselbe)
[/code]
  1. Änderung speichern.

:smirk: Danke

Welche Hardware hast Du?
Ein Arduino UNO hat nicht an allen von Dir ausgewählten OUTPUT-Pins PWM Ausgänge.

Relais darf man nicht mit PWM ansteuern. Die mögen das nicht.

Grüße Uwe

Hallo Uwe,
Aktuell möchte ich das ganze einfach einmal auf meinem Arduino UNO zum laufen bringen .
Aber du hast recht ! .. Plane einen Größeren tisch , und überlege wie ich das umsetzen kann .

das Problem mit PWM ist mir bekannt ^^ , dachte in dem Forum hätte jemand eine bessere Lösung

bessere Lösung? Nimm die Pins die PWM unterstützen.
Wenns mal mehr als pins 3, 5, 6, 9, 10, 11 oder gar bunt werden soll, dann könnte man evtl. auch Neopixel verwenden.

ich hab da mal was zusammengeschustert - noch mit den Pins wie du sie angeführt hast:

/*
  Smooth LED

  https://forum.arduino.cc/t/das-selbe-programm-auf-mehreren-pins-ausgeben/966116
*/

#include <Noiasca_led.h>               // download library from https://werner.rothschopf.net/microcontroller/202202_tools_led_en.htm
#include <Noiasca_button.h>            // some tools to read buttons

SmoothPin smoothLed[] {8, 9, 10, 11, 12}; // UNO PWM pins 3, 5, 6, 9, 10, 11
Button button[] {
  {2, HIGH},     // button connects pin to VCC, "active HIGH"
  {3, HIGH},
  {4, HIGH},
  {5, HIGH},
  {6, HIGH}
};

void setup() {
  Serial.begin(115200);
  for (auto &obj : smoothLed)
  {
    obj.begin();       // you have to call the .begin() method for the LED
    obj.on();           // you can switch the LED on
    //obj.setOnInterval(30);     // you can modify the delay time for the smothing
    //obj.setOffInterval(5);     // you can modify the delay time for the smothing
    //obj.setMaxBrightness(240); // you can limit the maximum brightness. Highest value on Arduino is 255. Default 255.
  }

  for (auto &obj : button)
  {
    obj.begin();   // you have to call the .begin() method for each button
  }
}

void loop() {
  // read the buttons
  for (size_t i = 0; i < sizeof(button) / sizeof(button[0]); i++)
  {
    if (button[i].wasPressed())
    {
      Serial.print(F("button was pressed ")); Serial.println(i);
      smoothLed[i].toggle();
    }
  }
  for (auto &obj : smoothLed) obj.update();   // you have to call update() for the LED
}

ich verwende meine [url=
Noiasca Took Kit for LEDs - Arduino Effect Library for your LEDs]Libray[/url] (download Link auch im Sketch), mit der lassen sich LEDs sanft ein und ausschalten und eine einfache Button Klasse zum debouncen gibt es auch.

die member function "toogle" schaltet die LED mit jedem Tastendruck sanft mittels PWM ein oder aus.

Meine Library unterstützt die ganzen "LED Effekte" auch für Neopixel.

werde mich gleich mal hinsetzten und das ganze auf mich umschreiben .
Das mit PWM ist echt ein Problem , versuche jetzt mit Hilfe von YouTube einen weg zu finden mit einem Arduino UNO fiele PWM Ausgänge zu führen ....

ps: ich war auch nicht untätig ( hab neuen Code )

const byte LedRot = 9;    // Pin für LED
const byte LedGruen = 11;
const byte LedBlue = 10;
const byte LedYellow = 6;
const byte btnRot = 2;    // taster schalten gegen OV
const byte btnGruen = 5;
const byte btnBlue = 3;
const byte btnYellow = 4;

byte hellRot, hellGruen, hellBlue, hellYellow;  // Helligkeit der LED
const byte fadstep = 5;
const byte delaytime=50;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(btnRot, INPUT_PULLUP);
  pinMode(btnGruen, INPUT_PULLUP);
  pinMode(btnBlue, INPUT_PULLUP);
  pinMode(btnYellow, INPUT_PULLUP);
}

void loop() {
  //---------- Teil für die Rote LED
  if (digitalRead(btnRot) == 0) {   // wenn Taster gedrückt
    if (hellRot + fadstep <= 255 ) {  // max noch nicht erreicht
      hellRot = hellRot + fadstep;
      analogWrite(LedRot, hellRot);
      delay (90);                   // zeit zum abdimmen 
    }
  }
  else {
    if (hellRot - fadstep >= 0 ) {    // min noch nicht erreicht
      hellRot = hellRot - fadstep;
      analogWrite(LedRot, hellRot);
      delay(50);        // Hochdimmen 
    }
  }

  // -------------Teil für die Grüne LED
  if (digitalRead(btnGruen) == 0) {
    if (hellGruen + fadstep <= 255 ) {
      hellGruen = hellGruen + fadstep;
      analogWrite(LedGruen, hellGruen);
      delay (90);
    }
  }
  else {
    if (hellGruen - fadstep >= 0 ) {
      hellGruen = hellGruen - fadstep;
      analogWrite(LedGruen, hellGruen);
      delay(50);
    }
  }
  
 // -------------Teil für die Blaue LED
  if (digitalRead(btnBlue) == 0) {
    if (hellBlue + fadstep <= 255 ) {
      hellBlue = hellBlue + fadstep;
      analogWrite(LedBlue, hellBlue);
      delay (90);
    }
  }
  else {
    if (hellBlue - fadstep >= 0 ) {
      hellBlue = hellBlue - fadstep;
      analogWrite(LedBlue, hellBlue);
      delay(50);
    }
  }
 // -------------Teil für die Yellow LED
  if (digitalRead(btnYellow) == 0) {
    if (hellYellow + fadstep <= 255 ) {
      hellYellow = hellYellow + fadstep;
      analogWrite(LedYellow, hellYellow);
      delay (90);
    }
  }
  else {
    if (hellYellow - fadstep >= 0 ) {
      hellYellow = hellYellow - fadstep;
      analogWrite(LedYellow, hellYellow);
      delay(50);
    }
  }
}

Ein Herzliches Danke an Rentner :slight_smile:

Oje....

2 Likes

Um LED zu regeln kannst Du folgendes machen:
WS2812 bzw Neopixel bzw ahnliche: Im RGB LED ist ein Controller eingebeut.
Externe Controller wie TLC5940, TLC5947 die 16 bzw 24 LED ansteuern.

Grüße Uwe

Hallo,
ich hab´s wieder erkannt :wink:
wenn Du in dem Text noch ein Wenig weiter ließt wirst Du noch bessere Lösungen finden. Bei diesem Beispiel handelte es sich um eine Zwischenlösung für Anfänger zum einfachen nachvollziehen.
Wenn Du einen Lösung suchst die letztlich wesentlich mehr LED´s ansteuern soll dann solltest Du gleich auf einen WSxxx LED streifen wechseln, da gehen dann auch 100 LED´s ohne Probleme

Du könntest die Taster in einer Matrix anordnen 5x5 oder was auch immer. Und dann gibt es auch i2c Port Expander
Heinz

Hallo,
als kleine Spielerei hab mal einen aus dem Link in #7 ein bisschen umgebaut. Dabei Arrays für die E/A und eine Struktur für die Daten verwendet.

/* vier LED werden mit je einem Taster auf und abgedimmt.
    Beispiel mit Array und Struct.

*/
// pins für die Ein und Ausgänge in einem Array ablegen
const byte ledpin[] = {9, 11, 10, 6}; //  für die LED 
const byte btnpin[] = {2, 5, 3, 4};   // die Eingänge
const byte anz = sizeof(ledpin) / sizeof(ledpin[0]); //Anzahl bestimmen

struct data {   // eine Datenstruktur zum speichern der LED daten
  uint32_t altzeit;
  byte hell;
};
data led[anz]; // ein Array der struct erzeugen
// es gibt jetz 4 Strukturen mit name led vom typ data

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.print("Es gibt "); Serial.print(anz); Serial.println( " Elemente");
  for (byte i = 0; i < anz; i++) {
    pinMode(btnpin[i], INPUT_PULLUP);
  }
}

void loop() {

  for ( byte i = 0; i < anz; i++) {
    bool btnstate = !digitalRead(btnpin[i]); // taster lesen
    byte helligkeit = fadeled(btnstate, i); // verarbeiten
    analogWrite(ledpin[i], helligkeit);     // ausgeben

    //oder alles in einer Zeile
    //analogWrite(ledpin[i], fadeled(!digitalRead(btnpin[i]), i));
  }
}
// die Fuction zum dimmen
byte fadeled(bool ein, byte n) {
  const byte step = 10; // schrittweite
  const byte dif = 100; // zeitinc.

  if (millis() - led[n].altzeit >= dif ) {
    if (ein) {
      led[n].altzeit = millis();
      if (led[n].hell + step <= 255) {
        led[n].hell += step;
      }
    }
    else {
      led[n].altzeit = millis();
      if (led[n].hell - step >= 0) {
        led[n].hell -= step;
      }
    }
  }
  return led[n].hell;
}

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