Go Down

Topic: Drei Taster und drei Dioden (Read 1 time) previous topic - next topic

Benny1984

Hallo,
habe gerade angefangen mich mit dem Thema Arduino auseinander zu setzen.
Ziel soll es sein abhängig von gedrückten Tastern einen Servo an eine bestimmte Position zu fahren.

Aber das erst später.

Momentan komme ich bei einem Problem nicht weiter.
Habe drei Taster die als Schalter arbeiten. Jedem Taster ist eine LED zugewiesen.

Nun möchte ich, dass wenn ich Taster 1 drücke LED 1 angeht. Wenn ich Taster 2 drücke soll  LED1 ausgehen und LED2 angehen.

Es soll also immer nur eine LED leuchten.

Kann mir da einer eine Tipp geben wie ich das umsetze?

Benny

uwefed

Ich nehme an daß die 3 LED mit einem Vorwiderstand zwischen Arduino-Ausgang und masse geschaltet sind.

Code: [Select]
if (digitalread(taster1)==1)
  {
  digitalwrite(LED1,HIGH);
  digitalwrite(LED2,LOW);
  digitalwrite(LED3,LOW);
  }


Das gleiche mit den anderen 2 Tastern.

Grüße Uwe

jurs


Kann mir da einer eine Tipp geben wie ich das umsetze?


Wenn Du es mit möglichst wenig externen Bauteilen realisieren möchtest, dann ohne die externen PullDown-Widerstände an den Buttons sondern mit dem pinMode "INPUT_PULLUP" an den Button-Pins. Gedrückte Buttons erzeugen dann einen LOW-Pegel.

Die LEDs brauchen natürlich trotzdem ihren Vorwiderstand in Deiner Schaltung.

Dieses Beispielprogramm gibt am Ende der loop den Zustand der LEDs über den seriellen Monitor aus, so dass sich das Programm sogar ohne angeschlossene LEDs testen läßt, einfach über den seriellen Monitor:

Code: [Select]

#define BUTTON1 2
#define BUTTON2 3
#define BUTTON3 4

#define LED1 5
#define LED2 6
#define LED3 7

byte buttons[]={BUTTON1, BUTTON2, BUTTON3};
byte leds[]   ={LED1,    LED2,    LED3};

void setup()
{
  Serial.begin(9600);
  for (int i=0;i<sizeof(buttons);i++)
  {
    pinMode(buttons[i],INPUT_PULLUP);
    pinMode(leds[i],OUTPUT);
  }
}


void loop()
{
  int count=0;
  boolean pressed;
  for (int i=0;i<sizeof(buttons);i++)
  {
    pressed=!digitalRead(buttons[i]);
    if (pressed && count==0) // gedrückt und keine andere LED geshcaltet?
    {
      digitalWrite(leds[i],HIGH);
      count++; // Anzahl der geschalteten LEDs hochzählen
    } 
    else digitalWrite(leds[i],LOW);
  }
  for (int i=0;i<sizeof(buttons);i++)
  {
     Serial.print(digitalRead(leds[i]));
  }
  Serial.println();
}


Falls mehrere Buttons gleichzeitig gedrückt sind, bekommt jeweils der erste definierte Button die Priorität und schaltet seine LED ein. Es sollen ja nicht mehrere LEDs gleichzeitig leuchten.

Benny1984

Danke euch. Werde mal versuchen das umzusetzen.
Wäre sicher besser gewesen den Code dazu zu packen den ich schon habe.
Code: [Select]

int Tl = 2; //Taster1
int Tm = 4;
int TL = 7;

int DTl = 9; //Diode1
int DTm = 10;
int DTL = 11;

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int pos = 0;    // variable to store the servo position
int posleise = 0;
int posmittel = 45;
int poslaut = 90;

int state1 = HIGH;     // the current state of the output pin
int reading1;           // the current reading from the input pin
int previous1 = LOW;    // the previous reading from the input pin

int state2 = LOW;      // the current state of the output pin
int reading2;           // the current reading from the input pin
int previous2 = HIGH;    // the previous reading from the input pin

int state3 = LOW;      // the current state of the output pin
int reading3;           // the current reading from the input pin
int previous3 = HIGH;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time1 = 0;         // the last time the output pin was toggled
long debounce1 = 200;   // the debounce time, increase if the output flickers

long time2 = 0;         // the last time the output pin was toggled
long debounce2 = 200;   // the debounce time, increase if the output flickers

long time3 = 0;         // the last time the output pin was toggled
long debounce3 = 200;   // the debounce time, increase if the output flickers

void setup()
{
pinMode(Tl, INPUT);
pinMode(Tm, INPUT);
pinMode(TL, INPUT);
pinMode(DTl, OUTPUT);
pinMode(DTm, OUTPUT);
pinMode(DTL, OUTPUT);




  myservo.attach(3);  // attaches the servo on pin 9 to the servo object
}


void loop()

{

  reading1 = digitalRead(Tl);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce1) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;

    time1 = millis();
  }   
 

   
     digitalWrite(DTl, state1);

  previous1 = reading1;

  ////////////////////////////////////////

  reading2 = digitalRead(Tm);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading2 == HIGH && previous2 == LOW && millis() - time2 > debounce2) {
    if (state2 == HIGH)
      state2 = LOW;
    else
      state2 = HIGH;

    time2 = millis();
  }   
 

   
     digitalWrite(DTm, state2);

  previous2 = reading2;
 
  ////////////////////////////////////////

  reading3 = digitalRead(TL);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading3 == HIGH && previous3 == LOW && millis() - time3 > debounce3) {
    if (state3 == HIGH)
      state3 = LOW;
    else
      state3 = HIGH;

    time3 = millis();
  }   
 

   
     digitalWrite(DTL, state3);

 
  }

uwefed


Wäre sicher besser gewesen den Code dazu zu packen den ich schon habe.


Wahre Worte eines weisen Mannes.

Grüße Uwe

Go Up