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
}
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);
}
}
}
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.
Hallo,
ich hab´s wieder erkannt
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;
}