INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
OneButton-Lib zur Menüsteuerung
28.09.2014, 07:18
Beitrag #1
OneButton-Lib zur Menüsteuerung
Hallo,
brauche leider mal wieder einen kleinen Anstubser. Hab einiges ausprobiert mit der OneButton Libary, aber das Ergebnis ist leider nicht das was ich will.
Folgenden Ablauf will ich mit einem Button, der drei Funtionen (kurzer Tastendruck [klick], langer Tastendruck[press] und Doppelklick [doubleklick] hat, realisieren:
Anfangszustand AUS
Wenn AUS und klick --> AN;
Wenn An und klick --> AUS (Das krieg ich noch hin Wink
Wenn AN und dubleKlick ---> Menü1 (Auch das klappt)
Wenn AN und press --> AUS
Wenn Menü1 und klick --> Menü2
Wenn Menü1 und press --> AUS
Wenn Menü1 und doubleclick --> keine Änderung
Wenn Menü2 und klick --> AKTION1
Wenn Menü2 und press --> AUS
Wenn Menü2 und doubleclick --> keine Änderung

Vielen Dank für Eure Hilfe und Tipps!
Harry
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.09.2014, 10:04
Beitrag #2
RE: OneButton-Lib zur Menüsteuerung
Folgenden Code habe ich bisher zusammengestellt, aber am Ende gibts auch einige Fehlermeldungen. An was kann das liegen?? Vorherige Codes wurden wenigstens kompiliert, aber warum nun diese Version des Skripts nicht läuft ist mit schleierhaft.

/********************************************************************************​**********************************************************
Aufgabe:
Menüsteuerung per Drehgeber mit Taster und Ausgabe der Auswahl auf einen NeoPixel-Ring mit 12 LEDs

Die unterste LED im 12-er Ring (= 6Uhr-Position) ist LED 12, --> LED 1 ist in Position 7Uhr
Einang Drehgeber in

********************************************************************************​************************************************************/
//
#define CHA 2
#define CHB 3
volatile int master_count = 0; // universal count
volatile byte INTFLAG1 = 0; // interrupt status flag
#include "OneButton.h"
#include "FastLED.h"
CRGB leds[12];


// Diese Zustände sieht der Ablauf vor
typedef enum MyActions {
ACTION_AUS, // do nothing.
ACTION_AN, // drei rote LED in Pos. 5,6,7 Uhr an
ACTION_MENU1, // Grüne lED in 12Uhr an
AUTO_MOVE_MENU2, // Grüne LED blink, Eingabe der Entfernungswahl AUTO_AKTION1...AUTO-MOVE5 AUTO_MOVE_ON, // Ausgang Auto_Move aktivieren
AUTO_AKTION1, //Zeitdauerwahl 1 = 10 sek = 5 m
AUTO_AKTION2, //Zeitdauerwahl 2 = 15 sek = 10 m
AUTO_AKTION3, //Zeitdauerwahl 3 = 20 sek = 15 m
AUTO_AKTION4, //Zeitdauerwahl 4 = 25 sek = 20 m
AUTO_AKTION5, //Zeitdauerwahl 5 = 30 sek = 25 m
//MASTER_COUNT_0,
}
MyActions;

// Setup a new OneButton on pin A1.
OneButton button(A1, true);

MyActions nextAction = ACTION_AUS; // Beim Start ACTION_AUS


void setup() {
pinMode(CHA, INPUT);
pinMode(CHB, INPUT);
pinMode(CHA, INPUT_PULLUP);
pinMode(CHB, INPUT_PULLUP);
Serial.begin(9600);
while(!Serial); //Dieser Programmteil legt erst los, wenn der Serial Monitor aufgerufen wird
Serial.println("master_count");
memset(leds, 0, 12 * sizeof(struct CRGB));


{FastLED.addLeds<NEOPIXEL, 6>(leds, 12); } // Betr. NeoPicxel


attachInterrupt(0, flag, RISING);
// interrupt 0 digital pin 2 positive edge trigger

// enable the standard led on pin 13.
pinMode(13, OUTPUT); // sets the digital pin as output
pinMode(10, OUTPUT); // sets pin 10 as output --> für Testzwecke Bedingungserfüllung

button.attachClick(myClickFunction); // link the myClickFunction to be called on a click event.
button.attachDoubleClick(myDoubleClickFunction); // link the doubleclick function to be called on a doubleclick event.
button.attachPress(myPressFunction); //ruft die myPress Funktion auf wenn der Taster länger gedrückt wird
button.setPressTicks(1500); //Definiert wielange der Taster gedrückt sein muss, damit das Signal gilt
//button.setClickTicks (700);

}// setup

void loop() {

unsigned long now = millis(); // keep watching the push button:
button.tick();

if (INTFLAG1) {
INTFLAG1 = 0; // clear flag
Serial.println(master_count);
delay(1);
} // end if

if (nextAction == ACTION_AUS) { // do nothing.
digitalWrite(13, LOW);
digitalWrite (10, LOW);
leds[0] = CRGB::Red; FastLED.show(0); delay(10);
leds[1] = CRGB::Red; FastLED.show(); delay(10);
leds[2] = CRGB::Red; FastLED.show(); delay(10);

}
else if (nextAction == ACTION_ON) {
digitalWrite(13, HIGH); // turn LED on
//MASTER_COUNT_0;
leds[0] = CRGB::Red; FastLED.show(400); delay(10);
leds[1] = CRGB::Red; FastLED.show(400); delay(10);
leds[2] = CRGB::Red; FastLED.show(400); delay(10);
leds[7] = CRGB::ForestGreen; FastLED.show(500); delay(10);

}
else if (nextAction == ACTION_MENU1) { // do a slow blinking
//MASTER_COUNT_0
leds[7] = CRGB::ForestGreen; FastLED.show(100); delay(400); // Grün blinker für Modus Auto-Lauf
leds[7] = CRGB::Black; FastLED.show(200); delay(300); // Grün blinker für Modus Auto-Lauf
leds[0] = CRGB::Red; FastLED.show(400); delay(10);
leds[1] = CRGB::Red; FastLED.show(400); delay(10);
leds[2] = CRGB::Red; FastLED.show(400); delay(10);
if (now % 1000 < 500) {
digitalWrite(13, LOW);
}
}
else if (nextAction == AUTO_MOVE_MENU2) {
leds[4] = CRGB::ForestGreen;FastLED.show(200); delay(300);


}

if (now % 1000 < 500) {
digitalWrite(13, LOW);


}

} //end loop

//Ab hier Verarbeitung Drehgebersignale
void flag() {
INTFLAG1 = 1;
// add 1 to count for CW
if (digitalRead(CHA) && !digitalRead(CHB)) {
master_count++ ;
}
// subtract 1 from count for CCW
if (digitalRead(CHA) && digitalRead(CHB)) {
master_count-- ;
}
}ON

// this function will be called when the button was pressed 1 time and them some time has passed.
void myClickFunction() {
if (nextAction == ACTION_AUS)
nextAction = ACTION_AN;
/*else
nextAction = ACTION_AUS;

if(nextAction == ACTION_MENU1)
nextAction = ACTION_AN;
*/
}// myClickFunction

// this function will be called when the button was pressed 2 times in a short timeframe.
void myDoubleClickFunction() {
if (nextAction == ACTION_AN) {
nextAction = ACTION_MENU1;

}
}
// this function will be called when the button was pressed longer as defines in "setPressTicks () --> hier 1,5s.
void myPressFunction() { // Anfang MyPress Funktion prüfen
if (ACTION_AN && myPressFunction) {
digitalWrite (10, HIGH);

}
}





//Ab hier Verarbeitung Drehgebersignale
void flag() {
INTFLAG1 = 1;
// add 1 to count for CW
if (digitalRead(CHA) && !digitalRead(CHB)) {
master_count++ ;
}
// subtract 1 from count for CCW
if (digitalRead(CHA) && digitalRead(CHB)) {
master_count-- ;
}
}ON

// this function will be called when the button was pressed 1 time and them some time has passed.
void myClickFunction() {
if (nextAction == ACTION_AUS)
nextAction = ACTION_AN;
/*else
nextAction = ACTION_AUS;

if(nextAction == ACTION_MENU1)
nextAction = ACTION_AN;
*/
}// myClickFunction

// this function will be called when the button was pressed 2 times in a short timeframe.
void myDoubleClickFunction() {
if (nextAction == ACTION_AN) {
nextAction = ACTION_MENU1;

}
}
// this function will be called when the button was pressed longer as defines in "setPressTicks () --> hier 1,5s.
void myPressFunction() { // Anfang MyPress Funktion prüfen
if (ACTION_AN && myPressFunction) {
digitalWrite (10, HIGH);

}
}

Und hier die Fehlermeldungen beim Kompilieren:
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Arduino: 1.0.6 (Windows XP), Board: "Arduino Nano w/ ATmega328"
Drehgeber_Button_Neo7c:19: error: expected constructor, destructor, or type conversion before 'void'
Drehgeber_Button_Neo7c.ino: In function 'void setup()':
Drehgeber_Button_Neo7c:61: error: 'myClickFunction' was not declared in this scope
Drehgeber_Button_Neo7c.ino: In function 'void loop()':
Drehgeber_Button_Neo7c:88: error: 'ACTION_ON' was not declared in this scope
Drehgeber_Button_Neo7c.ino: At global scope:
Drehgeber_Button_Neo7c:136: error: expected constructor, destructor, or type conversion before 'void'
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.09.2014, 17:02
Beitrag #3
RE: OneButton-Lib zur Menüsteuerung
Hallo Nimes,
anbei mal der "renovierte" Code. Der Compiler meckert zumindest nicht mehr und läuft durch. Ob der Code macht was du erwartest kann ich jedoch nicht beurteilen.
Grüße Ricardo
Code:
#define CHA 2
#define CHB 3
volatile int master_count = 0; // universal count
volatile byte INTFLAG1 = 0; // interrupt status flag
#include "OneButton.h"
#include "FastLED.h"
CRGB leds[12];

// Diese Zustände sieht der Ablauf vor
enum MyActions {
  ACTION_AUS, // do nothing.
  ACTION_ON, // drei rote LED in Pos. 5,6,7 Uhr an
  ACTION_MENU1, // Grüne lED in 12Uhr an
  AUTO_MOVE_MENU2, // Grüne LED blink, Eingabe der Entfernungswahl AUTO_AKTION1...AUTO-MOVE5 AUTO_MOVE_ON, // Ausgang Auto_Move aktivieren
  AUTO_AKTION1, //Zeitdauerwahl 1 = 10 sek = 5 m
  AUTO_AKTION2, //Zeitdauerwahl 2 = 15 sek = 10 m
  AUTO_AKTION3, //Zeitdauerwahl 3 = 20 sek = 15 m
  AUTO_AKTION4, //Zeitdauerwahl 4 = 25 sek = 20 m
  AUTO_AKTION5 //Zeitdauerwahl 5 = 30 sek = 25 m
};

OneButton button(A1, true);
MyActions nextAction = ACTION_AUS; // Beim Start ACTION_AUS

void setup()
{
  pinMode(CHA, INPUT);
  pinMode(CHB, INPUT);
  pinMode(CHA, INPUT_PULLUP);
  pinMode(CHB, INPUT_PULLUP);
  Serial.begin(9600);
  while (!Serial); //Dieser Programmteil legt erst los, wenn der Serial Monitor aufgerufen wird
  Serial.println("master_count");
  memset(leds, 0, 12 * sizeof(struct CRGB));
  FastLED.addLeds<NEOPIXEL, 6, RGB>(leds, 12); // Betr. NeoPicxel
  attachInterrupt(0, flag, RISING);
  pinMode(13, OUTPUT); // sets the digital pin as output
  pinMode(10, OUTPUT); // sets pin 10 as output --> für Testzwecke Bedingungserfüllung
  button.attachClick(myClickFunction); // link the myClickFunction to be called on a click event.
  button.attachDoubleClick(myDoubleClickFunction); // link the doubleclick function to be called on a doubleclick event.
  button.attachPress(myPressFunction); //ruft die myPress Funktion auf wenn der Taster länger gedrückt wird
  button.setPressTicks(1500); //Definiert wielange der Taster gedrückt sein muss, damit das Signal gilt
}

void loop()
{
  unsigned long now = millis(); // keep watching the push button:
  button.tick();
  if (INTFLAG1)
  {
    INTFLAG1 = 0; // clear flag
    Serial.println(master_count);
    delay(1);
  } // end if
  if (nextAction == ACTION_AUS)
  { // do nothing.
    digitalWrite(13, LOW);
    digitalWrite (10, LOW);
    leds[0] = CRGB::Red; FastLED.show(0); delay(10);
    leds[1] = CRGB::Red; FastLED.show(); delay(10);
    leds[2] = CRGB::Red; FastLED.show(); delay(10);
  }
  else if (nextAction == ACTION_ON)
  {
    digitalWrite(13, HIGH); // turn LED on
    //MASTER_COUNT_0;
    leds[0] = CRGB::Red; FastLED.show(400); delay(10);
    leds[1] = CRGB::Red; FastLED.show(400); delay(10);
    leds[2] = CRGB::Red; FastLED.show(400); delay(10);
    leds[7] = CRGB::ForestGreen; FastLED.show(500); delay(10);
  }
  else if (nextAction == ACTION_MENU1)
  { // do a slow blinking
    //MASTER_COUNT_0
    leds[7] = CRGB::ForestGreen; FastLED.show(100); delay(400); // Grün blinker für Modus Auto-Lauf
    leds[7] = CRGB::Black; FastLED.show(200); delay(300); // Grün blinker für Modus Auto-Lauf
    leds[0] = CRGB::Red; FastLED.show(400); delay(10);
    leds[1] = CRGB::Red; FastLED.show(400); delay(10);
    leds[2] = CRGB::Red; FastLED.show(400); delay(10);
    if (now % 1000 < 500) digitalWrite(13, LOW);
  }
  else if (nextAction == AUTO_MOVE_MENU2)
  {
    leds[4] = CRGB::ForestGreen;
    FastLED.show(200); delay(300);
  }
  if (now % 1000 < 500) digitalWrite(13, LOW);
}

//Ab hier Verarbeitung Drehgebersignale
void flag() {
  INTFLAG1 = 1;
  // add 1 to count for CW
  if (digitalRead(CHA) && !digitalRead(CHB)) master_count++ ;
  // subtract 1 from count for CCW
  if (digitalRead(CHA) && digitalRead(CHB)) master_count-- ;
}
// this function will be called when the button was pressed 1 time and them some time has passed.
void myClickFunction() {
  if (nextAction == ACTION_AUS) nextAction = ACTION_ON;
}// myClickFunction

// this function will be called when the button was pressed 2 times in a short timeframe.
void myDoubleClickFunction() {
  if (nextAction == ACTION_ON) nextAction = ACTION_MENU1;
}
// this function will be called when the button was pressed longer as defines in "setPressTicks () --> hier 1,5s.
void myPressFunction() { // Anfang MyPress Funktion prüfen
  if (ACTION_ON && myPressFunction) digitalWrite (10, HIGH);
}

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.09.2014, 21:13 (Dieser Beitrag wurde zuletzt bearbeitet: 28.09.2014 21:55 von Nimes.)
Beitrag #4
RE: OneButton-Lib zur Menüsteuerung
Hi Recardo,
vielen Dank das der Sketch nun wenigstens läuft! Woran lag es denn...ich will ja was lernen!

VG
Harry

Doch nicht nötig...hab unter anderem die vielen zuviele { } gefunden!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste