Go Down

Topic: Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen  (Read 262138 times) previous topic - next topic

dimontau

Hello Jomelo. Lay out an example for the st7920 display, the u8glib library.

Dreumi

Halli Hallo an die Gemeinde,

erstmal super großen Respekt vor der geleisteten Arbeit von euch allen und ganz besonders an Jomelo, einfach Weltklasse was Du/Ihr hier auf die Beine gestellt habt!!!!

ich habe eine Frage bezüglich des Menüs.

Ist es möglich, Zahlenwerte in das Menü einzufügen, die via Encoder verändert werden können. Zugleich abgespeichert werden um diese Zahl im weiteren verlauf wieder aufrufen zu können ?

Ich möchte eine Brausteuerung erstellen, es soll ein Wert "X" eingestellt werden, dieser soll durch einen Temperatursensor überprüft werden. Jeh nachdem wie der gemessene Wert mit dem eingestellten Wert übereinstimmt soll sich ein Relais öffnen oder schliessen.

Ich habe schon gesehen das jemand im Forum einen Brausteuerungs Sketch gepostet hat, dieser geht bei mir leider nicht zu kompilieren, eine PN hat der Verfasser bisher nicht beantwortet. Ich wäre euch dankbar wenn mir dazu jemand etwas sagen könnte.

Helfen würde mir natürlich eine schreibweise der Darstellung des Wertes. Viel mehr würde mich aber die richtige Frage interessieren.

Bisher war diese "Wie veränderbaren Zahlenwert auf Display darstellen Arduino" nicht sehr hilfreich.

Ich habe noch keine großen programmier Erfahrungen, möchte mich aber durch den Jomelo Sketch und weiteres einlesen gerne schlauer machen lassen :)

habt ihr also ein paar nützliche Infos ? ICh hoffe es ist okay das ich diese Frage hier poste, sie hat ja auch etwas mit dem Menü zu tun :)

freundliche Grüße

Lutz

Jomelo

Moin,

das geht am besten mit der zweiten Version der Lib. (LCDMenuLib2)
Zum verstellen von Werten im Menü kann man am besten das "999_unittest" Beispiel öffnen. Dieses lässt sich im Serial-Monitor mit den tasten a=links, d=rechts, s=unten, w=oben, e=enter und q=quit steuern.

Unter dem dritten Menüpunkt "DynParam" kann man die Werte mit den Tasten 'a' und 'd' direkt im Menü verstellen. Mit der Taste 'e' könnten rein theoretisch diese Werte gespeichert werden (oder beim verlassen des Menüpunktes).

Schau dir das einfach mal an. Es wird nur ein Arduinon benötigt.
Der Inhalt der Konsole lässt sich auch auf einem Display anzeigen. Dazu kann man andere Beispiele öffnen.

 
while(!success){try++;}

Dreumi

Danke dir, Jomelo, für die schnelle Antwort. Ich habe mich evtl. nicht ganz richtig ausgedrückt und mit dem Wort "Wert" für Verwirrung gesorgt. Oder deine Antwort nicht verstanden :)


Ich habe das Menü wie ich es benötige mal hier reingestellt:
Wie es dann weitergehen soll habe ich in einem Dokument angehängt.

 // LCDMenuLib_add(id, group, prev_layer_element, new_element_num, lang_char_array, callback_function)
  LCDML_DISP_init(_LCDML_DISP_cnt);
  LCDML_DISP_add      (0 , _LCDML_G1  , LCDML_root         , 1  , "selbst brauen"     , LCDML_FUNC);
  LCDML_DISP_add      (1 , _LCDML_G1  , LCDML_root         , 2  , "Rezept"              , LCDML_FUNC);
  LCDML_DISP_add      (2 , _LCDML_G1  , LCDML_root_1      , 1  , "Anzahl Rasten"    , LCDML_FUNC);
  LCDML_DISP_add      (3 , _LCDML_G1  , LCDML_root_1      , 2  , "Einmaischen"       , LCDML_FUNC);
  LCDML_DISP_add      (4 , _LCDML_G1  , LCDML_root_1      , 3  , "Abmaischen"       , LCDML_FUNC);
  LCDML_DISP_add      (5 , _LCDML_G1  , LCDML_root_1      , 4  , "Laeuterruhe"      ,LCDML_FUNC);




Ich hoffe ich konnte es so verständlich darstellen :)

Kann man auf dem Display die jeweiligen Zahlen veränderbar darstellen ?


Ich wünsche ein schönes Wochenende!


Dreumi

super das schaue ich mir doch mal an !

vielen herzlichen dank und einen schönen Abend!

mohammadjawadbarati

Hello jomelo ;)
I have a few questions about the menu that you put it for LCD 20x4 . With your tips and codes, I set up the menu with a keypad and LCD 16x4. :-*

I want to put a 16x2 LCD on the side of the 16x4 LCD and always show the temperature with ds18b20.
I tried several times, but the menu did not work when ds18b20 work.
Now please help me to fix this problem. :smiley-cry:


please help me ...
/////////////////////////////////////////

LCD 16x4 : show menu
LCD 16x2 : always(every moment) show temperature  (and pH and EC)

/////////////////////////////////////////

two LCD are connected to one  arduino mega. ( see schematic please.)

/////////////////////////////////////////

i attached some files , please see this and help me .



Jomelo

Hello, ...

  • Control Tab:  copy the orginal code from an example and only set the configuration to 4. DO NOT comment all other things, you have removed to much. Change your settings.
  • Your NO_KEY constant is not defined
  • do not use a delay(xyz) in your code, the programm stopps and the keypad is not checked. In the example function are examples for the correct handling. You need no delay.
  • With every while / do while function you are blocking the program. Your program cannot work with this. You cannot leave a function.

 
Code: [Select]

// the program will never work with this:
while(LCDML.FUNC_loop()){ 

}

// ...
do{
while(LCDML.FUNC_loop());


Go back to the basics and learn programming. Your current approach has failed
There are many working examples.
while(!success){try++;}

mohammadjawadbarati

hello jomelo , Thank you for your answer.
 I'm not a professional programmer like you.
But now I need to be able to do the schematic that I showed.
Like telling me where to put the temperature codes in which tabs and always work and independent of the menu.

I wish you could help me.

alexandro-rsl

Hallo,

erstmal einen riesigen Dank an den Entwickler des Menus, echt genial das Ding!!!!

Ich möchte das Menü für mein Pumpenprojekt nutzten und bin bereits ein gutes Stück in die Tiefen des Codes eingetaucht. Nun komme ich gerade nicht so ganz weiter.

Ich wollte mir an Stelle des Textes des Screensavers Datum und Uhrzeit anzeigen lassen, die Einbindung hat soweit auch funktioniert. Das Display zeigt nun auch Datum und Uhrzeit an, allerdings aktualisiert es nicht die Anzeige. Die "LCDML.FUNC_setLoopInterval" ist nach meinem Verständnis für die Aktualiesrung des Loop zuständig (Wenn ich falsch liege bitte berichtigen) oder muss ein anderer Befehl genommen werden?

Viele Grüße alexandro-rsl


Code: [Select]
// *********************************************************************
void mFunc_screensaver(uint8_t param)
// *********************************************************************
{
  if(LCDML.FUNC_setup())          // ****** SETUP *********
  {
    // update lcd content
   // lcd.setCursor(0, 0); // set cursor   
   // lcd.print("screensaver"); // print change content
   // lcd.setCursor(0, 1); // set cursor
    //lcd.print("press any key");
    //lcd.setCursor(0, 2); // set cursor
    //lcd.print("to leave it");
    show_time();
    LCDML.FUNC_setLoopInterval(1000);  // starts a trigger event for the loop function every 100 millisecounds
  }

  if(LCDML.FUNC_loop())
  {
    if (LCDML.BT_checkAny()) // check if any button is pressed (enter, up, down, left, right)
    {     
      LCDML.FUNC_goBackToMenu();  // leave this function   
    }
  }

  if(LCDML.FUNC_close())
  {
    // The screensaver go to the root menu
    LCDML.MENU_goRoot();
  }
}


Anbei der Code für die Abfrage und Ausgabe von Datum und Uhrzeit von einer DS3231 RTC:

Code: [Select]
// *********************************************************************
void printTime(void)
// *********************************************************************
{
  lcd.setCursor(0,0);
  lcd.print(dow2String(RTC.dow));
  lcd.print(" "); 
  lcd.print(RTC.yyyy);
  lcd.print("-");
  p2dig(RTC.mm);
  lcd.print("-");
  p2dig(RTC.dd);
 
  lcd.setCursor(0,1);
  p2dig(RTC.h);
  lcd.print(":");
  p2dig(RTC.m);
  lcd.print(":");
  p2dig(RTC.s);
  if (RTC.status(DS3231_12H) == DS3231_ON)
    lcd.print(RTC.pm ? " pm" : " am");
}
// *********************************************************************
void show_time(void)
// *********************************************************************
{
  RTC.readTime();
  printTime();
}
// *********************************************************************
void p2dig(uint8_t v)
// *********************************************************************
{
  if (v < 10) lcd.print("0");
  lcd.print(v);
}

const char *dow2String(uint8_t code)
// Day of week to string. DOW 1=Sunday, 0 is undefined
{
  static const char *str[] = {"---", "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
  return(str[code]);
}



hatschi

Hallo Alexandro-rsl,

deine Funktion schow_time() ist falsch positioniert. Du hast sie in den Setup des Bildschirmschoners gelegt und deshalb wird sie auch nur einmal aufgerufen. Verschiebe sie in den Loop Abschnitt.

So habe ich das gelöst.

Code: [Select]

...
if (LCDML.FUNC_loop())
  {
    //Anzeigen der aktuellen Uhrzeit
    DateTime jetzt = rtc.now();
   blablababl...

alexandro-rsl

Danke für die schnelle und qualifizierte Antwort! Der Tip hat sofort funktioniert!

Eine Frage hätte ich noch: Hat jemand mal probiert die LCD-Beleuchtung nur eine bestimmte Zeit lang aktiv zulassen, wenn eine Manipulation am Eingabemedium erfolgte.

Ich habe die Steuerung des Menus über einen rotary encoder realisiert. Wenn dieser gedreht oder gedrückt wird, soll das backlight aktiviert werden und nach ca. 10sek. Ruhe wieder ausgehen. Grund dafür ist, ich möchte meine Pumpensteuerung off-grid betreiben und da zählt jedes mAh pro Stunde.

Grüße Alexandro-rsl

hatschi

Hallo Alexandro-rsl,

genau an diesem Problem stehe ich auch und finde keine befriedigende Lösung. Deshalb habe ich meine Ansätze hier auch schon hinterlegt

LCDMenuLib2 Display Helligkeit einstellen

Leider habe ich bis jetzt darauf keine Antwort erhalten. Vielleicht gibt es dazu jetzt eine Reaktion wenn die Anfrage in diesem Megathread positioniert ist.

postmaster-ino

Hi

Wenn der Sketch doch auf die Eingaben reagiert, warum nicht einfach nur die aktuelle Bedienzeit merken?

Für das Backlight ein
Code: [Select]
if (aktuellezeit-bedienzeit<10000) {
  if (backlightstatus==false){
     digitalWrite(backlight, HIGH);
    backlightstatus=true;
  }
}else{
  if (backlightstatus==true){
    digitalWrite(backlight, LOW);
    backlightstatus=false;
  }
}

Vll kann man die Abfragen/Änderungen noch zusammen klöppeln (<1000 & false  bzw bei >=1000 & true werden beide Status nur getauscht, müsste auch kleppen)

MfG

hatschi

Die Tastenabfrage reagiert nicht wie gewünscht. Wenn das Programm das Menü anzeigt, dann können die Tasten rauf/runter, abbrechen und bestätigen nicht abgefragt werden. Diese Tastendrücke gehen an die Menüsteuerung und werden dort verarbeitet. Diese Tastenabfrage
Code: [Select]
if (LCDML.BT_checkAny())
  {
    lcd.setCursor(1, 2); lcd.print("Taste gedrückt");
  }

reagiert dann einfach nicht. Lediglich auf die Tasten links/rechts wird mit der IF-Abfrage reagiert. Das ist aber zu wenig. Benötigt wird eine Reaktion auf jeden Tastendruck um die Hintergrundbeleuchtung wieder einzuschalten.
 
Auch der Versuch meine Tastenabfrage vor die Menüsteuerung zu setzen änderte nichts an dem Ergebnis.
Code: [Select]

void loop()
{
  // Die Hintergrundbeleuchtung anpassen
  DisplayDimmen();
  if (LCDML.BT_checkAny())
  {
    lcd.setCursor(1, 2); lcd.print("Taste gedrückt");
  }
  LCDML.loop();
  //Abfragen ob der Verstärker ausgeschaltet werden soll
  jetzt = rtc.now();
  SekundenBisJetzt = jetzt.getEpoch();
  if (SekundenBisJetzt > AusschaltZeit)
  {
    VerstaerkerAusschalten(irsend, DummyAusschaltZeit, AusschaltZeit);
  }
}


Da komme ich jetzt nicht weiter.

Go Up