Go Down

Topic: Nach Tastendruck Drehschalter auswerten  (Read 2699 times) previous topic - next topic

Sk8erBoyZ

Aug 27, 2017, 05:22 pm Last Edit: Aug 27, 2017, 06:57 pm by uwefed Reason: add CODE TAGs </>
Hallo
ich bastle an einem Laufrichtungsanzeiger für eine Eisbahn.
Verwendet werden soll ein Arduino UNO und Neopixel.
Es soll drei Taster geben
Taste 1 Laufrichtung rechts
Taste 2 Stop
Taste 3 Laufrichtung links
bei Druck auf Taste Stop sollen ein paar Neopixel Rot leuchten.
Bei drücken der Richtungstasten soll der Drehschalter abgefragt werden und
in eine entsprechende Funktion springen die dann verschiedene Lauflichter oder Dauerlicht oder sonstige
Efekte auslöst.
Zum Beispiel:
Ich drücke Laufrichtung Links, danach soll der Drehschalter gelesen werden.
Auf Stellung 1 soll dan zB ein Lauflicht von Rechts nach Links erzeugen.
Beim Druck auf Rechts soll das Lauflicht dann von Links nach Rechts gehen.
Hier mein Code zur Abfrage der Taster:
Code: [Select]
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(36, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();
  
  pinMode(A0,INPUT);          // Taste LINKS
  digitalWrite(A0,HIGH);      // interner pullup Widerstand
  pinMode(A1,INPUT);          // Taste STOP
  digitalWrite(A1,HIGH);      // interner pullup Widerstand
  pinMode(A2,INPUT);          // Taste RECHTS
  digitalWrite(A2,HIGH);      // interner pullup Widerstand
}

void loop() {
  if(readButton(0)) richtung(0);
  if(readButton(1)) stop();
  if(readButton(2)) richtung(21);
}

int readButton(int pin) {     // Taste einlesen
  if(analogRead(pin) < 500) { // Analog Eingang abfragen
    delay(150);             // Wartezeit zum erneut abfragen
    if(analogRead(pin) < 500) // Analog Eingang erneut abfragen
      return 1;               // war gedrückt
  }
      return 0;                   // war nicht gedrückt
  
  
 
}
//Ende der Schleife (loop)

//
// Funktion STOP
// zuerst alle Pixel aus, dann die mittleren 6 auf Rot
void stop() {
   for(int i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i,strip.Color(0,0,0));
    strip.show();
   }
  
  for(int i=0; i<6; i++) {
    strip.setPixelColor(15+i,strip.Color(150,0,0));
    strip.show();
   }
}

// Funktion Richtung
void richtung( uint8_t startpixel) {
   for(int i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i,strip.Color(0,0,0));
    strip.show();
   }
  
  for(int i=0; i<15; i++) {
    strip.setPixelColor(startpixel+i,strip.Color(0,0,150));
    strip.show();
   }
}


Kann mir jemand eine kleine Hilfestellung zur Programmierung geben.

Vielen Dank
mfg Micha

Deltaflyer

Hi Micha,
wieviele Positionen (Stellungen) hat dein Drehschalter?
LG Stefan

Tommy56

Den Scetch bitte in Codetags, nicht in Quotetags setzen.

Wieso liest Du einen Taster mit analogRead ein? Schau Dir doch erst mal als Grundlage das Button-Beispiel in der IDE an.

Wie soll Dein Drehschalter angeschlossen werden? Wieviele Stellungen hat der denn?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Sk8erBoyZ

ups war ein versehen mit den Quote Tags.
Der Schalter hat 5 Stellungen.

mfg Micha

Deltaflyer

Ok, danke Micha.
Bei 5 Stellungen kannst Du die 5 Schalter-Anschlüsse ja direkt an 5 Digitale Pins des Arduino's anschliessen. Den gemeinsamen Anschluss des Schalters an GND. bei den 5 Inputs des Arduinos den internen Pullup aktivieren.

Liegt dein Problem nun darin, dass Du nicht weisst, Wie Du das im Sketch abfragen Kannst, oder hast Du probleme bei der Hardwar-Umsetzung?

LG Stefan

Sk8erBoyZ

Hallo Stefan,
ich habe den Drehschalter an PIN 8 bis 12 angeschlossen.
Habe aber keinen Plan wie ich die Pins abfrage. Bzw wie ich das Lauflicht so
programmiere das ich die Lauflichtschleife mit einem erneuten Tastendruck beende.

Mfg Micha

Tommy56

Ich hatte noch eine weitere Frage gestellt, die Du noch nicht beantwortet hast.

Hier gleich noch eine.
Mit welcher Hardware willst Du denn das Lauflicht realisieren (Nur 1 Farbe oder RGB-LED) und wie viele LED sollen es werden?
Vorschlag: APA102 (RGB)

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Sk8erBoyZ

Hallo Tommy,
das mit den Analogeingängen hatte ich als Beispielcode im Internet gefunden.
Sollte natürlich auch über die digitalen Eingänge funktionieren.

Gibt es einen Nachteil bei meiner Variante?
Wenn Ja, kannst du mir das so erklären damit ich es verstehe.
Bin kein Elektroniker oder so nur Bastler  :)

Verwendet werden Neopixel (die hab ich schon)

Vielen Dank
Micha


Deltaflyer

Hi Micha,
2 Fragen noch:
1. Hast Du den Gemeinsamen Anschluss des Drehschalters an GND angeschlossen? Nur so können wir die internen Pullups des Arduino nutzen. Zudem ist diese Info nötig, wegen der Abfragelogik.

2. Zum Stoppen des Lauflichts: Können wir dazu den Stopp-Taster benutzen oder ist der für was anderes vorgesehen?

LG Stefan

Tommy56

Analog sollte nur wirklich analoge Signale einlesen. Digitale Signale haben einen größeren Störbstand.

Ich würde die Taster nach GND schalten und die internen Pullup-Widerstände benutzen. Die Fage von Deltaflyer für den Drehschalter geht in die gleiche Richtung.

Code: [Select]

const byte tasterPinRechts = DerinPin;

pinMode(tasterPinRechts, INPUT_PULLUP);

if (digitalRead(tasterPinRechts) == LOW) {
  // Taster rechts gedrückt
}

Als Vorschlag für eine Tasterabfrage. Wenn der Taster nicht gedrückt ist, ist der Einganh HIGH, sonst LOW.

Gruß Tommy


"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Sk8erBoyZ

Hallo Stefan,
zu Frage 1: Ja. Der gemeinsame Pin des Drehschalters liegt an GND.
zu Frage 2: Ich wollte die den Wechsel der Funktionen durch erneutes drücken
einer Richtungstaste erledigen.
Ich hoffe das ist so möglich




Vielen Dank,
Micha

Deltaflyer

Hi Micha,
ja, ist kein Proplem, die info ist nötig um die Auswertung der Richtungstaster korrekt zu schreiben.

Gib mir etwas Zeit, ich setz mich diese Nacht dran. Ich bin beim Programmieren ziemlich langsam,
sorry.

LG Stefan

Sk8erBoyZ


Deltaflyer

Sorry Micha, hatte letzte Nacht nen Notfall-Einsatz in der Firma. Bin aber jetzt dabei Deinen Sketch zu bearbeiten.

LG Stefan

agmue

Eine Anregung mit neun NeoPixeln:

Code: [Select]
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define ANZAHLNEOPIXEL 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(ANZAHLNEOPIXEL, PIN, NEO_RGB + NEO_KHZ800);
const byte linksPin = A0, stoppPin = A1, rechtsPin = A2;
uint32_t aktMillis, tasterMillis;
bool linksAkt, stoppAkt, rechtsAkt, linksAlt, stoppAlt, rechtsAlt;

void setup() {
  strip.begin();
  stop();
  strip.show();

  pinMode(linksPin, INPUT);         // Taste LINKS
  digitalWrite(linksPin, HIGH);     // interner pullup Widerstand
  pinMode(stoppPin, INPUT);         // Taste STOP
  digitalWrite(stoppPin, HIGH);     // interner pullup Widerstand
  pinMode(rechtsPin, INPUT);         // Taste RECHTS
  digitalWrite(rechtsPin, HIGH);     // interner pullup Widerstand
}

void loop() {
  aktMillis = millis();
  linksAlt = linksAkt;
  stoppAlt = stoppAkt;
  rechtsAlt = rechtsAkt;
  if (aktMillis - tasterMillis >= 30) {
    linksAkt = digitalRead(linksPin);
    stoppAkt = digitalRead(stoppPin);
    rechtsAkt = digitalRead(rechtsPin);
    if (!stoppAlt && stoppAkt) {
      stop();
    } else if (!linksAlt && linksAkt) {
      links();
    } else if (!rechtsAlt && rechtsAkt) {
      rechts();
    }
  }
}

// Funktion STOP
// zuerst alle Pixel aus, dann die mittleren 6 auf Rot
void stop() {
  for (uint16_t j = 0; j < strip.numPixels(); j++) {
    strip.setPixelColor(j, strip.Color(0, 0, 0));
  }

  for (uint16_t j = 3; j < 6; j++) {
    strip.setPixelColor(j, strip.Color(150, 0, 0));
  }
  strip.show();
}

void links() {
  for (uint16_t j = 0; j < strip.numPixels(); j++) {
    strip.setPixelColor(j, strip.Color(0, 0, 0));
  }

  for (uint16_t j = 0; j < 3; j++) {
    strip.setPixelColor(j, strip.Color(0, 150, 0));
  }
  strip.show();
}

void rechts() {
  for (uint16_t j = 0; j < strip.numPixels(); j++) {
    strip.setPixelColor(j, strip.Color(0, 0, 0));
  }

  for (uint16_t j = 6; j < 10; j++) {
    strip.setPixelColor(j, strip.Color(0, 150, 0));
  }
  strip.show();
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up