PWM Ausgang über Taster steuern "Hilfe" :~

Hallo Leute,

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 :wink: 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:

#define BUTTONTYPE INPUT  // INPUT or INPUT_PULLUP

Danke für die schnelle Antwort und die Mühe extra einen code zu schreiben :wink:

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 ....? :astonished:

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.

Mach ich was falsch?

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:

#define BUTTONPIN 9
#define BUTTONTYPE INPUT_PULLUP
#define LED 13
void setup() {
  Serial.begin(9600);
  pinMode(BUTTONPIN,BUTTONTYPE);
  pinMode(LED,OUTPUT);
}

void loop() {
  digitalWrite(LED,digitalRead(BUTTONPIN));
}

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.

Vielen Dank es funktioniert :wink:

Hey

Ich kenn mich nicht so gut mit Arduino Programiern aus :astonished:
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

Vielen Dank im Vorraus :slight_smile:

der thead ist über ein jahr alt, da macht man normal einen neuen auf und verlinkt den alten..

zu deiner frage: ja es geht

ich mach mich mal dran, falls niemand schneller ist lad ichs gleich hoch

[EDIT:hab mir grad mein programmier pc abgschossen, sieht nach ner windoof neuinstallation aus -.-
wird wohl heut nix mehr mit dem programm]

Hallo Andycode,

das hast du blöd formuliert:

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.

Andycode:
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

Ob Du das wohl selber schaffst?

Das in reply #1 gepostete Programm fragt 2 Buttons an Pin-10 und Pin-11 ab und definiert diese so:

debouncedButton myButtons[]={
 {10,0,false,false}, // pin-10 für Helligkeit Minus
 {11,0,false,false}, // pin-11 für Helligkeit Plus
};

Wie muss das Array wohl aussehen, wenn statt 2 Buttons nun 6 Buttons abgefragt werden sollen?

Hey

Ja ich hab es ja auch selber probiert den Sketch so umzuschreiben das es passt.

Aber das überschreitet meine Kompetenz. ..

Deswegen wollt ich euch bitten, ob das wer für mich machen kann.

Danke falls sich wer die Arbeit an tut :slight_smile:

Deine Kompetenz wird nie besser werden, wenn Du die Arbeit abschiebst.
Grüße Uwe

uwefed:
Deine Kompetenz wird nie besser werden, wenn Du die Arbeit abschiebst.

Wieso?
Er erarbeitet sich doch gerade eine Kompetenz in "Arbeit an andere verteilen".
Oder zumindest versucht er das.

Der peilt sicher einen Posten als Führungskraft im gehobenen Management an!
:money_mouth_face:

@ jurs

auch wieder wahr. :wink: :wink:

Grüße Uwe

Soll er/sie/es doch seinen Fisch bekommen.
Aber das Angeln lernt man davon nicht .........

class Handler
{
  protected:
  static Handler* first;
  Handler* next;
  
  Handler()
  {
    if(first) next = first;
    first = this;
  }
 
  virtual void update() = 0;
  
  public:
  static void handle()
  {
      Handler* temp = first;
      while(temp)
      {
        temp->update();
        temp = temp->next;
      }
  }
};

Handler* Handler::first = NULL;

class Dim2Taster : public Handler
{
  protected:
  int upPin;
  int downPin;
  int pwmPin;
  int pwm;
  int dimDelay;
  unsigned long lastHit;
  void update()
  {
     if(millis() - lastHit > dimDelay)
     {
       int newPwm = pwm;
       if(!digitalRead(upPin))
       {
         newPwm++;
       }else if(!digitalRead(downPin))
       {
         newPwm--;
       }
       newPwm = constrain(newPwm,0,255);
       if(pwm != newPwm)
       {
         analogWrite(pwmPin,pwm=newPwm);
         lastHit = millis();
       }
    }
  }

  
  public:
  Dim2Taster(int upPin, int downPin, int pwmPin, int dimDelay = 20) :upPin(upPin), downPin(downPin), pwmPin(pwmPin), pwm(0), dimDelay(dimDelay)
  {
    pinMode(upPin,INPUT_PULLUP);
    pinMode(downPin,INPUT_PULLUP);
    analogWrite(pwmPin,pwm=0);
    lastHit = millis();
  }
};



Dim2Taster LED1(A0,A1, 9);
Dim2Taster LED2(A2,A3,10);
Dim2Taster LED3(A4,A5,11);


void setup() {}

void loop() 
{
  Handler::handle();
}

Hey

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 :frowning:

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:

Lg Andycode

Danke combie für den Sketch nur Leider ist das nicht so ganz das was ich mir vorgestellt habe.

Tja... so kanns kommen ....
Was anderes gibt meine Wühlkiste nicht für dich her....

Vielleicht solltest du doch versuchen angeln zu lernen .... :sunglasses:

Ja

Also muss ich wohl 2 weiter Arduinos kaufen dann hab ich auch das was ich will :smiley:

Das Selbst zu Programmieren du ich mir nicht an einfache Änderungen und Sketches sind ja net so schwer aber das is mir viel zu komplex..

Naja Trotzdem Danke