Menu for Display

If Alarm.delay(1000) is causing you a problem because it blocks your code for 1 second then you should consider reducing the delay time or better, only calling Alarm.delay() when it will not interfere with the operation of your program, or both, of course.

I think should be better reduce the delay maybe ...

because otherwise how can the timer start ?

Thanks
gnux

Hi Oliver,
you have exactly center my ideas ... :slight_smile:

So:

  • N°Dev --> are the number of the devices
    for example: I can set up timer for the devices from 0 to 7 ...

when I setup the timer from a menu do this:

  • pass the menu value to:
    a) a timer
    b) in eeprom
    c) array (copy of eeprom)
    in this way if the electricity will be down automatically a timer will be set again if wrote into the eeprom.
    The first thing that the software do is read eeprom and pass the value to a local array that is identical to the eeprom.

Then my ideas is change dynamically a timer from a menu ... make sense for you ?

thanks gnux

Hi Oliver,
sorry if i ask you ... But I need to more information about the menu ... looking this menu:

#include <LiquidCrystal.h>	// ensure that the include path is set
#include "M2tk.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

// Forward declaration of the toplevel element
M2_EXTERN_HLIST(top_el_expandable_menu);

/* SetDate 1-1  */
uint8_t dt_day = 1;
uint8_t dt_month = 1;
uint8_t dt_year = 12;
uint8_t dt_min = 1;
uint8_t dt_hour = 1;

void dt_current(void)
{
  
}


void dt_get_from_RTC(void)
{
  
}

void dt_put_to_RTC(void)
{
 
}

void dt_ok_date(m2_el_fnarg_p fnarg)  
{
  dt_put_to_RTC();
  m2_SetRoot(&top_el_expandable_menu); 
}

void time_ok_button(m2_el_fnarg_p fnarg)
{
 dt_put_to_RTC();
  m2_SetRoot(&top_el_expandable_menu); 
}

void view_ok_button(m2_el_fnarg_p fnarg)
{
  dt_current();
  m2_SetRoot(&top_el_expandable_menu);  
}

M2_U8NUM(el_dt_year, "c2", 0,99,&dt_year);
M2_LABEL(el_dt_sep1, "b1", "-");
M2_U8NUM(el_dt_month, "c2", 1,12,&dt_month);
M2_LABEL(el_dt_sep2, "b1", "-");
M2_U8NUM(el_dt_day, "c2", 1,31,&dt_day);

M2_LIST(list_date) = { &el_dt_year, &el_dt_sep1, &el_dt_month, &el_dt_sep2, &el_dt_day };
M2_HLIST(el_date, NULL, list_date);

M2_ROOT(el_dt_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_dt_ok, NULL, "ok", dt_ok_date);
M2_LIST(list_dt_buttons) = {&el_dt_cancel, &el_dt_ok };
M2_HLIST(el_dt_buttons, NULL, list_dt_buttons);

M2_LIST(list_dt) = {&el_date, &el_dt_buttons };
M2_VLIST(el_top_dt, NULL, list_dt);

/* Set time 1-2 ---------------------------------------------------------------------*/

M2_U8NUM(el_dt_hour, "c2", 0,23,&dt_hour);
M2_LABEL(el_dt_c, "b1", ":");
M2_U8NUM(el_dt_min, "c2", 0,59,&dt_min);

M2_LIST(list_time) = { &el_dt_hour, &el_dt_c, &el_dt_min};
M2_HLIST(el_time, NULL, list_time);

M2_ROOT(el_time_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_time_ok, NULL, "ok", time_ok_button);
M2_LIST(list_time_buttons) = {&el_time_cancel, &el_time_ok };
M2_HLIST(el_time_buttons, NULL, list_time_buttons);

M2_LIST(list_t) = {&el_time, &el_time_buttons};
M2_VLIST(el_top_time, NULL, list_t);

/* View DateTime 1-3  */
M2_LABEL(el_dt_view, "b1", "DateTimeNow");
M2_LIST(list_view) = {&el_dt_view};
M2_HLIST(el_view, NULL, list_view);

M2_ROOT(el_view_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_view_ok, NULL, "ok", view_ok_button);
M2_LIST(list_view_buttons) = {&el_view_cancel, &el_view_ok };
M2_HLIST(el_view_buttons, NULL, list_view_buttons);

M2_LIST(list_v) = {&el_view, &el_view_buttons};
M2_VLIST(el_top_view, NULL, list_v);

/* -------------- DEVICE 2 ----------------------*/

uint8_t u8dev = 0;
uint8_t u8stato = 0;

void fn_clean_dev(m2_el_fnarg_p fnarg) {
  u8dev = 0;
}

void dev_ok_button(m2_el_fnarg_p fnarg) {
  
}

void dev_stato_button(m2_el_fnarg_p fnarg) {
 // procedura per recuperare lo stato della periferica
 
}

M2_LABEL(el_num_label1, NULL, "Select Dev:");
M2_U8NUM(el_num_1, NULL, 0, 64, &u8dev);

M2_LABEL(el_num_label2,NULL, "Turn Off/On:");
M2_U8NUM(el_num_2, NULL, 0, 1, &u8stato);

M2_BUTTON(el_num_zero, "f4", "zero", fn_clean_dev);
M2_BUTTON(el_dev_ok, NULL, "ok", dev_ok_button);
M2_BUTTON(el_dev_stato, NULL, "stato", dev_stato_button);
M2_ROOT(el_num_goto_top, "f4", "back", &top_el_expandable_menu);

M2_LIST(num_list) = { 
    &el_num_label1, &el_num_1, 
    &el_num_label2, &el_num_2, 
    &el_dev_ok, &el_num_zero, &el_num_goto_top,&el_dev_stato
};
M2_GRIDLIST(el_num_menu, "c2", num_list);

/* --------------------------- TIMER 3-------------------------- */

uint8_t u8devTimer = 0;  // used for select the devices
uint8_t IsTimerEnable = 0;     // used for say if enable or disable 0 disable 1 enable
// set start date time
uint8_t dt_day_start = 1;
uint8_t dt_month_start = 1;
uint8_t dt_year_start = 13;
uint8_t dt_min_start = 1;
uint8_t dt_hour_start = 1;
// set stop date time
uint8_t dt_day_stop = 1;
uint8_t dt_month_stop = 1;
uint8_t dt_year_stop = 13;
uint8_t dt_min_stop = 1;
uint8_t dt_hour_stop = 1;

void fn_clean_dev_timer(m2_el_fnarg_p fnarg) {
  u8devTimer = 0;
}

void dev_ok_button_timer(m2_el_fnarg_p fnarg) {
  m2_SetRoot(&top_el_expandable_menu);
}

M2_LABEL(el_num_timer, NULL, "Select Dev:");
M2_U8NUM(el_num_t1, NULL, 0, 64, &u8devTimer);

M2_LABEL(el_num_timer2,NULL, "Enable/Disable");
M2_U8NUM(el_num_t2, NULL, 0, 1, &IsTimerEnable);
// Time
M2_LABEL(el_num_timer3,NULL, "Start When");
M2_U8NUM(el_dt_hour_t1start, "c2", 0,23,&dt_hour_start);
M2_LABEL(el_dt_ts, "b1", ":");
M2_U8NUM(el_dt_min_t1start, "c2", 0,59,&dt_min_start);
// Date
M2_U8NUM(dt_year_t1start, "c2", 0,99,&dt_year_start);
M2_LABEL(el_dt_ts1, "b1", "-");
M2_U8NUM(dt_month_t1start, "c2", 1,12,&dt_month_start);
M2_LABEL(el_dt_ts2, "b1", "-");
M2_U8NUM(dt_day_t1start, "c2", 1,31,&dt_day_start);

M2_BUTTON(el_num_zero_timer, "f4", "zero", fn_clean_dev_timer);
M2_BUTTON(el_dev_ok_timer, NULL, "ok", dev_ok_button_timer);
// M2_BUTTON(el_dev_stato_timer, NULL, "stato", dev_stato_button_timer);
M2_ROOT(el_num_goto_top_timer, "f4", "back", &top_el_expandable_menu);

M2_LIST(num_list_timer) = { 
    &el_num_timer, &el_num_t1, 
    &el_num_timer2, &el_num_t2,
    &el_num_timer3, &el_dt_hour_t1start,&el_dt_ts,&el_dt_min_t1start, 
    &el_dev_ok_timer, &el_num_zero_timer, &el_num_goto_top_timer
};
M2_GRIDLIST(el_num_menu_timer, "c2", num_list_timer);


/* --------------------------- main menu-------------------------- */
m2_menu_entry m2_2lmenu_data[] = 
{
  { "DATE/TIME 1", NULL },
  { ". SetDate 1-1", &el_top_dt },
  { ". SetTime 1-2", &el_top_time},
  { ". View DateTime 1-3", &el_top_view},
  { "DEVICES 2", NULL},
  { ". Manage 2-1", &el_num_menu},
  { "TIMER 3", NULL},
  { ". SetTimer 3-1", &el_num_menu_timer},
  { ". ViewTimer 3-2", &el_top_view},
  { NULL, NULL },
};

uint8_t m2_2lmenu_first;
uint8_t m2_2lmenu_cnt;

M2_2LMENU(el_2lmenu,"l4e1w12",&m2_2lmenu_first,&m2_2lmenu_cnt, m2_2lmenu_data,'+','-','\0');
M2_VSB(el_vsb, "l4w1r1", &m2_2lmenu_first, &m2_2lmenu_cnt);
M2_LIST(list_2lmenu) = { &el_2lmenu, &el_vsb };
M2_HLIST(top_el_expandable_menu, NULL, list_2lmenu);



// m2 object and constructor
M2tk m2(&top_el_expandable_menu, m2_es_arduino_serial, m2_eh_2bs, m2_gh_arduino_serial);

/* --------------------------- end menu-------------------------- */

void setup() 
{
     
}

void loop() {
  
     
  // Timer();
  m2.checkKey();
  m2.checkKey();
  if ( m2.handleKey() )
    m2.draw();
  m2.checkKey();
}

right now I have this out put for the time if you try the sketch:

+DATE/TIME 1
+DEVICES 2
-TIMER 3
[ SetTimer 3-1
s
Start 01
: 01
ok zero
back

But I would like to have the outoput for the timer in this way:

+DATE/TIME 1
+DEVICES 2
-TIMER 3
[ SetTimer 3-1
s
Sel Dev: 01 E/D: 0
Start: 01:01 + date (need to implement again because i want to do step by step)
Stop: 01:01 + date (need to implement again because i want to do step by step)
Ok Zero Back

I think is related to the hierarchy mention by you :slight_smile: but i need to take more feeling with that :slight_smile:

is possible from your point of view ?

Thanks for the support and have nice week end :slight_smile:

Hi

I think there is some missunderstanding of the GRIDLIST. I would suggest to read documentation about it. Maybe you could instead of the GRIDLIST use the XYLIST, which might be simpler to use. With the XYLIST you must provide the left position of each child element, which lets you create more easily the menu element.

Oliver

gnusso:
I can set up timer for the devices from 0 to 7 ...

TimeAlarms only normally allows up to 6 alarms to be set concurrently. You can change a line in TimeAlarms.h to increase the limit.

#define dtNBR_ALARMS 6   // max is 255

Thanks to you guys :slight_smile: I will read the documentation for the menu :slight_smile: and I will try your suggest ...

So thanks also for the allarm is important Know how many alarms is possible set ...

warms regards,
gnux

Hi Oliver,
today after hours of I've build the menu ... I've understood how to use x,y list ... but now there is a little problem ... so I've available a lcd 20x4 ... well with my sketch i need more over di 4 rows ... with the sketch that I've did I've note that if i add more of 4 columns the display start to have some issues ... below reported the code ... so from my understating the code is correct: the problem is that with 20 character available, what I've understand is that i cannot put time and date only one rows ...because using x,y in cannot format the field ...then If not wrong this is the calculation :

start date: [000][000][000][000][000] --> totally characters used: 27 (without label and separator) then i need to split on more rows ... :frowning: do you know If id possible fix it ?

if try to copy and paste the code you should understand perfectly what I mean :frowning: in attachment screenshoot also ... thansk for the support ... now i start to understand better also the tutorial is more clear now ...
see in the timer menu :wink:

Thanks for the support :slight_smile:

#include <LiquidCrystal.h>	// ensure that the include path is set
#include "M2tk.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

// Forward declaration of the toplevel element
M2_EXTERN_HLIST(top_el_expandable_menu);

/* SetDate 1-1  */
uint8_t dt_day = 1;
uint8_t dt_month = 1;
uint8_t dt_year = 12;
uint8_t dt_min = 1;
uint8_t dt_hour = 1;

void dt_current(void)
{ 
}

void dt_get_from_RTC(void)
{  
}

void dt_put_to_RTC(void)
{
}

void dt_ok_date(m2_el_fnarg_p fnarg)  
{
  dt_put_to_RTC();
  m2_SetRoot(&top_el_expandable_menu); 
}

void time_ok_button(m2_el_fnarg_p fnarg)
{
 dt_put_to_RTC();
  m2_SetRoot(&top_el_expandable_menu); 
}

void view_ok_button(m2_el_fnarg_p fnarg)
{
  dt_current();
  m2_SetRoot(&top_el_expandable_menu);  
}

M2_U8NUM(el_dt_year, "c2", 0,99,&dt_year);
M2_LABEL(el_dt_sep1, "b1", "-");
M2_U8NUM(el_dt_month, "c2", 1,12,&dt_month);
M2_LABEL(el_dt_sep2, "b1", "-");
M2_U8NUM(el_dt_day, "c2", 1,31,&dt_day);

M2_LIST(list_date) = { &el_dt_year, &el_dt_sep1, &el_dt_month, &el_dt_sep2, &el_dt_day };
M2_HLIST(el_date, NULL, list_date);

M2_ROOT(el_dt_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_dt_ok, NULL, "ok", dt_ok_date);
M2_LIST(list_dt_buttons) = {&el_dt_cancel, &el_dt_ok };
M2_HLIST(el_dt_buttons, NULL, list_dt_buttons);

M2_LIST(list_dt) = {&el_date, &el_dt_buttons };
M2_VLIST(el_top_dt, NULL, list_dt);

/* Set time 1-2 ---------------------------------------------------------------------*/

M2_U8NUM(el_dt_hour, "c2", 0,23,&dt_hour);
M2_LABEL(el_dt_c, "b1", ":");
M2_U8NUM(el_dt_min, "c2", 0,59,&dt_min);

M2_LIST(list_time) = { &el_dt_hour, &el_dt_c, &el_dt_min};
M2_HLIST(el_time, NULL, list_time);

M2_ROOT(el_time_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_time_ok, NULL, "ok", time_ok_button);
M2_LIST(list_time_buttons) = {&el_time_cancel, &el_time_ok };
M2_HLIST(el_time_buttons, NULL, list_time_buttons);

M2_LIST(list_t) = {&el_time, &el_time_buttons};
M2_VLIST(el_top_time, NULL, list_t);

/* View DateTime 1-3  */
// M2_LABEL(el_dt_view, "b1", "DateTimeNow");
//M2_LIST(list_view) = {&el_dt_view};
//M2_HLIST(el_view, NULL, list_view);

// M2_ROOT(el_view_cancel, NULL, "cancel", &top_el_expandable_menu);
M2_BUTTON(el_view_ok, NULL, "ok", view_ok_button);
M2_LIST(list_view_buttons) = {&el_view_ok };
M2_HLIST(el_view_buttons, NULL, list_view_buttons);

M2_LIST(list_v) = {&el_view_buttons};
M2_VLIST(el_top_view, NULL, list_v);

/* -------------- DEVICE 2 ----------------------*/

uint8_t u8dev = 0;
uint8_t u8stato = 0;

void fn_clean_dev(m2_el_fnarg_p fnarg) {
  u8dev = 0;
}

void dev_ok_button(m2_el_fnarg_p fnarg) {
  m2_SetRoot(&top_el_expandable_menu);
}

void dev_stato_button(m2_el_fnarg_p fnarg) {
 // procedura per recuperare lo stato della periferica
 
}

M2_LABEL(el_num_label1, NULL, "Select Dev:");
M2_U8NUM(el_num_1, NULL, 0, 64, &u8dev);

M2_LABEL(el_num_label2,NULL, "Turn Off/On:");
M2_U8NUM(el_num_2, NULL, 0, 1, &u8stato);

M2_BUTTON(el_num_zero, NULL, "Zero", fn_clean_dev);
M2_BUTTON(el_dev_ok, NULL, "Ok", dev_ok_button);
M2_BUTTON(el_dev_stato, NULL, "State", dev_stato_button);
//M2_ROOT(el_num_goto_top, "f4", "back", &top_el_expandable_menu);

M2_LIST(num_list) = { 
    &el_num_label1, &el_num_1, 
    &el_num_label2, &el_num_2, 
    &el_num_zero, &el_dev_stato, &el_dev_ok 
};
M2_GRIDLIST(el_num_menu, "c2", num_list);

/* --------------------------- TIMER 3-------------------------- */

uint8_t u8devTimer = 0;  // used for select the devices
uint8_t IsTimerEnable = 0;     // used for say if enable or disable 0 disable 1 enable
// set start date time
uint8_t dt_day_start = 1;
uint8_t dt_month_start = 1;
uint8_t dt_year_start = 13;
uint8_t dt_min_start = 1;
uint8_t dt_hour_start = 1;
// set stop date time
uint8_t dt_day_stop = 1;
uint8_t dt_month_stop = 1;
uint8_t dt_year_stop = 13;
uint8_t dt_min_stop = 1;
uint8_t dt_hour_stop = 1;

void fn_clean_dev_timer(m2_el_fnarg_p fnarg) {
  u8devTimer = 0;
}

void dev_ok_button_timer(m2_el_fnarg_p fnarg) {
  m2_SetRoot(&top_el_expandable_menu);
}

M2_LABEL(el_num_timer1, "x0y5", "Dev:");
M2_U8NUM(el_num_t1, "x4y5",0, 64, &u8devTimer);
M2_LABEL(el_num_timer2,"x11y5", "E/D:");
M2_U8NUM(el_num_t2, "x14y5", 0, 1, &IsTimerEnable);

M2_LABEL(el_num_timer3,"x0y4", "Start Time:");
M2_U8NUM(el_dt_hour_t1start,"x10y4", 0,23,&dt_hour_start);
M2_U8NUM(el_dt_min_t1start, "x14y4", 0,59,&dt_min_start);
// DATE
M2_LABEL(el_num_timer4,"x0y3", "S.D.:");
M2_U8NUM(dt_day_t1start, "x5y3", 0,99,&dt_day_start);
M2_U8NUM(dt_month_t1start, "x9y3", 1,12,&dt_month_start);
M2_U8NUM(dt_year_t1start, "x13y3", 1,12,&dt_year_start);

// Stop Timer
M2_LABEL(el_num_timer5,"x0y2", "Stop Time:");
M2_U8NUM(el_dt_hour_t1stop,"x10y2", 0,23,&dt_hour_stop);
M2_U8NUM(el_dt_min_t1stop, "x14y2", 0,59,&dt_min_stop);

M2_LABEL(el_num_timer6,"x0y1", "E.D.:");
M2_U8NUM(dt_day_t1stop, "x5y1", 0,99,&dt_day_stop);
M2_U8NUM(dt_month_t1stop, "x9y1", 1,12,&dt_month_stop);
M2_U8NUM(dt_year_t1stop, "x13y1", 1,12,&dt_year_stop);

// pulsanti
M2_BUTTON(el_num_zero_timer, "x0y0", "Zero", fn_clean_dev_timer);
M2_BUTTON(el_dev_ok_timer, "x8y0", "ok", dev_ok_button_timer);
M2_ROOT(el_num_goto_top_timer, "x13y0", "back", &top_el_expandable_menu);

M2_LIST(num_list_timer) = { &el_num_timer1, &el_num_t1,
                            &el_num_timer2,&el_num_t2,
                            &el_num_timer3,&el_dt_hour_t1start,&el_dt_min_t1start,
                            &el_num_timer4,&dt_day_t1start,&dt_month_t1start,&dt_year_t1start,
                            &el_num_timer5,&el_dt_hour_t1stop, &el_dt_min_t1stop,
                            &el_num_timer6,&dt_day_t1stop,&dt_month_t1stop,&dt_year_t1stop,
                            &el_num_zero_timer,&el_dev_ok_timer,&el_num_goto_top_timer,
                          };
M2_XYLIST(el_num_menu_timer, NULL,num_list_timer);
/* --------------------------- main menu-------------------------- */
m2_menu_entry m2_2lmenu_data[] = 
{
  { "DATE/TIME 1", NULL },
  { ". SetDate 1-1", &el_top_dt },
  { ". SetTime 1-2", &el_top_time},
  { ". View DateTime 1-3", &el_top_view},
  { "DEVICES 2", NULL},
  { ". Manage 2-1", &el_num_menu},
  { "TIMER 3", NULL},
  { ". SetTimer 3-1", &el_num_menu_timer},
  { ". ViewTimer 3-2", &el_top_view},
  { NULL, NULL },
};
uint8_t m2_2lmenu_first;
uint8_t m2_2lmenu_cnt;

M2_2LMENU(el_2lmenu,"l4e1w12",&m2_2lmenu_first,&m2_2lmenu_cnt, m2_2lmenu_data,'+','-','\0');
M2_VSB(el_vsb, "l4w1r1", &m2_2lmenu_first, &m2_2lmenu_cnt);
M2_LIST(list_2lmenu) = { &el_2lmenu, &el_vsb };
M2_HLIST(top_el_expandable_menu, NULL, list_2lmenu);

// m2 object and constructor
M2tk m2(&top_el_expandable_menu, m2_es_arduino_serial, m2_eh_2bs, m2_gh_arduino_serial);
/* --------------------------- end menu-------------------------- */
void setup() 
{    
}

void loop() {
  // Timer();
  m2.checkKey();
  m2.checkKey();
  if ( m2.handleKey() )
    m2.draw();
  m2.checkKey(); 
}

Schermata 2013-01-27 a 09.41.57.png

Hi
All number fields have a format option to limit the number of digits which are displayed.

See here: Google Code Archive - Long-term storage for Google Code Project Hosting.

The relevant part is this:
Format Options
c: Number of digits, e.g. "c2" allows numbers between "00" and "99". Note, that this setting must fit to the min and max value.

This means you get the following results

M2_U8NUM(el,"c3",0,255,&number) --> "[000]"
M2_U8NUM(el,"c2",0,31,&number) --> "[00]"
M2_U8NUM(el,"c1",0,9,&number) --> "[0]"

The "c" format option is the key to format the output.
For your xy-grid you need to combine everything:
M2_U8NUM(el,"x0y1c2",0,31,&number) --> "[00]" at position (0,1)

Hope this helps,
Oliver

Edit: Added "code" section

Hi Oliver :-), thanks for the useful information ,

i was see the tutorial :slight_smile: but and I was guess that was possible combine the value :slight_smile:

but I was pass the value into the wrong way :slight_smile: thanks in this way I think I can stay with the four row :slight_smile:

The concept to mix the format is always good ? thanks gnux :wink:

Hi Oliver,
so now the output is like this :

Dev:[000] E/D:000
01 01 01 01 13
01 01 01 01 13
Zero ok back

I think is not Bad ... what do you think ? How do you will improve this ?

Gnux

I am not a GUI designer. If it fullfills you needs, than it should be ok :wink:

Oliver

Hi Oliver,
I've play very well with the new function that I've learned ... so now I was working on the display time ... I don't understood why I cannot show nothing if I arrange the menu in this way...

uint8_t dt_day_disp = RTC.get(DS1307_DATE,false);
uint8_t dt_month_disp = RTC.get(DS1307_MTH,false);
uint8_t dt_year_disp = (RTC.get(DS1307_YR,false)-2000);
uint8_t dt_min_disp = RTC.get(DS1307_MIN,false);
uint8_t dt_hour_disp = RTC.get(DS1307_HR,true);

M2_LABEL(el_dt_l1_disp, "x0y2", "ddmmyy:");
M2_U8NUM(el_dt_day_disp, "x7y2c2r1", 1,31,&dt_day_disp);
M2_U8NUM(el_dt_month_disp, "x11y2c2r1", 1,12,&dt_month_disp);
M2_U8NUM(el_dt_year_disp, "x15y2c2r1", 0,99,&dt_year_disp);

M2_LABEL(el_dt_l2_disp, "x0y1", "hhmm:");
M2_U8NUM(el_dt_hour_disp,"x7y1c2r1", 0,23,&dt_hour_disp);
M2_U8NUM(el_dt_min_disp, "x11y1c2r1", 0,59,&dt_min_disp);

M2_ROOT(el_dt_ok_disp, "x0y0", "ok", &top_el_expandable_menu);



M2_LIST(num_list_date_disp) = { &el_dt_l1_disp,&el_dt_day_disp,&el_dt_month_disp,&el_dt_year_disp,
                           &el_dt_l2_disp,&el_dt_hour_disp,&el_dt_min_disp,
                           &el_dt_ok_disp
                          };
M2_XYLIST(el_list_date_disp, NULL,num_list_date_disp);

and issues is related to this:

uint8_t dt_day_disp = RTC.get(DS1307_DATE,false);
uint8_t dt_month_disp = RTC.get(DS1307_MTH,false);
uint8_t dt_year_disp = (RTC.get(DS1307_YR,false)-2000);
uint8_t dt_min_disp = RTC.get(DS1307_MIN,false);
uint8_t dt_hour_disp = RTC.get(DS1307_HR,true);

now the question that i did to my self and that I forward to you is ... ? Ok I've set a read only field ... but how can I retrieve dynamically date / time and put it on a display ... ?

so i think to have follow your suggestion maybe correct if wrong :slight_smile:

thanks 1000,
gnux

This is explained in tutorial 8: Google Code Archive - Long-term storage for Google Code Project Hosting.
When you jump from your toplevel main menu to the date/time entry you need to call a special procedure (prepare_user_input()) which reads data from external sources and puts them into variables which are shared with m2tklib.

If you would use a list of M2_BUTTON elements as toplevel menu, then the callback procedure for the M2_BUTTON should
(A) read the data from RTC and (B) refer to the date entry menu by using setRoot() procedure.
Tutorial 8 uses M2_STRLIST instead of M2_BUTTON, but the idea is the same.

Oliver

Good Morning Oliver,
so I will look the documentation today and how ever I will proceed with a test and I'll let you know ...

So It fantistic this library ... thanks again for your support ... without I was do nothing ... thanks

have nice week,
gnux

Hi Oliver,
looking the example into your link I've understood how to pass the value :

  • from a menu to the variable

but I don't understand into example:

  • how pass the value from a variable to a menu ... :frowning:

when into the example call

"pwm_apply_user_input() "

inside

void pwd_fn_ok(m2_el_fnarg_p fnarg)
{
pwm_apply_user_input();
m2.setRoot(&top_el_pin_list);
}

so, if need to pass the value to my variable

[00][00] [00][00][00]
OK Cancel

how I can do ? this means that into ok function button I will fill my variable ? and then will be immediatly displayed ?

Could you kindly pass me a simple just to understand ?

thanks for the support,
gnux

Hi
Passing a variable to M2tklib is (somehow) automatic. During definition of an element, such as M2_U8NUM, you pass a pointer to a variable:

uint8_t v;
M2_U8NUM(el_num, "", 0, 255, &v);

Variable "v" is connected to M2tklib. M2tklib will ALWAYS display the value of v. At any time you may assign a value to "v" and after the next call to the "draw" procedure it will display the current content of "v"
Controll flow would be:

  1. Jump from top menu to sub dialog (e.g. time change menu)
  2. During jump: Assign current sensor value (in your case RTC value) to "v" (prepare_user_input)
  3. Let the use change "v" though m2tklib
  4. If user pressed cancel, go back to main menu without any further action
  5. If user presse ok, store value of "v" to the external device (e.g. RTC), jump back to main menu (apply_user_input).

Oliver

Ciao Oliver,
from the logical stand point it's ok ... but to be honest I don't know how to realize it ... so:

uint8_t v;
M2_U8NUM(el_num, "r1", 0, 255, &v);

this is ok, because i use it normally into the menu i fill "v" when I push button ...

Now you mean ... for example into "Ok" button do something like this:

void viewdate{
v = RTC.get(DS1307_HR,true);
}

M2_BUTTON(el_num_zero, "f4", " Ok", viewdate);

then automatically into there will be the current date time ...

I thinks that soon i will be able to the test my menu with display and button ... you was telling me that the button will active when "low",
correct ? is necessary a resistor ? if you can provide to me a little schema will be great :slight_smile: ... so my understanding is this ...

correct ? just the idea what means active low could i test with serial menu ?

so then just add to the sketch this code:

uint8_t uiKeySelectPin = 10;
uint8_t uiKeyNextPin = 9;

and modify this code :

M2tk m2(&top_el_expandable_menu, m2_es_arduino_serial, m2_eh_2bs, m2_gh_arduino_serial);

with this :

M2tk m2(&top_el_expandable_menu, m2_es_arduino, m2_eh_2bs, m2_gh_arduino);

In order to use 2 button ...

if i'd like to use additional 2 but buttons just put this:

M2tk m2(&top_el_expandable_menu, m2_es_arduino, m2_eh_4bs, m2_gh_arduino);

and then declare additional buttons ?

thanks 10000
gnux

Hi

  1. Ok button
    Almost correct, except that you need to use the correct function prototype (see element reference for M2_BUTTON on the wiki page) and probably you want to refer to a submenu. That means, that m2.setRoot() is missing
void viewdate(m2_el_fnarg_p fnarg){
v = RTC.get(DS1307_HR,true);
m2.setRoot(&<nameofsubmenu>)
}
M2_BUTTON(el_num_zero, "f4", " Ok", viewdate);
  1. External button
    Connect one end of the button to an arduino pin
    Connect the other end to ground (0V)
    A resistor is NOT needed.

  2. You need to assign the button with m2.setPin(, <arduino_pin_number>)
    see Google Code Archive - Long-term storage for Google Code Project Hosting.

  3. Adding a display.
    Please follow this tutorial: Google Code Archive - Long-term storage for Google Code Project Hosting.
    Note: The correct name for the graphics handler is "m2_gh_lc"!
    Also take care to use m2_SetLiquidCrystal() as shown in the tutorial!

Oliver

Good Morning Oliver :slight_smile: Great ! Thanks you ... :slight_smile:

so today I'll try and then I'll let you know :slight_smile:

Regards,
gnux