Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #360 on: February 03, 2013, 10:20:49 pm » |
Declare your variable as Float and s3->addVar(MW_AUTO_FLOAT,&HeightZ,0,100,0.1);
|
|
|
|
|
Logged
|
|
|
|
|
Roma
Offline
Jr. Member
Karma: 0
Posts: 76
Mechmate #70
|
 |
« Reply #361 on: February 04, 2013, 03:19:30 am » |
Thanks Khalid, I had doubt because they told me to not use float because sometimes gives erratic rounding values .... don't know why .... changing the variable from INT to FLOAt is ok ? Sorry I dnon't know how many times you need telling DO NOT USE A FLOAT!!!!! You will suffer from rounding errors. Mathematical operations will not be commutative. What do you not understand about using an int with the numbers greater than your resolution?
|
|
|
|
|
Logged
|
|
|
|
|
Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #362 on: February 04, 2013, 08:56:13 am » |
Thanks Khalid, I had doubt because they told me to not use float because sometimes gives erratic rounding values .... don't know why ....
I am using it without any trouble...Without the Float you will unable to do step increment like 0.1mm etc...
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Online
Tesla Member
Karma: 91
Posts: 9444
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #363 on: February 04, 2013, 01:07:37 pm » |
Saw this one about floats: "Working with floating point is like moving piles of sand. Every time you move one you lose a little sand and pick up a little dirt." In practice you can do a lot of things with floating points, they have their own points of extra attention, just like integers and bytes etc. e.g. adding 0.1 in a loop give another kind of error that calculating the next value with a multiply float f = 0; while (f< 1.0) { Serial.println(f, 8); f += 0.01; }
float f = 0; int n = 0; while ( f < 1.0); { Serial.println(f, 8); n++; f = n*0.01; } In the first loop 100 rounding errors add up, in the second there is only one rounding error (OK it uses an extra integer)
|
|
|
|
« Last Edit: February 04, 2013, 01:16:07 pm by robtillaart »
|
Logged
|
|
|
|
|
Norway
Offline
Newbie
Karma: 0
Posts: 17
|
 |
« Reply #364 on: February 04, 2013, 04:31:50 pm » |
I am having trouble when using the MW_BOOLEAN. When changing the value, the display updates from OFF to ON in a flicker and goes back to OFF again  (I think it worked on MENWIZ 1.0.2.). I have searched the forum and looked at the examples, but found no help. Any of you have an idea of what I am missing? boolean mashPump = false; // on-off state for pump boolean running = false; // on-off state for BrewCtrl, execute the pid control or only do logging
void setup() { Serial.begin(9600); _menu *r,*s1,*s2; menu.begin(&lcd,20,4); //declare lcd object and screen size to menwiz lib menu.setBehaviour(MW_MENU_INDEX,false); // turn off the menu index - 1/3 etc menu.addUsrNav(navMenu,4); r=menu.addMenu(MW_ROOT,NULL,F("BC Main menu")); s1=menu.addMenu(MW_VAR,r, F("Set BC On/Off")); s1->addVar(MW_BOOLEAN,&running); s1=menu.addMenu(MW_VAR,r, F("Set pump On/Off")); s1->addVar(MW_BOOLEAN,&mashPump); The full code is attached to post #358.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 1
Posts: 54
|
 |
« Reply #365 on: February 05, 2013, 11:47:20 pm » |
Hello, First I want to thank you for an amazingly cool library, it has enhanced my project so much. So here is what I'm running into I wonder if you might be able to help, I am a novice, but I manage. I have a variable I use to set the number of identical menu options that control an array of variables, below is a sniplet of working code. s1=menu.addMenu(MW_SUBMENU,r,F("Lights")); for (int count = 0; count < PWMs; count++){ Serial.println(menuname); String current = "PWM" + String(count); s2=menu.addMenu(MW_SUBMENU,s1,F("PWM")); s3=menu.addMenu(MW_VAR,s2,F("Mode")); s3->addVar(MW_LIST,&PWM_Mode[count]); s3->addItem(MW_LIST,F("Auto")); s3->addItem(MW_LIST,F("On")); s3->addItem(MW_LIST,F("Off")); s3=menu.addMenu(MW_VAR,s2,F("Level")); s3->addVar(MW_AUTO_BYTE,&PWM_Level[count],0,100,5); s3=menu.addMenu(MW_VAR,s2,F("Soft")); s3->addVar(MW_AUTO_BYTE,&PWM_Soft[count],0,180,5); s3=menu.addMenu(MW_SUBMENU,s2,F("Schedule")); s4=menu.addMenu(MW_SUBMENU,s3,F("Start")); s5=menu.addMenu(MW_VAR,s4,F("Hour")); s5->addVar(MW_AUTO_BYTE,&PWM_StartHH[count],0,23,1); s5=menu.addMenu(MW_VAR,s4,F("Minute")); s5->addVar(MW_AUTO_BYTE,&PWM_StartMM[count],0,59,1); s4=menu.addMenu(MW_SUBMENU,s3,F("End")); s5=menu.addMenu(MW_VAR,s4,F("Hour")); s5->addVar(MW_AUTO_BYTE,&PWM_EndHH[count],0,23,1); s5=menu.addMenu(MW_VAR,s4,F("Minute")); s5->addVar(MW_AUTO_BYTE,&PWM_EndMM[count],0,59,1); } This works great Except I would like to name the "s2=menu.addMenu(MW_SUBMENU,s1,F("PWM"));" PWM1, PWM2, PWM3 etc etc etc.. So I tried this. s2=menu.addMenu(MW_SUBMENU,s1,F("PWM" + String(count))); but the error I get is "error: initializer fails to determine size of '__c" I've read about string buffers but I get a little lost, I've tried to dig through the .cpp and .h files but can't make much sense of it. Any Help you can provide would be great!, Thanks!
|
|
|
|
« Last Edit: February 06, 2013, 12:04:53 am by jbaum81 »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 1
Posts: 54
|
 |
« Reply #366 on: February 05, 2013, 11:59:47 pm » |
On a side note, I've found a way to make the Menwiz Lib work with the Adafruit I2c backpack. You need the following: Adafruit LiquidTWI2 library available here https://github.com/lincomatic/LiquidTWI2Make these changes to MENWIZ.H
//#include <LCD.h> and //MW_LCD* lcd; LiquidTWI2* lcd; Make this Change to MENWIZ.CPP
//lcd=(MW_LCD*)l; lcd=(LiquidTWI2*)l; Make these changes to your sketch//#include <LCD.h> //#include <LiquidCrystal_I2C.h> #include <LiquidTWI2.h> and //LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); LiquidTWI2 lcd(0); and lcd.setMCPType(LTI_TYPE_MCP23008); // add this at the top of void setup() Hope this helps someone. --EDIT-- I found the MENWIZ lib changes in a blog that originally made them work with the LiquidTWI library, when trying to figure out how to make the Adafruit I2c backpack work with LiquidTWI I stumbled on their fork. I do not know the name, nor can I find the blog I found the original information on. My I'd give credit if I could find it.
|
|
|
|
« Last Edit: February 06, 2013, 12:02:40 am by jbaum81 »
|
Logged
|
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 342
|
 |
« Reply #367 on: February 27, 2013, 04:15:01 pm » |
Hi guys. I'm back. I've lost all the reply notifications, without any apparent reason. I'll try to work on menwiz in order to implement some improvement as soon as possible.
I'm also working on a completely different slim library implementing the notion of "watchdog" on any user variable. In this new lib it is possible to create for any user defined variable some triggers, that is an action to be fired when the trigger conditions (>,=, <,null for now) are verified. As many sketches are nothing else than a continuous control on some variable values, this lib let the user concentrate on the actions to be performed instead of the control logic, allowing very compact user code... stay tuned !
|
|
|
|
|
Logged
|
|
|
|
|
Pakistan
Offline
Sr. Member
Karma: 5
Posts: 318
Arduino rocks
|
 |
« Reply #368 on: March 04, 2013, 12:07:30 pm » |
Hi, I will be the one who will use your great library...  Thank You for sharing 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 1
Posts: 54
|
 |
« Reply #369 on: March 11, 2013, 05:46:22 pm » |
 Is Bump, against forum rules? I was curious because I'm still stuck on the problem I've listed in a previous post.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #370 on: March 20, 2013, 08:37:24 pm » |
Hello, I am trying to use Menwiz with my setup using an encoder (see code below - I have borrowed a lot from others in this thread!). I have tried setting up an exit function in the menu so I can escape back up to the previous level. The function works as expected but once I exit a submenu I cannot re-enter it without resetting the Arduino. It seems that when I try to re-enter the submenu it automatically selects 'exit' and brings me right back out. I don't think it is a button debounce issue because it seems to be working fine otherwise. Any thoughts on why this might be happening? I have the feeling I am missing something simple... //The full code is in library example file Quick_tour.ino #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #include <buttons.h> #include <MENWIZ.h> #include <EEPROM.h> #include <rotary.h> #include <Bounce.h>
menwiz tree; LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// ENCODER Rotary r = Rotary(2, 3); int encoderSwitchPin = 4; //push button switch volatile int virtualButton = 0;
// Instantiate a Bounce object with a 5 millisecond debounce time Bounce bouncer = Bounce(encoderSwitchPin, 150);
// MENWIZ int list,sp = 110; float setTemp = 25; float whiOn = 6; float whiOff = 18; float actOn = 6; float actOff = 18; float ledOn = 6; float ledOff = 18;
void setup(){ // MENWIZ _menu *r,*s1,*s2; Serial.begin(9600); tree.begin(&lcd,16,2); //declare lcd object and screen size to menwiz lib tree.addUsrNav(navMenu,4); r=tree.addMenu(MW_ROOT, NULL, F("Root")); s1=tree.addMenu(MW_SUBMENU,r, F("Temperature")); s2=tree.addMenu(MW_VAR,s1, F("Set Temp")); s2->addVar(MW_AUTO_FLOAT, &setTemp, 20, 30, 0.1); s2=tree.addMenu(MW_VAR,s1, F("Exit")); s2->addVar(MW_ACTION, escapeFunc); s2->setBehaviour(MW_ACTION_CONFIRM, false); s1=tree.addMenu(MW_SUBMENU,r, F("Lights")); s2=tree.addMenu(MW_VAR,s1, F("white ON")); s2->addVar(MW_AUTO_FLOAT, &whiOn, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("white OFF")); s2->addVar(MW_AUTO_FLOAT, &whiOff, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("actinic ON")); s2->addVar(MW_AUTO_FLOAT, &actOn, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("actinic OFF")); s2->addVar(MW_AUTO_FLOAT, &actOff, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("LED ON")); s2->addVar(MW_AUTO_FLOAT, &ledOn, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("LED OFF")); s2->addVar(MW_AUTO_FLOAT, &ledOff, 0, 24, 0.5); s2=tree.addMenu(MW_VAR,s1, F("Exit")); s2->addVar(MW_ACTION, escapeFunc); s2->setBehaviour(MW_ACTION_CONFIRM, false);
tree.addUsrScreen(msc,10000);
// ENCODER pinMode(encoderSwitchPin, INPUT); digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on PCICR |= (1 << PCIE2); PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); sei(); }
void loop(){ tree.draw(); // Update the debouncer bouncer.update ( ); // Get the update value int value = bouncer.read(); //if(digitalRead(encoderSwitchPin) == LOW) if (value == LOW) { virtualButton = 3; } } void msc(){ static char buf[7]; strcpy(tree.sbuf,"User screen"); //1st lcd line strcat(tree.sbuf,"\nsetTemp : ");strcat(tree.sbuf, dtostrf(setTemp, 4, 1, buf)); tree.drawUsrScreen(tree.sbuf); }
void myfunc(){ Serial.println("ACTION FIRED"); }
int navMenu() { switch(virtualButton) { case 1: // RIGHT virtualButton = 0; return MW_BTD; break; case 2: // LEFT virtualButton = 0; return MW_BTU; break; case 3: // CONFIRM virtualButton = 0; return MW_BTC; break; case 4: // Escape virtualButton = 0; return MW_BTE; break; case 0: // NONE return MW_BTNULL; break; } }
ISR(PCINT2_vect) { unsigned char result = r.process(); if (result) { if (result == DIR_CW) { virtualButton = 1; } if (result == DIR_CCW) { virtualButton = 2; } } }
void escapeFunc() { virtualButton = 4; }
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 138
Posts: 19067
I don't think you connected the grounds, Dave.
|
 |
« Reply #371 on: April 03, 2013, 07:50:28 am » |
if(list,dc == 0) What's that? Please use code tags when posting code. int list,dc = 0; // Drops Count, Nmber of drops to produce. byte ds = 0; // Drops Size, in Milliseconds,Time Solenoid Valve stays open. byte di12 = 0; // Drops Interval, in Millisecons, Time Between Drops 1 & 2 That Solenoids Shuts off. byte di23 = 0; // Drops Interval, in Millisecons, Time Between Drops 1 & 2 That Solenoids Shuts off. int svpd = 0; // Solenoid Valve Purge Delay. byte svpdo = 2; // Digital Out Pin For Solenoid Valve Purge. byte dgo = 3; // Digital Out Pin For Go Drop Launch. byte sd = 0; // Sensor's Delay Value. byte st = 0; // Sensor's Threshold Value int bmd = 0; // Bulb Delay, When Button Pressed To Confirm, Shutter will Trigger In Bulb Mode For That Set delay. byte bmo = 4; // Digital Out Pin For Bulb Mode. byte sdo = 5; // Digital Out Pin For Shutter.
Mixing (constant) pin numbers in with variables is a really bad idea.
|
|
|
|
« Last Edit: April 03, 2013, 07:53:19 am by AWOL »
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 138
Posts: 19067
I don't think you connected the grounds, Dave.
|
 |
« Reply #372 on: April 03, 2013, 11:54:06 am » |
if(list,dc == 0) refers to the number of drop from 1 to 3 is set up in Drop count menu Nope, sorry, I'm not seeing it. Can you point to some similar code like that? What I'm seeing is "is "list" non zero? Discard that result. Is "dc" equal to zero? If so do something on that basis." I can see no reason to have "list" in that expression.
|
|
|
|
« Last Edit: April 03, 2013, 11:58:58 am by AWOL »
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 342
|
 |
« Reply #373 on: April 03, 2013, 02:57:49 pm » |
@JBAUM81
F("...") is not a real function. It is a macro, that is a #define The macro expansion probably does not produce a compilable code...
|
|
|
|
|
Logged
|
|
|
|
|
|