Arduino Uno und Menü für LCD Keypad Shield

Du kannst auch die Zeit von 1000 ms reduzieren. Nur irgendwann ist das Display nicht mehr schnell genug, daher ist das nicht die beste Lösung.

Ich habe mich da damals schon mit dem Problem beschäftigt und eine Funktion implementiert.

z.B. die Variablen 'menu_button_down' und die anderen Button Variablen auch zählen, nicht nur bis 1 sondern bis maximal 255.
Sprich wenn du deine Funktionen nach diesem Schema anpasst, sollte das Problem nicht mehr so groß sein:

setTime(hour(),minute(),second(),day(),month(),year()-menu_button_down);
menu_button_down=0;

Nun wird nicht -1 gerechnet sondern maximal -5 da die Button Press Time auf 200ms steht, werden 5 Tasten drücke Pro Sekunde maximal möglich sein.

Das geht natürlich auch mit + und month() und day() und und und.

Das ist das "dumme" oder "schöne" an der Programmierung, es gibt immer 1000 Lösungen und noch viel mehr, nur die eine bzw. die wenigen zu finden, die dich weiterbringen das ist nicht immer ganz leicht. :smiley:

Wie kann man es machen dass nicht lcd.setCursor(9,1) blinkt sondern lcd.setCursor(year())?

Also komplett alle ziffern vom Jahr, Monat, Tag....
Bei lcd.setCursor(9,1) blinkt ja nur eine Ziffer

Mir ist nicht bekannt das, dass geht. Da müsste man sich selbst eine Funktion schreiben.

So, wieder ein Update fertig:

  • Lib ist gleich geblieben
  • Beispiel, dass dabei ist, wurde wesentlich vereinfacht und benötigt weniger Flash speicher bei gleichem Funktionsumfang
  • Funktionen die nicht verändert werden müssen befinden sich in einer separaten Datei

Status: Beta Version

@skorpi08
Vielleicht kannst du es dir nochmal anschauen. Es ist wesentlich übersichtlicher geworden. Neue Funktionen lassen sich sehr einfach einbinden.

LCDMenuLib.rar (9.09 KB)

Back button funzt nicht.

Der neueste Sketch: http://pastebin.com/ME322DiQ Binäre Sketchgröße: 11.918 Bytes
Davor: http://pastebin.com/Scc0T987 Binäre Sketchgröße: 11.378 Bytes

Hoffe ich hab da alles richtig angepasst.

Ok im Beispiel muss die boolean CTR_check_button(); von der "no_chages_here" in die Hauptdatei kopiert werden, am besten unter die Deklaration vom LiquidCrystal Objekt, dann läuft es.

Bei Version 1.01 läuft auch das anderes :wink:

[edit]
Ist das Beispiel so übersichtlicher ?
[/edit]

LCDMenuLib.rar (9.1 KB)

Meinst du so?

// LCD initialisieren
  LiquidCrystal lcd(_LCD_PIN_rs, _LCD_PIN_e, _LCD_PIN_dat4, _LCD_PIN_dat5, _LCD_PIN_dat6, _LCD_PIN_dat7);
boolean CTR_check_button();

Back Button funzt immer noch nicht.

Ja, ich teste das nun nochmal. Mit Arduino 1.01 traten keine Fehler auf, ich muss mal eben herausfinden was sich geändert hat bis 1.04

Erster Eintrag war Müll, ich lade gleich nochmal eine Version hoch.

In der "no changes here" befindet sich in der Funktion ButtonMode_analog() einen Fehler.

Aus dem letztem If

else if(value >= _BUTTON_back_min && value <= _BUTTON_back_max)
    {
      ButtonMode_help_quit();
    }

muss das hier gemacht werden

    if(value >= _BUTTON_back_min && value <= _BUTTON_back_max)
    {
      ButtonMode_help_quit();
    }

Ja der rest funktioniert.

EDIT: Ich hab Mac OS IDE 1.0.4, LEFT BUTTON dient auch als BACK BUTTON

Hmm, ich habe gerade kein Tastenfeld hier. Ich versuch das mal nachzuvollziehen, aber es ist schon merkwürdig, da es Serial funktioniert mit "back".

Jomelo:
[edit]
Ist das Beispiel so übersichtlicher ?
[/edit]

Man gewöhnt sich an alles. Zu vergleichen mit Win7 und Win 8.

Hast du das mal mit der Änderung ausprobiert, also aus dem else if ein if zu machen ?

Funktioniert 1A!

Schau mal warum ich Datum nicht einstellen kann?!

Ging das vorher ?
Ich kümmer mich mal eben um mein Abendessen XD

skorpi08:

Jomelo:
[edit]
Ist das Beispiel so übersichtlicher ?
[/edit]

Man gewöhnt sich an alles. Zu vergleichen mit Win7 und Win 8.

Wäre übersichtlicher wenns ohne:

DigitFuncPtr LCDMenu_functions[] =

PROGMEM const char *g_lang_menu_table[] =
void CTR_menu_init()
wäre.

zB

  _LCDMENU(g_lang_0  , Item1     , "Information"              , FUNC_info);
  
  _LCDMENU(g_lang_1  , Item2     , "Temperatur"               , FUNC);
  _LCDMENU(g_lang_2  , Item21    , "Temperatur soll"          , FUNC_soll);
  _LCDMENU(g_lang_3  , Item22    , "Senken in Tagen"          , FUNC);

könnte ich mir vorstellen, dass man da diese 3 Codes einbinden könnte. Entweder in "no changes here" oder in die Lib verlegen.

Ja da bin ich noch am überlegen wie ich das machen kann.
Leider habe ich das noch nicht hinbekommen, würden die Variablen nicht im Flash gespeichert wäre es einfacher. Aber da dadurch die Variablen als 'const' deklariert werden, kann ich sie Dynamisch nicht mehr erweitern.

Jomelo:
Ging das vorher ?

Bei dem gestrigen Update ging das.

in void FUNC_dat(void)
soll der inhalt von
void FUNC_info(void)

Bei dem gestrigen Sketch hatte ich es so gemacht

      else if(tmp == _LANG_MENU_dat) 
      {
        set_Date(tmp);
        Date(tmp);
      }

Hier der Aktuelle Code:

 void  FUNC_info(void)
  {
    (CTR_start_func());
    if(CTR_func_timer(1000, 1))
 {
    lcd.clear();
    char lcdline[17];
    lcd.setCursor(3,0);
    sprintf(lcdline,"%02d:%02d:%02d",hour(),minute(),second());
    lcd.print(lcdline);
    lcd.setCursor(3,1);
    sprintf(lcdline,"%02d.%02d.%04d",day(),month(),year());
    lcd.print(lcdline);
 }
}
void FUNC_dat(void)
  {
    if(!CTR_start_func())

    if (menu_button_down == 1 && pos == 0) //set day-
      {
            setTime(hour(),minute(),second(),day()-menu_button_down,month(),year());
            menu_button_down=0;
           // lcd.setCursor(3,1);lcd.blink();
      }
....rest des codes

Die Funktionen

 else if(tmp == _LANG_MENU_dat) 

{
        set_Date(tmp);
        Date(tmp);
      }

Werden nun automatisch aufgerufen, also alles was man oben definiert in der Liste definiert wird aufgerufen. Wozu dient denn die Funktion set_Date(tmp) und wieso wird an die Funktionen tmp übergeben, tmp ist ja nur ein Zahlenwert.

Ich sehe gerade wieder das deine Buttons in der Start Funktion sind die nur einmal ausgeführt wird. Du kannst dir das wie ein Setup vorstellen das nur bei der Initialisierung geladen wird.

void FUNC_dat(void)
  {
    CTR_start_func();

    if (menu_button_down == 1 && pos == 0) //set day-
      {
            setTime(hour(),minute(),second(),day()-menu_button_down,month(),year());
            menu_button_down=0;
           // lcd.setCursor(3,1);lcd.blink();
      }
....rest des codes

CTR_start_func muss einmal aufgerufen werden, da hier dann festgelegt wird, welche Funktion nach dem Tastendruck und dem ersten Durchlauf wieder aufgerufen wird. Daher kann ich diese Funktion auch nicht weg optimieren. Zum anderen kannst du die Funktion mit if(!CTR_start_func()) { verwenden, wenn du selber noch Werte einmalig definieren willst. Ansonsten kann man immer CTR_start_func(); verwenden.

So, ich kann erst morgen Abend weiter Verbesserungen liefern.

Na Hallo,

komme bei eurem diskutieren grad nicht mehr mit, darum habe ich mich auch still verhalten. Habt ihr den den Sketch fertig programiert bekommen und wäre er etwas für mich oder sollte ich lieber bei dem bleiben, welchen wir am Wochenende erstellt haben?