Go Down

Topic: 6 Taster sollen Buchstaben a bis f ausgeben und WS2812B 1 bis 6 den Status  (Read 2499 times) previous topic - next topic

mc-big-d

Hallo zusammen,

ich (Anfänger mit minimalem Basiswissen) bin dabei, mir ein Modul zu bauen, welches die Tasten a, b, c, d, e und f ausgeben soll.
Zudem sollen die RGB LEDs 1, 2, 3, 4, 5 und 6 den Zustand des dazu gehörigen Tasters anzeigen.

(rot bis gedrückt - dann wenn gedrückt wechsel auf grün - grün bis Taster wieder gedrückt wird - wenn wieder gedrückt wechsel auf rot)

Weiterhin sollen 6 weitere WS2812B einen zugewiesenen Farbcode wiedergeben.


Bis jetzt habe ich die Ausgabe der Buchstaben und das entprellen hin bekommen.



Zu meinen Fragen:

Welche Lib ist zu empfehlen?
Welcher Code zb if else oder if else while usw wäre da am besten geeignet?


Nachfolgend der Code, den ich bis jetzt gemacht habe, mit kleinen Erklärungen:



Code: [Select]
#include <Keyboard.h>

int Taste1 = 0; //Taste 1 soll ein (a) ausgeben und WS2812B 1 den zustand anzeigen
int Taste2 = 0; //Taste 2 soll ein (b) ausgeben und WS2812B 2 den zustand anzeigen
int Taste3 = 0; //Taste 3 soll ein (c) ausgeben und WS2812B 3 den zustand anzeigen
int Taste4 = 0; //Taste 4 soll ein (d) ausgeben und WS2812B 4 den zustand anzeigen
int Taste5 = 0; //Taste 5 soll ein (e) ausgeben und WS2812B 5 den zustand anzeigen
int Taste6 = 0; //Taste 6 soll ein (f) ausgeben und WS2812B 6 den zustand anzeigen

void setup ()
{
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(A0, INPUT);
  Keyboard.begin();
}

void loop(){
  // Das setzen des Buchstabens funktioniert es fehlen die LED funktionen

  // Taste 1 ist nicht betätigt WS2812B RGB LED 1 ist auf rot
  // Taste 1 ist betätigt und gibt den Buchstaben "a" aus WS2812B RGB LED 1 wechslt von rot auf gruen
  // WS2812B RGB LED 1 bleibt auf gruen bis Taste 1 wieder betätigt wird
  // Wenn dann Tsste 1 wieder betätigt wird startet das ganze von vorn

 
  Taste1 = digitalRead(3);
  if (Taste1 == HIGH)
  {
  Keyboard.press(97);
  delay(500);
  Keyboard.releaseAll();
  }

 
  // Taste 2 ist nicht betätigt WS2812B RGB LED 2 ist auf rot
  // Taste 2 ist betätigt und gibt den Buchstaben "b" aus WS2812B RGB LED 2 wechslt von rot auf gruen
  // WS2812B RGB LED 2 bleibt auf gruen bis Taste 2 wieder betätigt wird
  // Wenn dann Tsste 2 wieder betätigt wird startet das ganze von vorn

 
  Taste2 = digitalRead(4);
  if (Taste2 == HIGH)
  {
  Keyboard.press(98);
  delay(500);
  Keyboard.releaseAll();
  }


  // Taste 3 ist nicht betätigt WS2812B RGB LED 3 ist auf rot
  // Taste 3 ist betätigt und gibt den Buchstaben "c" aus WS2812B RGB LED 3 wechslt von rot auf gruen
  // WS2812B RGB LED 3 bleibt auf gruen bis Taste 3 wieder betätigt wird
  // Wenn dann Tsste 3 wieder betätigt wird startet das ganze von vorn
 
 
  Taste3 = digitalRead(5);
  if (Taste3 == HIGH)
  {
  Keyboard.press(99);
  delay(500);
  Keyboard.releaseAll();
  }
 
  // Taste 4 ist nicht betätigt WS2812B RGB LED 4 ist auf rot
  // Taste 4 ist betätigt und gibt den Buchstaben "d" aus WS2812B RGB LED 4 wechslt von rot auf gruen
  // WS2812B RGB LED 4 bleibt auf gruen bis Taste 4 wieder betätigt wird
  // Wenn dann Tsste 4 wieder betätigt wird startet das ganze von vorn
  Taste4 = digitalRead(6);
  if (Taste4 == HIGH)
  {
  Keyboard.press(100);
  delay(500);
  Keyboard.releaseAll();
  }
 
    // Taste 5 ist nicht betätigt WS2812B RGB LED 5 ist auf rot
  // Taste 5 ist betätigt und gibt den Buchstaben "e" aus WS2812B RGB LED 5 wechslt von rot auf gruen
  // WS2812B RGB LED 5 bleibt auf gruen bis Taste 5 wieder betätigt wird
  // Wenn dann Tsste 5 wieder betätigt wird startet das ganze von vorn
  Taste5 = digitalRead(7);
  if (Taste5 == HIGH)
  {
  Keyboard.press(101);
  delay(500);
  Keyboard.releaseAll();
  }

 
  // Taste 6 ist nicht betätigt WS2812B RGB LED 6 ist auf rot
  // Taste 6 ist betätigt und gibt den Buchstaben "f" aus WS2812B RGB LED 6 wechslt von rot auf gruen
  // WS2812B RGB LED 6 bleibt auf gruen bis Taste 6 wieder betätigt wird
  // Wenn dann Tsste 6 wieder betätigt wird startet das ganze von vorn
 
 
  Taste6 = digitalRead(A0);
  if (Taste6 == HIGH)
  {
  Keyboard.press(102);
  delay(500);
  Keyboard.releaseAll();
  }
 
 
  // WS2812B RGB LED 7 bis 12 sollen über die nachfolgenden frei definierbaren Werte R 0-255, G 0-255, B 0-255 eingestellt werden können

   
  {
  leds[7] = CRGB(255, 0, 0);
  FastLED.show();
  delay(500); 
  leds[8] = CRGB(0, 255, 0);
  FastLED.show();
  delay(500);
  leds[9] = CRGB(0, 0, 255);
  FastLED.show();
  delay(500);
  leds[10] = CRGB(150, 0, 255);
  FastLED.show();
  delay(500);
  leds[11] = CRGB(255, 200, 20);
  FastLED.show();
  delay(500);
  leds[12] = CRGB(85, 60, 180);
  FastLED.show();
  delay(500);
  }   
}



Danke für die Hilfe



LG

Dee

agmue

Freundlich gemeinte Hinweise:

Code: [Select]
FastLED.show();
Die Initialisierung der Bibliothek fehlt.

Code: [Select]
#include <Keyboard.h>
Auf welcher Hardware läßt Du das laufen?

Code: [Select]
int Taste1 = 0;
...
Taste1 = digitalRead(3);

Da ist int eine unglückliche Typwahl.

Code: [Select]
delay(500);
Bei dem, was Du vor hast, mußt Du auf delay() gänzlich verzichten. Verwende für Zeiten millis(). Das bedeutet einen Paradigmenwechsel beim Programmkonzept.

Was fehlt: Tastenentprellung und Flankenerkennung des Tastenzustandes sowie das Merken des LED-Zustandes (entspricht rot oder grün).

Als Anregung:

Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 13
#define DATA_PIN 2
CRGB leds[NUM_LEDS];

unsigned long jetzt;                     // Variable für den aktuellen Zeitpunkt

struct Taster {
  Taster(const byte pin, const char zeichen, const byte ledindex): pin(pin), zeichen(zeichen), ledindex(ledindex), ledZustand(0), aktZustand(0), altZustand(0), vorhin(0) {}

  void init()
  {
    pinMode(pin, INPUT_PULLUP);
    aktZustand = digitalRead(pin);
    altZustand = aktZustand;
  }

  void aktualisieren()
  {
    altZustand = aktZustand;
    if (jetzt - vorhin >= 20)
    {
      aktZustand = digitalRead(pin);
      if (altZustand != aktZustand)
      {
        vorhin = jetzt;
      }
    }
  }

  bool zustand()
  {
    return aktZustand;
  }

  bool steigend()
  {
    if (!altZustand && aktZustand)
    {
      return true;
    }
    return false;
  }

  bool fallend()
  {
    if (altZustand && !aktZustand)
    {
      return true;
    }
    return false;
  }

  const byte pin;
  const char zeichen;
  const byte ledindex;
  bool ledZustand;
  bool aktZustand;
  bool altZustand;
  unsigned long vorhin;
};

Taster taster[] {
  // Tasterpin, Buchstabe, LED-Index
  {3, 'a', 7},
  {4, 'b', 8},
  {5, 'c', 9},
  {6, 'd', 10},
  {7, 'e', 11},
  {A0, 'f', 12}
};

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.show();
  for (Taster &t : taster) t.init();
}

void loop() {
  jetzt = millis();                      // aktuelen Zeitwert merken
  for (Taster &t : taster) {
    t.aktualisieren();
    if (t.steigend())
    {
      Serial.print(t.ledindex);
      Serial.print('\t');
      Serial.println(t.zeichen);
      t.ledZustand = !t.ledZustand;
      if (t.ledZustand) {
        leds[t.ledindex] = CRGB(255, 0, 0);
      } else {
        leds[t.ledindex] = CRGB(0, 255, 0);
      }
      FastLED.show();
    }
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

mc-big-d

Freundlich gemeinte Hinweise:

Code: [Select]
FastLED.show();
Die Initialisierung der Bibliothek fehlt.

Code: [Select]
#include <Keyboard.h>
Auf welcher Hardware läßt Du das laufen?

Code: [Select]
int Taste1 = 0;
...
Taste1 = digitalRead(3);

Da ist int eine unglückliche Typwahl.

Code: [Select]
delay(500);
Bei dem, was Du vor hast, mußt Du auf delay() gänzlich verzichten. Verwende für Zeiten millis(). Das bedeutet einen Paradigmenwechsel beim Programmkonzept.

Was fehlt: Tastenentprellung und Flankenerkennung des Tastenzustandes sowie das Merken des LED-Zustandes (entspricht rot oder grün).


Danke für die Hilfe und Anregung. Ich habe erst vor 24 stunden damit angefangen das zu erlernen bzw zu verstehen und bin deswegen blutiger Anfänger. Deswegen bitte ich um Rücksicht. XP



Wegen der Initialisierung ist es denn die richtige? Weil frag 1000 Leute und du erhälst gefühlte 2000 Antworten.



In den meisten Fällen wird es ein Micro und ansonsten einmal ein Leonardo und einmal ein Due.



Bei dem Rest muss ich mich erst rein fuchsen. Aber Danke für die anhaltspunkte.



LG Dee

agmue

Wegen der Initialisierung ist es denn die richtige?
Bei dem, was Du vorhast, ist das egal. Ich bevorzuge FastLED.

In den meisten Fällen wird es ein Micro und ansonsten einmal ein Leonardo und einmal ein Due.
Die kenne ich alle in der Praxis nicht. Ob das mit Keyboard.h so funktioniert, wie Du Dir das vorstellst, kann ich daher auch nicht einschätzen.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

mc-big-d

Bei dem, was Du vorhast, ist das egal. Ich bevorzuge FastLED.
Die kenne ich alle in der Praxis nicht. Ob das mit Keyboard.h so funktioniert, wie Du Dir das vorstellst, kann ich daher auch nicht einschätzen.

Weshalb bevorzugst du FastLED? Gibt es da Besonderheiten oder der gleichen?

Ja die sind extra dazu da um "Tastaturen" zu simulieren bzw als solche "erkannt" zu werden (so wurde es zumindest empfohlen)?

Ich versuche gerade angestrengt den Code von dir zu verstehen aber steige da nicht so durch. Wäre eine kleine Erklärung bzw kurze Beschreibung zu den Zeilen möglich, wenn du dafür überhuapt Zeit hättest?

Andii1980

Hallo,

hier sollten die Buchstaben dann auch Geschrieben werden wenn man die Jeweiligen Tasten drückt oder bin ich falsch in der Annahme?
Die LEDs reagieren zwar auf die Taste aber der TastenOutput klappt irgendwie nicht.

Quote
Taster taster[] {
  // Tasterpin, Buchstabe, LED-Index
  {3, 'a', 7},
  {4, 'b', 8},
  {5, 'c', 9},
  {6, 'd', 10},
  {7, 'e', 11},
  {A0, 'f', 12}
};

agmue

Weshalb bevorzugst du FastLED? Gibt es da Besonderheiten oder der gleichen?
Ich habe zwei Lichtstreifen a 5 m mit 150 und 300 Lichtpunkten, auf denen in der Bar eine Animation läuft. Die 300 Lichtpunkte werden von einem Teensy 3.2, die anderen von einem Nano bespaßt, wobei der Nano das per SPI macht. Die Bibliothek ist von Animationspraktikern geschrieben worden, daher gehen beispielsweise RGB genauso wie HSV. Für Dich ist das aber völlig wurscht.

Ja die sind extra dazu da um "Tastaturen" zu simulieren bzw als solche "erkannt" zu werden (so wurde es zumindest empfohlen)?
Du stöpselst also 20 Micros an einen Hub, der am PC 20 COM-Ports erzeugt, die Du dann per Programm abfragst? Spannendes Konzept!

Ich versuche gerade angestrengt den Code von dir zu verstehen aber steige da nicht so durch. Wäre eine kleine Erklärung bzw kurze Beschreibung zu den Zeilen möglich, wenn du dafür überhuapt Zeit hättest?
Das ist gut, denn ich wollte Dir aufzeigen, wohin Deine Lernkurve sich ausrichten sollte.

Hinsichtlich Erklärung gibt es zwei Probleme: Ich weiß nicht so recht, was ich erklären soll. Außerdem bin ich OOP-Anfänger und würde sicherlich die richtigen Ausdrücke nicht treffen. Ich mache sowas nur zum Spaß, da ist es egal, ob es nun Funktion oder Methode heißt, sind eh nur willkürliche Namen1).

Besser wären Fragen, da kann ich konkret antworten.

Man kann die Funktionalität auch komplett in die Struktur integrieren:

Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 13
#define DATA_PIN 2
CRGB leds[NUM_LEDS];

unsigned long jetzt;                     // Variable für den aktuellen Zeitpunkt

struct Taster {
  Taster(const byte pin, const char zeichen, const byte ledindex): pin(pin), zeichen(zeichen), ledindex(ledindex), ledZustand(0), aktZustand(0), altZustand(0), vorhin(0) {}

  void init()
  {
    pinMode(pin, INPUT_PULLUP);
    aktZustand = digitalRead(pin);
    altZustand = aktZustand;
  }
 void run()
 {
    aktualisieren();
    if (steigend())
    {
      Serial.print(ledindex);
      Serial.print('\t');
      Serial.println(zeichen);
      ledZustand = !ledZustand;
      if (ledZustand) {
        leds[ledindex] = CRGB(CRGB::Red);
      } else {
        leds[ledindex] = CRGB(CRGB::Green);
      }
      FastLED.show();
    }
  }
  
  void aktualisieren()
  {
    altZustand = aktZustand;
    if (jetzt - vorhin >= 20)
    {
      aktZustand = digitalRead(pin);
      if (altZustand != aktZustand)
      {
        vorhin = jetzt;
      }
    }
  }

  bool zustand()
  {
    return aktZustand;
  }

  bool steigend()
  {
    if (!altZustand && aktZustand)
    {
      return true;
    }
    return false;
  }

  bool fallend()
  {
    if (altZustand && !aktZustand)
    {
      return true;
    }
    return false;
  }

  const byte pin;
  const char zeichen;
  const byte ledindex;
  bool ledZustand;
  bool aktZustand;
  bool altZustand;
  unsigned long vorhin;
};

Taster taster[] {
  // Tasterpin, Buchstabe, LED-Index
  {3, 'a', 7},
  {4, 'b', 8},
  {5, 'c', 9},
  {6, 'd', 10},
  {7, 'e', 11},
  {A0, 'f', 12}
};

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.show();
  for (Taster &t : taster) t.init();
}

void loop() {
  jetzt = millis();                      // aktuelen Zeitwert merken
  for (Taster &t : taster) t.run();
}

Die LEDs reagieren zwar auf die Taste aber der TastenOutput klappt irgendwie nicht.
Ich sehe folgende Ausgabe auf dem seriellen Monitor:

Anfang
7 a
8 b




Anm.:
1) Die Notwendigkeit sprachlicher Vereinbarungen ist mir vollkommen klar, ich gebe mir diesbezüglich ja auch Mühe. Aber der Spaß am Programmieren steht halt im Vordergrund :)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Andii1980

Ah Stimmt, den Seriellen Monitor hatte ich nicht an gehabt  :)
Die Buchstaben sollten aber auch so ausgegeben werden das sie eine Tastatur Simulieren ;)


PS: Ich Teste im Moment die Sketches noch für mc-big-d an meiner Hardware aus darum frage ich es grade noch ;)

mc-big-d

Du stöpselst also 20 Micros an einen Hub, der am PC 20 COM-Ports erzeugt, die Du dann per Programm abfragst? Spannendes Konzept!

Nein es soll lediglich jedes Modul einzeln für sich funktionieren (Standalone Betrieb) und alle zusammen dann über Can-Bus.

Hinsichtlich Erklärung gibt es zwei Probleme: Ich weiß nicht so recht, was ich erklären soll. Außerdem bin ich OOP-Anfänger und würde sicherlich die richtigen Ausdrücke nicht treffen. Ich mache sowas nur zum Spaß, da ist es egal, ob es nun Funktion oder Methode heißt, sind eh nur willkürliche Namen1).

Besser wären Fragen, da kann ich konkret antworten.

Am einfachsten wäre es wenn man es wie einem 10 jährigen erklärt.

Sprich int ist dafür Word dafür Wert dafür
int Taster1 0 = 0;

Und danke für eure Hilfe

PS: Das einbinden des MCP2515 müsste auch gemacht werden wollte aber erstmal das mit dem Standalone hin bekommen und vorallem verstehen.

agmue

Die Buchstaben sollten aber auch so ausgegeben werden das sie eine Tastatur Simulieren ;)
Ich teste mit einem UNO, da geht das nicht. Der serielle Monitor dürfte dem CAN-Bus näher sein als eine Tastatur-Emulation.

Nach meinem Gefühl stecken in diesem Projekt zu viele ungeprüfte theoretische Annahmen.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Andii1980

Im Prinzip sollen die buchstaben a - f auch in Windows als buchstaben ausgegeben werden. Als HID wird erst einmal ein Arduino Leonardo genommen.

mc-big-d

Das Projekt soll ja eine Tastatur-Emulation werden. Es wurde empfohlen auf Grund der "weiten Strecken", dass ganze per Can Bus zu realisieren.  Aber naja, es ist halt immer wieder so, der eine sagt das, der andere das.

Ich wollte es am Anfang mit Schieberegister usw realisieren, aber da es anscheinend zu lange ist (total 5 Meter), ist es dann darauf heraus gelaufen.

agmue

Es wurde empfohlen auf Grund der "weiten Strecken", dass ganze per Can Bus zu realisieren.
Diese Empfehlung unterstütze ich, wobei es sich um eine von mehreren handelte und Du CAN ausgewählt hast.

Aber naja, es ist halt immer wieder so, der eine sagt das, der andere das.
Sollte sich das auf mich beziehen, so mißverstehst Du meine Aussage.

Eine von verschiedenen CAN-Bibliotheken verwendet sowas:

Code: [Select]
mcp2515.sendMessage(&canMsg1);

Das ist für mich nicht weit weg von dem von mir verwendeten Serial.print().

Aber wie bei allen Dingen kann ich mich natürlich irren. Schaun wir mal :)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

mc-big-d

Ich bin gerne bereit, mich anderweitig weiter umzuschauen. CAN Bus hat bis jetzt am meisten Vorteile und wird am meisten empfohlen, deswegen habe ich es gewählt, aber wie gesagt, wenn es sinnvolleres gibt, immer her damit.

Nein das wa so nicht gemeint sonmdern es gibt wohl immer mehrere herangehensweisen und naja die eine BESTE gibt es halt wohl nicht.

Viele wege führen nach Rom, passt da wohl ganz gut.


Generell wäre es hilfreich, so eine Art Leitfaden zu haben. Sprich, dass man hinter jeder Zeile eine minimale Beschreibung hat.

mc-big-d

So, also die Funktionen habe ich jetzt programmiert bekommen.
Die LED ist auf rot, bis getastet wird, dann wechselt sie auf grün, bis sie noch mal getastet wird, um dann auf rot zu gehen.

Die Grundbeleuchtung funktioniert auch.

Soweit so gut.

Nun suche ich nach einem gescheiten Plan, oder einer Erklärung, wie ich diese Programmierung dann mit dem CAN BUS Modul anstelle.

Wenn einer einen guten Leitfaden, oder ein TUT hat, wäre es super, wenn mir unter die Arme gegriffen wird.

Danke

Go Up