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
Arduino LCD Menü Rotary und Settings im Untermenü setzen?
27.11.2013, 18:10 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2013 21:39 von Wampo.)
Beitrag #1
Brick Arduino LCD Menü Rotary und Settings im Untermenü setzen?
Hy Leute,

und schon wieder steht das nächste Projekt vor der Tür! Big Grin

Kurze beschreibung, es geht um eine Trigger Box für ne Canon DSLR!

Funktionen: Triggern über Lichtsensor, Triggern über Soundsensor, Triggern über Motionsensor, Triggern über Zeitinterval und den Langzeitbelichtungsmodus.

Ok gut soweit von den unterprogrammen kein problem, aber ich will es auf ein i2c angesteuertes LCD übertragen und eine Menüstruktur erstellen....bitte hierzu den Bildanhang beachten.

Abfolge: Begrüßungsbildschirm mit Versionsnummer und geplänkl---> Startbildschirm mit auswahlmöglichkeit über einen RotaryPoti-->buttonklick übernimmt den modus und geht ins nächste menü zum einstellen der werte (LichtValue, SoundValue oder delayzeit sollen auch blinken wärend dem einstellen Wink) ---> button klick übernimmt den eingestellten wert weiter zum abschlussmenü auf dem dann der modus angezeigt werden soll und ein paar extradaten (uhrzeit, bildzähler, ausgewähltes setting bla bla) ----> mit einem ECS button kann dann wieder in das hauptmenü gewechselt werden!
Funktion Langzeitbelichtung soll auf dem schlussmenü die verstrichene zeit anzeigen (stichwort RTC) und wird über einen button angetriggert und bei erneutem druck ausgetriggert.


So nun meine eigentlichen fragen:

1. Ist so eine Menüstruktur möglich?
2. Kann ich werte einstellen die beibehalten werden und nach nem reset halt weg sind oder gar nach dem ausschalten wieder abrufbar wären?
3. Wie funktioniert das überhaupt mit dem Werte setzen, zb für Licht Value 468?

An der hardwäre scheitert es nicht, es is die Programmierung, habe im netz noch keine für mich brauchbaren sachen gesehen...Sad

Erbitte dringend HILFE und Vorschläge und evtl kleine Codeschippsel oder kleine anstöße.

Um Gottes willen nicht als "MACH MAL" Post verstehen! Wink Suche nur Hirnstupser

MfG Daniel


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.11.2013, 14:32
Beitrag #2
RE: Menüauswahl & Wertsetzung
Hallo, das ist alles zu machen, klar. Dazu müssen die Konfigurationswerte im EEPROM angelegt werden, dann kannst du Teile, die nur beim power up ausgeführt werden sollen in den Setup-Bereich packen. Schnipsel gibt es doch in den Beispielen reichlich, die man verwenden kann. Bei verschiedenen Betriebsmodi würde ich eine Statemaschine einsetzen.

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2013, 18:34 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2013 20:03 von Wampo.)
Beitrag #3
RE: Menüauswahl & Wertsetzung
Hy Community,

hab endlich ein passenden Codeschnipsel gefunden mit dem ich ein Menü erstellen kann wie ich es möchte, allerdings wie immer mal wieder kommt man an einer gewissen Stelle nicht weiter!!! Sad
Die Menüstruktur ist erstellt--> Läuft
Menüscrollen durch einen Rotary Encoder mit Pushbutton--> Läuft
Programmauswahl durch druck auf Pushbutton--> Läuft
Das Programm läuft bei anwahl los--> LÄUFT NICHT!!!!!!!


Ich pflege mal unten den gesamten Code ein und hier meine Frage.

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

#define PINA 2
#define PINB 7
#define PUSHP 3
#define INTERRUPT 0  // that is, pin 2
#define INTERRUPTB 1  // that is, pin 3

volatile boolean turned;   // rotary was turned
volatile boolean fired;    // knob was pushed
volatile boolean up;  // true when turned cw

int CursorLine = 0;
int DisplayFirstLine = 0;
char* MenueLine[] = {" Intervall"," Light/Flash"," Sound"," PIR"," Bulb"," Manuell"};
int MenueItems;

// Interrupt Service Routine for a change to pushpin
void isrp ()
{
  if (!digitalRead (PUSHP))
    fired = true;
}  // end of isr

// Interrupt Service Routine for a change to encoder pin A
void isr ()
{
  if (digitalRead (PINA))
    up = digitalRead (PINB);
  else
    up = !digitalRead (PINB);
  turned = true;
}  // end of isr


void setup ()
{
  digitalWrite (PINA, HIGH);     // enable pull-ups
  digitalWrite (PINB, HIGH);
  digitalWrite (PUSHP, HIGH);
  attachInterrupt (INTERRUPT, isr, CHANGE);   // interrupt 0 is pin 2
  attachInterrupt (INTERRUPTB, isrp, FALLING);   // interrupt 5 is pin 18
  
  lcd.begin (20,4);
  lcd.backlight();
  
  lcd.setCursor(0,0);
  lcd.print("  DSLR Trigger Box  ");
  lcd.setCursor(0,1);
  lcd.print("Software Version 1.0");
  lcd.setCursor(0,2);
  lcd.print("     11-12-2013     ");
  lcd.setCursor(0,3);
  lcd.print("Written by Daniel A.");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("for Canon & Nikon");
  lcd.setCursor(0,2);
  lcd.print("INFO @ 0171/1745***");
  delay(3000);
  MenueItems = sizeof(MenueLine)/sizeof(MenueLine[0]);
  print_menue();
  lcd.blink();
}  // end of setup

void loop ()
{
  if (turned)
    {
    if (up)
      move_up();
    else
      move_down();
    turned = false;
    }
  else if (fired)
    {
    selection();
    fired = false;
    }  // end if fired
}  // end of loop

void print_menue() {
  lcd.clear();
  for (int i=0;i<4;i++) {
    lcd.setCursor(0,i);
    lcd.print(MenueLine[DisplayFirstLine + i]);
  }
  lcd.setCursor(0,(CursorLine-DisplayFirstLine));
}

void move_down() {
  if (CursorLine == (DisplayFirstLine+4-1)) {
    DisplayFirstLine++;
  }
  if (CursorLine == (MenueItems-1)) {
    CursorLine = 0;
    DisplayFirstLine = 0;
  }
  else {
    CursorLine=CursorLine+1;
  }
  print_menue();
}

void move_up() {
  if ((DisplayFirstLine == 0) & (CursorLine == 0)) {
    DisplayFirstLine = MenueItems-4;  
  }
  else if (DisplayFirstLine == CursorLine) {
    DisplayFirstLine--;
  }
  if (CursorLine == 0) {
    CursorLine = MenueItems-1;
  }
  else {
    CursorLine=CursorLine-1;
  }
  print_menue();
}

void selection() {

  lcd.clear();
  lcd.print("Auswahl:");
  lcd.setCursor(0,1);
  lcd.print("Menue ~");
  lcd.print(MenueLine[CursorLine]);
  delay(2000);
  
  switch (CursorLine) {
    case 0:
      LIGHT();
      break;
    case 1:
      INTERVAL();
      break;  
    default:
      break;
  }
  print_menue();
}

void INTERVAL()
{
}

void LIGHT()
{
  lcd.clear();
  lcd.noBlink();
  lcd.noCursor();
  while (!fired) {
    unsigned long starttime = millis();
     lcd.setCursor(0,1);
   lcd.print("LAEUFT");
   while((millis()-starttime < 500) & !fired){}
  }
  fired = false;
  turned = false;  // ignore if any
  lcd.blink();
}

void DO_SCREEN()
{
   lcd.clear();
   lcd.setCursor(0,1);
   lcd.print("HAUPTFENSTER");
}

Im Case 0 wird sollte doch jetzt eigtl jetzt das Unterprogramm LIGHT läufen oder bis zum drehen oder pushen am Rotary alles abgebrochen wird und ins Hauptmenü zurück gekehrt wird?!?!

Die SWITCH CASE sachen funzen iwie nich so recht bzw die Unterprogramme die dann eigtl laufen sollen tun es nicht.

Kurz und knapp nochmal das problem zusammengefasst:
Wenn der CASE 0 eintritt soll das Unterprogramm INTERVALL gestartet werden, es soll aber solange im CASE0 bleiben bis ich durch den druck auf den Pushbutton bestätige das zb der wert eingestellt ist den ich benötige. Kurzes aufblinken des LCD bestätigt die eingabe und geht über in den eigentlichen MODE loop der ausgewählt wurde.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.08.2014, 17:21 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2014 17:29 von Wampo.)
Beitrag #4
Rotary und Array auswählen
Kann mir um Gottes willen irgendjemand weiterhelfen, ich sitz jetz nun schon mind. 2 tage dran und hab glaube ich 2 mio Blogs gelesen.

Einfache geschichte für jemanden der sich damit auskennt!

Der aufbau ebenfalls simpel, ein Rotary Encoder soll aus einem Array Werte (LCD-Beleuchtung in msec) wählen. Im Array stehen 5 Werte char* TO[5] ={1000, 5000, 10000, 15000, 20000}.

In einem Untermenü möchte ich nun per drehung CW oder CCW das Array durchgehen.

WIE ZUM GEIER GEHT DAS????


Code:
//ROTARY
int encoderPin1 = 2;
int encoderPin2 = 3;
int encoderSwitchPin = 4; //push button switch
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
#define PUSHP 6
char* TO[5] ={1000, 5000, 10000, 15000, 20000}


void setup() {

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  digitalWrite (PUSHP, HIGH);
  digitalWrite(encoderPin1, HIGH);
  digitalWrite(encoderPin2, HIGH);
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);

  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded;
}

void loop(){
int i = encoderValue;
lcd.setCursor(0,0);
timeout = TO[i]/1000;
lcd.print(timeout);

}

Ich benutze im Code den Rotary mit dem ergebnis encoderValue ++ oder eben encoderValue --


Ich blicke einfach nicht mehr durch!!!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.08.2014, 17:58 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2014 18:02 von Bitklopfer.)
Beitrag #5
RE: Rotary und Array auswählen
(04.08.2014 17:21)Wampo schrieb:  Kann mir um Gottes willen irgendjemand weiterhelfen, ich sitz jetz nun schon mind. 2 tage dran und hab glaube ich 2 mio Blogs gelesen.

Einfache geschichte für jemanden der sich damit auskennt!

Der aufbau ebenfalls simpel, ein Rotary Encoder soll aus einem Array Werte (LCD-Beleuchtung in msec) wählen. Im Array stehen 5 Werte char* TO[5] ={1000, 5000, 10000, 15000, 20000}.

In einem Untermenü möchte ich nun per drehung CW oder CCW das Array durchgehen.

WIE ZUM GEIER GEHT DAS????


Code:
//ROTARY
int encoderPin1 = 2;
int encoderPin2 = 3;
int encoderSwitchPin = 4; //push button switch
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
#define PUSHP 6
char* TO[5] ={1000, 5000, 10000, 15000, 20000}


void setup() {

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  digitalWrite (PUSHP, HIGH);
  digitalWrite(encoderPin1, HIGH);
  digitalWrite(encoderPin2, HIGH);
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);

  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded;
}

void loop(){
int i = encoderValue;
lcd.setCursor(0,0);
timeout = TO[i]/1000;
lcd.print(timeout);

}

Ich benutze im Code den Rotary mit dem ergebnis encoderValue ++ oder eben encoderValue --


Ich blicke einfach nicht mehr durch!!!!

Hallo Wampo,
da empfehle ich dir mal meinen Beitrag von neulich
darüber findest du auch ein gutes Datenblatt wo die Funktion dieser Encoder deutlich macht..

...und da gibts sogar ne Lib dazu...

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.08.2014, 18:06 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2014 18:10 von Wampo.)
Beitrag #6
RE: Arduino LCD Menü Rotary und Settings im Untermenü setzen?
Es geht nicht dadrum das ich den Encoder nicht verstehe, ich verstehe nicht wie ich das Array durchlaufen kann und somit z.b. einen nächsten wert setze.
z.b. das TimeOut steht bei 10000msec, nun gehe ich in das untermenü in meine settings und möchte aus dem array per rotary das array durchlaufen und bei dem wert den ich abspeichern möchte bestätige ich. aus dem array werden werte gezogen per rotary.

Die Frage ist überhaupt ob mein char* Array stimmt oder nimmt man für feste werte was anderes.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.08.2014, 18:14
Beitrag #7
RE: Arduino LCD Menü Rotary und Settings im Untermenü setzen?
(04.08.2014 18:06)Wampo schrieb:  Es geht nicht dadrum das ich den Encoder nicht verstehe, ich verstehe nicht wie ich das Array durchlaufen kann und somit z.b. einen nächsten wert setze.
z.b. das TimeOut steht bei 10000msec, nun gehe ich in das untermenü in meine settings und möchte aus dem array per rotary das array durchlaufen und bei dem wert den ich abspeichern möchte bestätige ich. aus dem array werden werte gezogen per rotary.

Die Frage ist überhaupt ob mein char* Array stimmt oder nimmt man für feste werte was anderes.

dann schau dir doch mal diesen Beitrag von rkuehle an da geht es auch um eine Listenauswahl...nur ein bischen anderster eingebettet...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.08.2014, 19:38 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2014 20:42 von Wampo.)
Beitrag #8
RE: Arduino LCD Menü Rotary und Settings im Untermenü setzen?
Keine hilfe!!!! nur noch mehr missverständnis!

Ok Ok, anscheinend reden wir aneinander vorbei!
Ich fang nochmal ganz von vorne an!

Ich habe ein Array--> int light[6] ={1000, 5000, 10000, 15000, 20000, 30000};, dieses Array ist mit integer gefüllt. (ich weiss wie ich ein Array erstelle und wie ich es abrufen kann) Diese Zahlen stehen für millisec in einem delay.

Ich habe einen Rotary Drehencoder mit Pushbutton (ebenfalls weiß ich wie dieser funktioniert und wie er aufgebaut bzw. abgefragt wird)

Mein problem ist nun folgendes:

ich möchte, gehen wir davon aus, eine LED blinken lassen in verschiedenen abständen, diese Abstände sind im Array gespeichert. Ich möchte nun über die Rotarydrehfunktion durch dieses Array laufen bildlich gesehen ungefähr so --> Rotary +1 CW = light[0], Rotary +2 CW light[1], dabei steht die [0] für 1000 und die [1] für 5000 usw. Somit wird mit jeder drehung ein anderer wert in die Blinkpause von der LED aus dem Array genommen und im delay eingesetzt.


Wie kann ich das bewerkstelligen. Ich habe schon mit i++ rumprobiert, laststate do while alles, ich weiss nicht wie das geht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Menü über Bluetooth Eingabe abwarten anwo 4 503 18.10.2016 08:59
Letzter Beitrag: Lolliball
  Den 1. nRF24L01 auf "T" setzen und den 2. auf "R" setzen, wie geht das bitte ? arduinofan 3 438 01.02.2016 20:10
Letzter Beitrag: arduinofan
  Rotary Encoder - Anschließen King2k7 10 1.145 18.01.2016 12:38
Letzter Beitrag: hotsystems
  image menu navi für mega2560 mit tft-lcd ArduTux 3 412 16.01.2016 15:52
Letzter Beitrag: arduinofan
  Serial Menü futti0 8 1.112 25.12.2015 19:54
Letzter Beitrag: hotsystems
  Pins setzen und auslesen im Yun mit FreeBasic arduinofan 3 555 08.12.2015 15:03
Letzter Beitrag: manau21
  Hilfe für Grafikfunktion Setzen jgrothe 5 767 19.06.2015 14:23
Letzter Beitrag: torsten_156
  Rotary Encoder zählt nicht Rückwerts elmo 8 2.180 20.05.2015 20:05
Letzter Beitrag: elmo
  Einen hochzählenden Wert auf null setzen - wie macht man das? Gelegenheitsbastler 6 1.323 16.05.2015 16:18
Letzter Beitrag: Gelegenheitsbastler
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 1.113 05.05.2015 13:40
Letzter Beitrag: Bitklopfer

Gehe zu:


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