Go Down

Topic: MENWIZ: yet another character lcd menu wizard library (Read 85807 times) previous topic - next topic

Khalid

#270
Dec 25, 2012, 01:56 pm Last Edit: Dec 25, 2012, 02:23 pm by Khalid Reason: 1

About characters, you can use createChar (this is not a MENWIZ char, it is a LiquidCrystal method instead, look at menwiz.cpp). Be carefull: it may conflict with MEWNWIZ, as it also create characters. Use char indexes higher than 3.

Okay,
First i defined this in Setup();
Code: [Select]

byte  Moon[8] = {
B00100,
B01000,
B11000,
B11001,
B11001,
B11111,
B01110,
B00000
};

then i used in the Setup();
Code: [Select]
lcd.createChar(6, Moon);
and after that how can i use this character in user screen in the following function, last 4th line of LCD??
Code: [Select]
void msc(){
 static  char buf[7];
 strcpy(menu.sbuf,"User screen"); //1st lcd line
 strcat(menu.sbuf,"\nUptime (s): ");strcat(menu.sbuf,itoa((int)(millis()/1000),buf,10));//2nd lcd line
 strcat(menu.sbuf,"\nFree mem  : ");strcat(menu.sbuf,itoa((int)menu.freeRam(),buf,10));//3rd lcd line
 strcat(menu.sbuf,"\n"); //4th lcd line (empty)
 menu.drawUsrScreen(menu.sbuf);
 }
 */

Please can you help me.


If you refer to rapidly changes to values in user screen ... there are no  ways other than to introduce a delay ... but it will slow down the interface responsivity. Try values around max 100 millis

Yes, i introduced 250millis delay and its work fine. Thank you:)


... It sound quite strange as in my experience sensors values never changed at such a dramatic pace to let them unreadable on a LCD ... You can also and preferably set a user software implemented delay time before refresh values: store the latest read time and let the value be refreshed after that value (I suggest 500 millis).


Actually i am making Sun Tracking System for the Solar Panel.. The sensors are East and West LDRs.. Now all is okay..
I am very very satisfied with your MENWIZ.. you are great programmer...

I think MENWIZ is one of the complete and simple MENU wizard for Arduino platform. It should be the part of Arduino distributable. I really like the PDF tutorial of the menu. Thank you brunitali.. I hope you shall keep improving this MENWIZ...
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

brunialti

#271
Dec 26, 2012, 07:23 pm Last Edit: Dec 26, 2012, 07:25 pm by brunialti Reason: 1
to display user defined characters yo have to use the write method:
lcd.write(6);

p.s. version 1.2.0 is now available on github

Khalid

Unable to write the user definable character on the USER DISPLAY SCREEN...  8)
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

brunialti

if you use drawUsrScreen, it overwrites the screen with space padding. In this case  you have to insert the character into the buffer you pass to drawUsrScreen with explicit assignment. something like the following.

menu.sbuf[...]=6;

If you do not use drawUsrScreen the write statement should work fine.

Khalid

#274
Dec 27, 2012, 04:02 pm Last Edit: Dec 27, 2012, 04:11 pm by Khalid Reason: 1
Thank You Brunialti,
i want tp write the character in drawUsrScreen ,Can you please provide a small demo  example?.. Actually i am unable to do.. I made a small video on previous MENWIZ 1.1 version here its link.  My sketch compilation size exceeded 22Kb... Still need to implement the code of the dual axis , i hope i will be able to complete within the 32K limit...

Following is a small video of MENWIZ:
https://www.dropbox.com/s/1tb47gyg07h5sbm/MENWIZ%20implementation.mpg


Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

brunialti

Nice video!
this should print your char after the letter V of the first line. You have to put the code chunks at the proper place...

Code: [Select]
byte  Moon[8] = {
B00100,
B01000,
B11000,
B11001,
B11001,
B11111,
B01110,
B00000
};
.....
lcd.createChar(6, Moon);
.....
sprintf(menu.sbuf,"MENWIZ TEST V %s\n.Free mem. :%d\n.Used mem  :%d\n.Lap secs  :%d",menu.getVer(),menu.freeRam(),mem-menu.freeRam(),5);
menu.sbuf[13]=6;
menu.addSplash((char *) menu.sbuf, 5000);


Khalid

wow..Thank You...thank you for helping me and thank you for the MENWIZ:).. i shall make some more videos and post here... I am currently making controller for the suntracker..once completed in a good box, i shall make the working video.
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

Khalid

#277
Dec 27, 2012, 05:24 pm Last Edit: Dec 27, 2012, 05:42 pm by Khalid Reason: 1
Okay,
The symbol of Moon is working now:)..but as the parameters changes it changes it location... Now i want it to fixed place at the end of the buffer. Can we measure the size of buffer sbuf?

EDIT:
If you tell me a method then its good..else the sun symbol moving back and forth looks good:)
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

brunialti

khalid, you can count...
use strlen and put the character at the returned position-1

Khalid

okay got it:

int x=strlen(menu.sbuf);
then

i will place the Moon at x-1.
Regards
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

brunialti

nice work khalid.
I suggest to submit to arduino blog.

Khalid


nice work khalid.
I suggest to submit to arduino blog.

Sure, i shall put that once it complete...
Simply...You can't afford me..

Author Of:
http://my-woodcarving.blogspot.com/
http://www.free3dscans.blogspot.com/
http://my-diysolarwind.blogspot.com/

Oops..some one gave me Karma...:)

Silverdog63

#282
Dec 30, 2012, 05:21 pm Last Edit: Dec 31, 2012, 10:46 am by Silverdog63 Reason: 1
Ciao a tutti,
I am a very beginner (it's my first week on Arduino), no experience in programming, I already read the guide and the book "Getting Started With Arduino 2ndEd" ..... but .... it's still a long way ....
Anyway, what I am trying to do is to make an actuator with a stepper (and a relative mechanical transmission) to move the height of a the saw in a table saw. I need to set the height to a certain amount of mm, or to move of a certain amount on mm.
Now my starting problem is to use Menwiz with the classic LCD Keypad Shield (16x2) that have 5 analog buttons (it's perfectly ok to use only 4).
(From this tutorial which is perfecly working I took some setup:

http://tutorial.cytron.com.my/2011/08/12/project-1-%E2%80%9Chello-world%E2%80%9D-on-lcd/)

Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //this is the working pins

[sup]LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7,
backlightpin, polarity 4 x 20 LCD //this is what I replaced
[/sup]


and from Backbone  post « Reply #188 on: September 27, 2012, 07:17:31 PM » I took his example changing the button parameters:

Code: [Select]

// +++++++ Libaries included
#include <Wire.h>
#include <LiquidCrystal.h>
//INSERT ALL THE LIBARIES AFTER INCLUDING WIRE LIB (MENWIZ request)
#include <LiquidCrystal_I2C.h>
#include <buttons.h>
#include <MENWIZ.h>
#include <EEPROM.h>

// Create global object for menu and lcd
menwiz menu;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
/*LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlightpin, polarity 4 x 20 LCD
*/
boolean wr=0; // Instantiate global variables to bind to menu

const int buttonPin = A0;             // 4 button switch circuit input connected to analog pin 0
const int led13Pin = 13;              // the number of the LED output pin

boolean buttonBlock = 0;
boolean buttonAct = 0; // flag 1
boolean stopMenu = 0; // flag 2
byte buttonPressed = 0;  // which button was pressed
byte lastButtonPressed = 0; // prev button pressed
int buttonValue = 0;  // read value from analog port for the 4 navigation pushbuttons
long menuOffTime = 0;  //used for timer

extern byte MW_navbtn;  //needed to run the software key navigation in Menwiz



void setup()
{
 Serial.begin(9600);                       // Output to serial writing

 digitalWrite((54), HIGH);  // enable the 20k internal pullup for MEGA board for analog port A0
 // digitalWrite((A0), HIGH);  // enable the 20k internal pullup for UNO based board for analog port A0

 //++++++++++++++++++++Menu and LCD  
 char b[84];
 _menu *r,*s1,*s2;

 // initialize the menu object ( 4 x rows x 20 colums LCD)
 menu.begin(&lcd,16,2); //initialize the menwiz menu object passing the lcd object and the colums and rows params
 menu.addUsrNav(navMenu,4);
 MW_navbtn=4;  // force 4 or 6 buttons mode for menu navigation -> MW_navbtn=4; or MW_navbtn=6;

 //create the menu tree
 r=menu.addMenu(MW_ROOT,NULL,F("MAIN MENU"));                      //create a root menu at first (required)

 //---------------  
 s1=menu.addMenu(MW_SUBMENU,r,F("SET1"));                        //add a submenu node 1 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("MD"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("BR"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("RH"));                         //add a terminal node in the menu tree (that is "variable");

 //---------------
 s1=menu.addMenu(MW_SUBMENU,r,F("SET2"));                    //add a submenu node 2 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("CP"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("DB"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("SQ"));                         //add a terminal node in the menu tree (that is "variable");

 //---------------
 s1=menu.addMenu(MW_SUBMENU,r,F("SET3"));                    //add a submenu node 3 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("RS"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("RCALIB"));                     //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("SCALIB"));                     //add a terminal node in the menu tree (that is "variable");

/*
 //++++++ Splash screen +++++++
 
 sprintf(menu.sbuf,"TEST minimum menu\nwith 4 or 6\nanalog push buttons\n",1);
 menu.addSplash((char *) menu.sbuf, 1000);

 //++++++ Userscreen ++++++++++
 // create an user define screen callback to activate after X secs since last button push
 menu.addUsrScreen(msc,3000);
*/
 pinMode(led13Pin, OUTPUT);                // initialize the led as a output control pin
}

void loop()    
{
// NAVIGATION MANAGEMENT & DRAWING ON LCD. NOT BLOCKING has to be the first in the void loop
 menu.draw();
/*
 put your regular code here
  */
 readButtons();
}

//  ++++++ functions +++++++

void readButtons()

// ++++ Control 4 buttons ++++
{
 lastButtonPressed = buttonPressed;

 /*
 Analog values representing the pushbutton value are depending on the resitor value used.
  Test the values first with the serial.monitor
  */
 buttonValue = analogRead(buttonPin); //analog value to simulate the pushed buttons

 if(buttonValue >= 700)
 {
   buttonPressed = 0;
   noButtonPressed(); // is calling an extra fucntion
 }
 else  if(buttonValue >= 470 & buttonValue <= 600)
 {
   buttonPressed = 4;
   buttonAct = 1; // set the menu flag1
 }
 else if(buttonValue >= 300 & buttonValue <=420)
 {    
   buttonPressed = 3;
   buttonAct = 1; // set the menu flag1
 }
 else if(buttonValue >= 100 & buttonValue <=200)
 {    
   buttonPressed = 1;
   buttonAct = 1; // set the menu flag1
 }
 else if(buttonValue >= 10 & buttonValue <=50)
 {    
   buttonPressed = 2;
   buttonAct = 1; // set the menu flag1
 }
}

int noButtonPressed()
{
 return MW_BTNULL;
}

int navMenu() // called from menu.draw
{
 /*
  As soon as a button is pushed the first time flag 1 is set to HIGH and if the buttonnumber is not 0 then a timer is started.
  The menu action then should only be performed once.
  After 2000 msecs the flag will be set to LOW and a new buttonpush can be processed.
  Menu action is blocked for 2000 msec even if the same button is being kept pressed for 2000 msecs by flag2.
  */

 long menublockTime = millis();

 if (buttonAct == 1 && buttonPressed != 0 && stopMenu == 0)  // we have a state were we process a menu navigation step once and block it for 2 secs
 {
   digitalWrite(led13Pin,HIGH);  // set timer led ON
   menuOffTime = menublockTime  + 2000; //start the timer. You can change this blocking time to your convenience but do not make it lower aa 200 msecs
   stopMenu = 1;

   switch (buttonPressed)
   {
   case 1: // Up
     return MW_BTU;
     break;
   case 2: // Confirm
     return MW_BTC;
     break;
   case 3: // Down
     return MW_BTD;
     break;    
   case 4: // Escape
     return MW_BTE;
     break;
   }
 }

 if (menuOffTime != 0  &&  menublockTime  > menuOffTime)  //  Reset of the timer so a new menu action can be processed
 {
   buttonAct = 0; // resets the flag 1
   buttonPressed = 0;
   menuOffTime = 0;  // resets timer to zero
   stopMenu = 0;
   digitalWrite(led13Pin,LOW);  // set timer led OFF
 }
}

// user defined default screen.
void msc()
{
 sprintf(menu.sbuf,"User screen\nUptime (s): %ld\nFree mem  : %d\n\n",millis()/1000,(int)menu.freeRam());
 menu.drawUsrScreen(menu.sbuf);
}


that was the code for the buttons on the "helloWorld" example (it's a completely different approach from the  Backbone one:

Code: [Select]

int analogPin = A0;
int adc_key_old;
int adc_key_in;
int NUM_KEYS = 5;
int key=-1;
int adc_key_val[5] ={30, 150, 360, 535, 760 };  

//omitted some functions , then ...

int get_key(unsigned int input)
{
int k;
   
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
         
   return k;
       }
}
   
   if (k >= NUM_KEYS)
       k = -1;     // No valid key pressed
   
   return k;
}


I am not asking to check all the code, but can somebody check if I did some noticeable error in manipulating the code ?
Thanks from a beginner.
Sergio

tack

I'm planning on having a play with this as it could be the solution to a manu system we need to provide user settings saved to EEPROM.

Reading through it seems that it can use a 4 button or 6 button set up.

6 Buttons - Up, Down, Left, Right, Select, Back
4 Buttons - Up, DOwn, Select, Back

What about 5 Button option, like what you'd have on some default shields:-

5 Buttons - Up, Down, Left, Right, Select

This doesn't have a specific button for the Back option, but couldn't the library incorporate a visual replacement. When in Menu's or on items you'd have a last option of 'BACK' which you just Select as with any other.

Actually, I guess this could also provide you a 3 button option too, along the lines of your existing 4 button plus the 'BACK' display for selection.

brunialti

the visual back solution is interesting. I should'nt be really a problem to implement it and it could be delivered in next release.
About solutions without confirmation: they have a deeper impact, neverthless I could consider to implement such an option as well

@silverdog
at a first glance I see some point to check:
- the following line is not necessary: MW_navbtn=4;
- when you use  addusernav the declared callback should be in charge with button checking and code returning. The call to readButtons() should be therefore inside the callback funcion , not in the loop. the code works the same, but is more polite
- you defined the menu framework, but after each  creation of menu nodes of type MW_VAR you need to create the variable with addVar in order to let the menu working.

I suggest to start from the example, adapt it to your  LCD device at first and when it works properly, modify the menu framework to your design and after introduce the button managemnt

Go Up