ich wollte ein Programm schreiben mit dem ich einen PWM Ausgang über einen Taster in "x" Stufen erhöhe und bei Überschreitung der "x" Stufen wieder auf "0" setze oder besser noch einmal PWM up ( PWM Werte erhöhen) & PWM down ( PWM Werte verkleinern) also dann 2 Taster (Buttons).
Allerdings bin ich relativ neu in der Materie und habe leider nicht allzuviel Erfahrung.... =(
Sorry für den schlechten Anfängercode:
Würde mich freuen wenn ihr mir helfen könntet Gruß Marc
//PWM Ausgang über Taster erhöhen.
int schneller = 10; // Pin fuer Taster um die Geschwindigkeit zu erhöhen.
int tasterval = LOW; // Wert des Tasters
int tasterstatus = LOW;
int v = 6; // Geschwindigkeitsstufen
int up = 0;
int PWMAUSGANG_V = 6;
void setup ()
{
int i;
pinMode(schneller,INPUT); // Taster auf Input
tasterstatus = LOW; // Ausgangszustand
for (i=0;i<v;++i) {
}
}
void loop ()
{
int i;
tasterval=digitalRead(schneller); // Taster auslesen
if (tasterval == HIGH) {
if (tasterstatus == LOW) {
tasterstatus = HIGH;
up++;
up %= (v + 1);
for (i = 0; i < v; i++) {
if (i < up) { analogWrite(PWMAUSGANG_V[i]); }
else { analogWrite(PWMAUSGANG_V [i-1]); }
}
delay(250);
}
}
else {
tasterstatus = LOW;
}
}
Marc2014:
Allerdings bin ich relativ neu in der Materie und habe leider nicht allzuviel Erfahrung.... =(
Mechanische Taster zum Ansteuern von Hardware neigen zum "Kontaktprellen", das softwaretechnisch unterdrückt werden muss. Da hier im Forum immer wieder danach gefragt wird, wie in einem Programm ein oder mehrere Taster entprellt werden können, habe ich heute dafür mal einen Demo-Code gemacht und hier gepostet: http://forum.arduino.cc/index.php?topic=216809.msg1585510#msg1585510
Den dort geposteten Entprellcode verwende ich auch in dem unten geposteten Sketch.
Der zweite Knackpunkt in Deinem Code ist die Helligkeitsregelung per PWM: Das Auge reagiert nicht auf jeden Helligkeitsunterschied gleich. Bei insgesamt geringer Helligkeit kann das Auge sehr viel geringere Helligkeitsunterschiede wahrnehmen als bei sehr hoher Helligkeit. Deshalb sieht ein PWM-Wert von 8 deutlich anders aus als ein PWM Wert von 4, aber die PWM-Werte 251 und 255 sind praktisch vom Auge nicht zu unterscheiden. Ich habe daher zur Helligkeitsregelung mal eine Tabelle mit 8 Helligkeitsstufen gemacht, zwischen denen mit den Tastern an Pin-10 (minus) und Pin-11 (plus) hin und her geschaltet werden kann.
Probler's mal aus:
// Multiple buttons debouncing demo by 'jurs' for German Arduino Forum
#define PWMAUSGANG 6
const byte pwmTable[8]={0, 4, 8, 16, 32, 64, 128, 255}; // 8 Helligkeitsstufen
byte pwmIndex=0;
#define BUTTONTYPE INPUT_PULLUP // INPUT or INPUT_PULLUP
struct debouncedButton {byte pin; unsigned long lastChanged; boolean down; boolean pressed;};
debouncedButton myButtons[]={
{10,0,false,false}, // pin-10 für Helligkeit Minus
{11,0,false,false}, // pin-11 für Helligkeit Plus
};
#define NUMBUTTONS sizeof(myButtons)/sizeof(myButtons[0])
#define DEBOUNCETIME 5
void initButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
pinMode(myButtons[i].pin,BUTTONTYPE); // set button pinMode
}
void setButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
{
myButtons[i].pressed=false;
boolean state=digitalRead(myButtons[i].pin);
if (BUTTONTYPE==INPUT_PULLUP) state=!state;
if (state==HIGH && myButtons[i].down==false && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].lastChanged=millis();
myButtons[i].down=true;
myButtons[i].pressed=true;
}
else if (state==LOW && myButtons[i].down==true && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].down=false;
myButtons[i].lastChanged=millis();
}
}
}
void setup() {
Serial.begin(9600);
Serial.println("Press button to change PWM value");
pinMode(PWMAUSGANG, OUTPUT);
initButtons();
}
void loop() {
setButtons();
if (myButtons[0].pressed && pwmIndex>0)
{
pwmIndex--;
analogWrite(PWMAUSGANG, pwmTable[pwmIndex]);
}
if (myButtons[1].pressed && pwmIndex<sizeof(pwmTable)-1)
{
pwmIndex++;
analogWrite(PWMAUSGANG, pwmTable[pwmIndex]);
}
}
Der gepostete Code aktiviert die internen PullUp-Widerstände an den Buttons.
Falls Du in Deiner Schaltung stattdessen externe PullDown-Widerstände verwendest, ändere den BUTTONTYPE im Quellcode auf:
Danke für die schnelle Antwort und die Mühe extra einen code zu schreiben
Ich verstehe jetzt was ich falsch gemacht habe bei meinem code , ich habe den code von dir mal getestet allerdings steht im serial Monitor nur : Press button to change PWM value.
Es ändert sich nichts und die led ist Dauer auf low ....?
Ich habe einmal versucht mit Taster von Pin 10 auf gnd & 11 auf gnd.
Und einmal mit gnd über 10K Ohm auf Taster und die andere Seite des Tasters auf 5v. für jeweils pin 10,11.
Marc2014:
Ich habe einmal versucht mit Taster von Pin 10 auf gnd & 11 auf gnd.
So ist der Code gedacht, mit
#define BUTTONTYPE INPUT_PULLUP
Beim Anschließen aufpassen, dass Du beim Taster auch die beiden verschiedenen Seiten zu fassen bekommst. Manche Taster für Printmontage haben vier Beine als Anschlüsse, dabei hängen je 2 und 2 an derselben Seite des Schalters und sind miteinander verbunden.
Marc2014:
Und einmal mit gnd über 10K Ohm auf Taster und die andere Seite des Tasters auf 5v. für jeweils pin 10,11.
Mach ich was falsch?
Wenn Du externe PullDown-Widerstände an den Buttons beschalten möchtest (ein Widerstand pro Button), dann ist die Schaltung wie im Button-Tutorial auf Arduino.cc: http://arduino.cc/en/tutorial/button
In dem Fall den Beispiel-Sketch ändern auf:
#define BUTTONTYPE INPUT
Um zu testen, ob Du den Button überhaupt richtig angeschlossen hast, kannst Du diesen kurzen Test-Sketch verwenden:
Wenn Du keinen externen Pull-Widerstand verwendest, setzt Du INPUT_PULLUP und die Board-LED muss ausgehen, wenn der Taster gedrückt wird und angehen wenn der Taster losgelassen wird.
Wenn Du einen externen PullDown in der Schaltung hast, dann INPUT setzen und die LED muss angehen, wenn der Taster gedrückt wird.
Ich kenn mich nicht so gut mit Arduino Programiern aus
Deswegen wollt ich Fragen ob irgendwer das oben genante Programm so erweitern kann dass ich 3 Led's Dimmen kann.
Soll also so Funktioniern Mit Taster 1 und Taster 2 = LED 1 Dimmen
Mit Taster 3 und Taster 4 = LED 2 Dimmen
Mit Taster 5 und Taster & = LED 3 Dimmen
Ist eigentlich nicht so, dass hier Leute sitzen, die nichts zu tun haben und sich freuen, wenn ihnen jemand eine Aufgabe stellt: Schreib mir mal dies und das für meinen Arduino.
Wer erzählt, was er versucht hat und warum es nicht funktioniert, bekommt viel eher Hilfe. Im Endeffekt auch schon mal genau das, was er eigentlich haben will.
Danke combie für den Sketch nur Leider ist das nicht so ganz das was ich mir vorgestellt habe.
Ich weiß bekomm ich schon was dann noch rummeckern tut mir leid
Aber ich brauch einen Sketch der so ist wie der :
von Jurs
// Multiple buttons debouncing demo by 'jurs' for German Arduino Forum
#define PWMAUSGANG 6
const byte pwmTable[8]={0, 4, 8, 16, 32, 64, 128, 255}; // 8 Helligkeitsstufen
byte pwmIndex=0;
#define BUTTONTYPE INPUT_PULLUP // INPUT or INPUT_PULLUP
struct debouncedButton {byte pin; unsigned long lastChanged; boolean down; boolean pressed;};
debouncedButton myButtons[]={
{10,0,false,false}, // pin-10 für Helligkeit Minus
{11,0,false,false}, // pin-11 für Helligkeit Plus
};
#define NUMBUTTONS sizeof(myButtons)/sizeof(myButtons[0])
#define DEBOUNCETIME 5
void initButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
pinMode(myButtons[i].pin,BUTTONTYPE); // set button pinMode
}
void setButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
{
myButtons[i].pressed=false;
boolean state=digitalRead(myButtons[i].pin);
if (BUTTONTYPE==INPUT_PULLUP) state=!state;
if (state==HIGH && myButtons[i].down==false && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].lastChanged=millis();
myButtons[i].down=true;
myButtons[i].pressed=true;
}
else if (state==LOW && myButtons[i].down==true && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].down=false;
myButtons[i].lastChanged=millis();
}
}
}
void setup() {
Serial.begin(9600);
Serial.println("Press button to change PWM value");
pinMode(PWMAUSGANG, OUTPUT);
initButtons();
}
void loop() {
setButtons();
if (myButtons[0].pressed && pwmIndex>0)
{
pwmIndex--;
analogWrite(PWMAUSGANG, pwmTable[pwmIndex]);
}
if (myButtons[1].pressed && pwmIndex<sizeof(pwmTable)-1)
{
pwmIndex++;
analogWrite(PWMAUSGANG, pwmTable[pwmIndex]);
}
}
Weil ich die Stufen zum Dimmen brauche.
Und auch die Schritte und wie viele Dimm Schritte es gibt eintragen kann.
Genau wie der Sketch von Juri nur mit 3 Pwm Ausgänge und 6 Tastern.
Und hier hab ich ein Video wieso ich diese Schritte brauche: