menu met rotary


hallo,

mijn  tweede vraag op het forum.

ik ben bezig met een bierbrouwerij project en dit naderd voltooing, maar nu wil ik hier een menu inbouwen wat gestuurd wordt door een rotary.
na afstruinen van internet en diverse dingen geprobeerd te hebben heb ik een code gevonden welke een foutmelding geeft namelijk read encoder not declared. kan iemand vertellen welke waarschijnlijk domme fout ik hier maak aangezien ik er niet uitkom?

hieronder deel 1 van de code

code: [select]


/*
required global variables & definitions
*/
#define movecursor 1  // constants indicating whether cursor should redrawn
#define movelist 2  // constants indicating whether cursor should redrawn
byte totalrows = 4;  // total rows of lcd
byte totalcols = 20;  // total columns of lcd
unsigned long timeouttime = 0;  // set , compared millis see when user last did something.
const int menutimeout = 10000; // time timeout in menu when user doesn't anything.


/*
menu routine
*/
void basicmenu(){

  byte topitemdisplayed = 0;  // stores menu item displayed @ top of lcd screen
  byte cursorposition = 0;  // cursor on screen, 0 --> totalrows.

  // redraw = 0  - don't redraw
  // redraw = 1 - redraw cursor
  // redraw = 2 - redraw list
  byte redraw = movelist;  // triggers whether menu redrawn after cursor move.
  byte i=0; // temp variable loops.
  byte totalmenuitems = 0;  //a while loop below set # of menu items.

// put menu items here. remember, first item have 'position' of 0.
  char* menuitems[]={
    "set timer 1",
    "set timer 2",
    "set probe 1 temp",
    "set probe 2 temp",
    "probe 1 controller",
    "probe 2 controller",
    "advanced settings",
    "",
  };

  while (menuitems[totalmenuitems] != ""){
    totalmenuitems++;  // count how many items in list.
  }
  totalmenuitems--;  //subtract 1 know total items in array.

 // lcd.clear();  // clear screen can paint menu.

  boolean stillselecting = true;  // set because user still selecting.

  timeouttime = millis() + menutimeout; // set initial timeout limit.

  do   // loop while waiting user select.
  {

    /*
    if want other code going on in background
    while waiting user something, put here
    */
  
    /*
    my code uses rotary encoder input.
    you should change code meet needs.
    for button, this, note that
    it not have debouncing , scroll long as
    the button being pushed. not button tutorial,
    so should elsewhere on how implement that. just
    remember of code between corresponding 'case'
    and 'break' should moved each button push routine.
  
  
    buttonstate = digitalread(buttonpin);
    if (buttonstate == high) {    
      and put corresponding code
      from below here
  }
  */

en deel 2

code: [select]
  switch (read_encoder()
    {  // analyze encoder response. default 0.


    case 1:  // encoder rotated up. equivalent of 'up' button pushed

      timeouttime = millis()+menutimeout;  // reset timeout timer
      //  if cursor @ top , menu not @ top
      //  move menu one.
      if(cursorposition == 0 && topitemdisplayed > 0)  //  cursor @ top of lcd, , there higher menu items still displayed.
      {
        topitemdisplayed--;  // move top menu item displayed one.
        redraw = movelist;  // redraw entire menu
      }

      // if cursor not @ top, move one.
      if(cursorposition>0)
      {
        cursorposition--;  // move cursor one.
        redraw = movecursor;  // redraw cursor.
      }
      break;

    case 2:    // encoder rotated up. equivalent of 'down' button pushed

      timeouttime = millis()+menutimeout;  // reset timeout timer
      // sees if there menu items below bottom of lcd screen & sees if cursor @ bottom of lcd
      if((topitemdisplayed + (totalrows-1)) < totalmenuitems && cursorposition == (totalrows-1))
      {
        topitemdisplayed++;  // move menu down one
        redraw = movelist;  // redraw entire menu
      }
      if(cursorposition<(totalrows-1))  // cursor not @ bottom of lcd, move down one.
      {
        cursorposition++;  // move cursor down one
        redraw = movecursor;  // redraw cursor.
      }
      break;

    case 4:  // encoder button pushed short period & released.
             // equivalent 'select' or 'okay' being pushed

      timeouttime = millis()+menutimeout;  // reset timeout timer
      switch(topitemdisplayed + cursorposition) // adding these values = on menuitems cursor is.
      {
      //  put code run when specific item selected in place of serial.print filler.
      // serial.print code can removed, not change case & break structure.
      // (obviously, should have many case instances menu items.)
      case 0:  // menu item 1 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        // there no menusubmenu1() function. but, have nested menus,
        // copy function(i.e. of basicmenu) new function named
        // whatever want sub menu items , repeat.
//        menusubmenu1();
        break;

      case 1:  // menu item 2 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;

      case 2:  // menu item 3 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;

      case 3:  // menu item 4 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;

      case 4:  // menu item 5 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;

      case 5:  // menu item 6 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;


      case 6:  // menu item 7 selected
        serial.print("menu item ");
        serial.print(topitemdisplayed + cursorposition);
        serial.print(" selected - ");
        serial.println(menuitems[topitemdisplayed + cursorposition]);
        break;
       
        // add many "case #:" items have. put
        //  line separators in menulist , leave out the
        //  corresponding case, mean nothing
        // triggered when user selected line separator.
      }
      break;
     
    case 8:  // encoder button pushed long time. corresponds "back" or "cancel" being pushed.
      stillselecting = false;
      serial.println("button held long time");
      break;

    }

    switch(redraw){  //  checks if menu should redrawn @ all.
    case movecursor:  // cursor needs moved.
      redraw = false;  // reset flag.
      if (cursorposition > totalmenuitems) // keeps cursor moving beyond menu items.
        cursorposition = totalmenuitems;
      for(i = 0; < (totalrows); i++){  // loop through of lines on lcd
        lcd.setcursor(0,i);
        lcd.print(" ");                      // , erase displayed cursor
        lcd.setcursor((totalcols-1), i);
        lcd.print(" ");
      }
      lcd.setcursor(0,cursorposition);      // go lcd line new cursor should & display it.
      lcd.print(">");
      lcd.setcursor((totalcols-1), cursorposition);
      lcd.print("<");
      break;  // movecursor break.

    case movelist:  // entire menu needs redrawn
      redraw=movecursor;  // redraw cursor after clearing lcd , printing menu.
      lcd.clear(); // clear screen can repainted.
      if(totalmenuitems>((totalrows-1))){  // if there more menu items lcd rows, cycle through menu items.
        (i = 0; < (totalrows); i++){
          lcd.setcursor(1,i);
          lcd.print(menuitems[topitemdisplayed + i]);
        }
      }
      else{  // if menu has less items lcd rows, display available menu items.
        (i = 0; < totalmenuitems+1; i++){
          lcd.setcursor(1,i);
          lcd.print(menuitems[topitemdisplayed + i]);
        }
      }
      break;  // movelist break
    }

    if (timeouttime<millis()){  // user hasn't done in awhile
      stillselecting = false;  // tell loop bail out.
      /*
      in main code, had function that
       displayed default screen on lcd, so
       i put function here, , would
       bail out default screen.
       defaultscreen();
       */
    }
  }


  while (stillselecting == true);  //
}


Arduino Forum > International > Nederlands (Moderators: Jantje, JO3RI) > menu met rotary


arduino

Comments