lcd menu

IDE gerelateerde berichten
Berichten: 4
Geregistreerd: 03 Apr 2012, 22:37

lcd menu

Berichtdoor Bjorn » 08 Apr 2013, 23:36

Ik weet niet of ik het in de goede topic heb gezet maar anders moet je het maar even laten weten dat ik het verkkeerd heb gedaan.

Ik ben een oplossing aan het zoeken hoe mij lcd menu kan aan sturen.

Ik zou door het menu willen bladeren met 4 knoppen.
Eerste knop up.
tweede knop down.
derde knop enter.
vierde knop esc.

Met deze knoppen zou ik door het menu moeten kunnen scrollen maar ik zou ook in het menu item de waardes willen veranderen.

Ik ben heel benieuwd hoe jullie dit op zullen lossen.
ik kan heel veel informatue vinden hoe ik een menu maak en hoe ik dit met knoppen moet door bladeren meer niet echt informatue hoe ik de waardes kan veranderen in het menu item.

Alvast bedankt.

Advertisement

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: lcd menu

Berichtdoor walker » 09 Apr 2013, 01:11

Je kunt bijv. m.b.v. knop up en knop down een menu item selecteren en dan met de enter knop overschakelen om de waarde van het menu item weer met up en down aan te passen, door de enter enter knop in te drukken kun je de waarde bevestigen en weer terug om door het menu te scrollen. Met de esc knop kun je weer terug zonder de waarde te wijzigen. Voor dit verder uit te kunnen werken heb ik meer informatie nodig.

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: lcd menu

Berichtdoor astrofrostbyte » 09 Apr 2013, 14:56

Ik heb het voor een arduino nooit gemaakt , wel een keer voor de cypress psoc , en wat ik wel kan herrineren is dat het wel aardig wat paginas code oplevert.

Ik zie dat de arduino playground ook aardig wat heeft http://playground.arduino.cc//Main/InterfacingWithHardware#ui daar valt ook wel wat uit te leren hoe zoiets stuctureel opgezet is.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 4
Geregistreerd: 03 Apr 2012, 22:37

Re: lcd menu

Berichtdoor Bjorn » 09 Apr 2013, 22:10

Beste Walker en Astrofrostbyte,

Dankje alvast voor julli ereactie.
Ik ben hier al een heletijd mee bezig om een menu op te zetten.
Ik ben ook al een heel eind alleen ik zit eigenlijk met een groot probleem en kom er eigenlijk niet uit.
Daarom dacht ik waarschijnlijk zijn er meer mensen die dit voor handen hebben gehad.

Onderstaand is het programma dat ik al heb alleen zit met een groot porbleem bij.

int loopConstrain(int x,int a,int b){
if (x == a-1 || x ==255){
return b;
}
if (x == b+1){
return a;
}
Serial.print("x=");
Serial.println(x);
Serial.print("a=");
Serial.println(a);
Serial.print("b=");
Serial.println(b);
return x;
}

Hier is het programma heel onstabiel en loopt ook regelmatig vast.

Hebben jullie misschien een idee hoe ik het kan oplossen?

Alavst vriendelijk bedankt.

Code: Alles selecteren
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <SPI.h>
const int  cs=8; 
LiquidCrystal_I2C lcd(0x27,16,2);

const int buttonPinUp = 2;   
const int buttonPinDown = 3;   
const int buttonPinEsc = A0;   
const int buttonPinEnter = 9;   
const int Sensormicro = A2;

boolean LastValUp = true;
boolean LastValDown = true;
boolean LastValEsc = true;
boolean LastValEnter = true;
boolean autoEnabled = true;

int lcdItem = 0;
int lcdEdit = 0;

boolean timeEnabled[] = {false,false,false};
int timeHours[] = {0,0,0};
int timeMinutes[] = {0,0,0};

int Weight = 0;
byte Value_E1 = 150;
byte Value_E2 = 100;
int C_Day=25;
int C_Month=6;
int C_Year=12;
int C_Hour=14;
int C_Min=49;
int C_second=55;

byte lcdCharUpDown[8] = {
  0b00100,
  0b01110,
  0b11111,
  0b00000,
  0b00000,
  0b11111,
  0b01110,
  0b00100
};

void setup(){
  lcd.init();
  lcd.backlight();
 
  pinMode(buttonPinUp, INPUT);
  pinMode(buttonPinDown, INPUT);
  pinMode(buttonPinEnter, INPUT);
  pinMode(buttonPinEsc, INPUT);
  Serial.begin(9600);
 
}

void loop(){


 
if (lcdEdit == 0){
    lcdItem = loopConstrain(lcdUpDownControl(lcdItem),0,8);
     }
  lcdButtonControl();
  lcdMenu();
  lcdEditValues();
}

void lcdButtonControl(){
  boolean ValEnter=digitalRead(buttonPinEnter);

  if (ValEnter !=LastValEnter){
    if (ValEnter==LOW){
      Serial.print("ENTER");
      lcd.clear();
      lcdEdit ++;
    }
  }
  LastValEnter=ValEnter;
  boolean ValEsc=digitalRead(buttonPinEsc);

  if (ValEsc !=LastValEsc){
    if (ValEsc==LOW){
      lcd.clear();
      lcdItem = 0;
    }
  }

  LastValEsc=ValEsc;
}

boolean lcdUpDownControl(int oldValue){
 
  boolean ValUp=digitalRead(buttonPinUp);


  if (ValUp !=LastValUp){
    if (ValUp==LOW){
       Serial.println("plus");
         LastValUp=ValUp;
         lcd.clear();
      return oldValue + 1;
    }
  }

  LastValUp=ValUp;

   
  boolean ValDown=digitalRead(buttonPinDown);
  if (ValDown !=LastValDown){
    if (ValDown==LOW){
        LastValDown=ValDown;
        lcd.clear();
       
          return oldValue - 1;
       
    }
  }
  LastValDown=ValDown;
  return oldValue;
}
void lcdMenu(){
  switch (lcdItem){
  case 0:

    lcd.setCursor(0,0);
    if (autoEnabled){
      lcd.print("A ");
    }                                               
    else{
      lcd.print("M ");
    }
    lcd.print("1:12:15");
    lcd.setCursor(0,1);
    lcd.print("Temp ");
    lcd.print("25");
    lcd.print(" C      ");
    delay(10);
    break;
  case 1:

    lcd.setCursor (0,0);
    lcd.print ("Time 1");
    break;
  case 2:

    lcd.setCursor (0,0);
    lcd.print ("Time 2");
    break;
  case 3:

    lcd.setCursor (0,0);
    lcd.print ("Time 3");
    break;
  case 4:

    lcd.setCursor (0,0);
    lcd.print ("Weight");
    break;
  case 5:

    lcd.setCursor (0,0);
    lcd.print ("Speed");
    break;
  case 6:

    lcd.setCursor (0,0);
    lcd.print ("Set time");
    break;
  case 7:

    lcd.setCursor (0,0);
    lcd.print ("Set date");
    break;
  case 8:

    lcd.setCursor (0,0);
    lcd.print ("Sample run");
    break;
  }
}
void lcdEditValues(){
 
  byte timeId = 0;
  lcd.setCursor (0,1);
  switch(lcdItem){
  case 0:
  lcdEdit = 0;
  break;
  case 1:
  case 2:
  case 3:
    timeId = lcdItem-1;
    if (timeEnabled[timeId]){
      lcd.print("on");
    }
    else{
      lcd.print("off");
    }
    if (lcdEdit == 1){
      lcd.print('\x00');
      timeEnabled[timeId] = loopConstrain(lcdUpDownControl(timeEnabled[timeId]), 0, 1);
    }
    else{
      lcd.print(" ");
    }
    lcd.print(timeHours[timeId]);
    if (lcdEdit == 2){
      lcd.print('\x00');
      timeHours[timeId] = loopConstrain(lcdUpDownControl(timeHours[timeId]),0,23);//constrain(, 0, 23);
    }
    else{
      lcd.print(" ");
    }
    lcd.print(":");
    lcd.print(timeMinutes[timeId]);
    if (lcdEdit == 3){
      lcd.print('\x00');
      timeMinutes[timeId] = loopConstrain(lcdUpDownControl(timeMinutes[timeId]), 0, 59);
    }
    else{
      lcd.print(" ");
    }
    if (lcdEdit == 4){
      lcdEdit = 0;
    }
    break;
   case 4:
    lcd.print(Weight);
    if (lcdEdit == 1){
      lcd.print('\x00');
      Weight = loopConstrain(lcdUpDownControl(Weight), 0, 1000);
    }
    if (lcdEdit == 2){
      lcdEdit = 0;
    }
    break;
    case 5:
    lcd.print(Value_E2);
    if (lcdEdit == 1){
      lcd.print('\x00');
      Value_E2 = loopConstrain(lcdUpDownControl(Value_E2), 0, 255);
    }
    if (lcdEdit == 2){
      lcdEdit = 0;
    }
    break;
    case 6:
      lcd.print(C_Hour);
    if (lcdEdit == 1){
      lcd.print('\x00');
      C_Hour = loopConstrain(lcdUpDownControl(C_Hour), 0, 23);
    }
     else{
      lcd.print(" ");
    }
    lcd.print(":");
    lcd.print(C_Min);
    if (lcdEdit == 2){
      lcd.print('\x00');
      C_Min = loopConstrain(lcdUpDownControl(C_Min), 0, 59);
    }
    if (lcdEdit == 3){
      SetTimeDate(C_Day,C_Month,C_Year,C_Hour,C_Min,C_second);
      lcdEdit = 0;
    }
    break;
    case 7:
      lcd.print(C_Day);
    if (lcdEdit == 1){
      lcd.print('\x00');
      C_Day= loopConstrain(lcdUpDownControl(C_Day), 1, 31);
    }
     else{
      lcd.print(" ");
    }
    lcd.print("/");
    lcd.print(C_Month);
    if (lcdEdit == 2){
      lcd.print('\x00');
      C_Month = loopConstrain(lcdUpDownControl(C_Month), 1, 12);
    }
         else{
      lcd.print(" ");
    }
    lcd.print("/");
    lcd.print(C_Year);
    if (lcdEdit == 3){
      lcd.print('\x00');
      C_Year = loopConstrain(lcdUpDownControl(C_Year), 0, 99);
    }
    if (lcdEdit == 4){
      SetTimeDate(C_Day,C_Month,C_Year,C_Hour,C_Min,C_second);
      lcdEdit = 0;
    }
    break;
    case 8:
    lcd.print("Press enter to run");
    if (lcdEdit == 1){
      lcdEdit = 0;
    }
    break;
  }
}

int loopConstrain(int x,int a,int b){
if (x == a-1 || x ==255){
   return b;
 }
 if (x == b+1){
   return a;
   }
   Serial.print("x=");
  Serial.println(x);
  Serial.print("a=");
  Serial.println(a);
  Serial.print("b=");
  Serial.println(b);
return x; 
}


int RTC_init(){
     pinMode(cs,OUTPUT);
     SPI.begin();
     SPI.setBitOrder(MSBFIRST);
     SPI.setDataMode(SPI_MODE3); 
     digitalWrite(cs, LOW); 
     SPI.transfer(0x8E);
     SPI.transfer(0x60);
     digitalWrite(cs, HIGH);
     delay(10);
}
//=====================================
int SetTimeDate(int d, int mo, int y, int h, int mi, int s){
   int TimeDate [7]={s,mi,h,0,d,mo,y};
   for(int i=0; i<=6;i++){
      if(i==3)
         i++;
      int b= TimeDate[i]/10;
      int a= TimeDate[i]-b*10;
      if(i==2){
         if (b==2)
            b=B00000010;
         else if (b==1)
            b=B00000001;
      }   
      TimeDate[i]= a+(b<<4);
       
      digitalWrite(cs, LOW);
      SPI.transfer(i+0x80);
      SPI.transfer(TimeDate[i]);       
      digitalWrite(cs, HIGH);
  }
}
//=====================================
String ReadTimeDate(){
   String temp;
   int TimeDate [7];      
   for(int i=0; i<=6;i++){
      if(i==3)
         i++;
      digitalWrite(cs, LOW);
      SPI.transfer(i+0x00);
      unsigned int n = SPI.transfer(0x00);       
      digitalWrite(cs, HIGH);
      int a=n & B00001111;   
      if(i==2){   
         int b=(n & B00110000)>>4;
         if(b==B00000010)
            b=20;       
         else if(b==B00000001)
            b=10;
         TimeDate[i]=a+b;
      }
      else if(i==4){
         int b=(n & B00110000)>>4;
         TimeDate[i]=a+b*10;
      }
      else if(i==5){
         int b=(n & B00010000)>>4;
         TimeDate[i]=a+b*10;
      }
      else if(i==6){
         int b=(n & B11110000)>>4;
         TimeDate[i]=a+b*10;
      }
      else{   
         int b=(n & B01110000)>>4;
         TimeDate[i]=a+b*10;   
         }
   }
       
   temp.concat(TimeDate[4]);
   temp.concat("/") ;
   temp.concat(TimeDate[5]);
   temp.concat("/") ;
   temp.concat(TimeDate[6]);
   temp.concat("  ") ;
   temp.concat(TimeDate[2]);
   temp.concat(":") ;
   temp.concat(TimeDate[1]);
   
  return(temp);
}

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: lcd menu

Berichtdoor walker » 10 Apr 2013, 00:04

Hallo Bjorn,

De functie boolean lcdUpDownControl(int oldValue) geeft een int terug maar is gedeclareerd als boolean (is in c++ 1 byte). Een int wordt in 2 bytes op geslagen, hierdoor kunnen rare dingen gebeuren. Eigenlijk moet de compiler hier een fout melding op geven. Het moet dus int lcdUpDownControl(int oldValue) zijn. Misschien lost dit het vast lopen op.

Berichten: 4
Geregistreerd: 03 Apr 2012, 22:37

Re: lcd menu

Berichtdoor Bjorn » 10 Apr 2013, 23:03

Beste Walker,

Ik heb dde veranderingen getest en het lijkt dat het menu niet meer vast loopt.
Alvast vreindelijk bedankt voor je reactie.

Ik zit alleen nog met een ding en ik denk dat dit ook mee te maken had dat het vast loopt.

Als ik via de serial monitor kijkt en ik kijknaar wat dit stukje programma doet:

Code: Alles selecteren
int loopConstrain(int x,int a,int b){
if (x == a-1 || x ==255){
 return b;
 }
 if (x == b+1){
 return a;
 }
 Serial.print("x=");
 Serial.println(x);
 Serial.print("a=");
 Serial.println(a);
 Serial.print("b=");
 Serial.println(b);
return x;
}


Dan zie ik dat dit stukje het volgende uit geeft a=0 b=8 x=8.
Als ik de Autoscroll aan vinkt dan komt dit als maar opnieuw zonder dat ik een knop aanraakt.

Ook als ik de arduino opnieuw opstart komt deze altijd in case 8 terecht en deze zou eigenlijk in case 0 moeten starten.
Ik moet dan eerst escape toets indrukken om het op te lossen.

Kunnen jullie mij ook vertellen wat ik hier misschien verkeert heb gedaan.

Alvast bedankt

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: lcd menu

Berichtdoor walker » 11 Apr 2013, 20:47

Hoi Bjorn,

Autoscroll kan ik niet in je code vinden, alleen autoEnabled maar deze doet niets anders dan "A" of "M" op het display weergeven.
Wel zit er nog een boolean int probleem in. Je moet eigenlijk de boolean converteren naar int en omgekeerd bijv.:
timeEnabled[timeId] = loopConstrain(lcdUpDownControl(timeEnabled[timeId]) ? 1 : 0, 0, 1) != 0;

Ik zie niet waarom het programma met lcdItem waarde 8 start i.p.v. waarde 0. Escape zet lcdItem weer op 0. Je zou in de setup functie nog eens lcdItem op 0 kunnen zetten.

Contact dender van de druktoetsen kan ook problemen veroorzaken.

Berichten: 4
Geregistreerd: 03 Apr 2012, 22:37

Re: lcd menu

Berichtdoor Bjorn » 14 Apr 2013, 19:45

Hoi Walker,

Met de autoscroll, bedoel ik de autoscroll in de serial monitor.

Dit heeft niks met de lcd op de arduino te maken.
Ik denk dat ikhet niet zo lekker op geschreven heb.

Sorry voor het ongemak.

Kan de contact dender ook last hebben bij het opstarten van de arduino ook al druk ik niet op de knop??

Alvast heel veel bedankt voor de reacties.

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: lcd menu

Berichtdoor walker » 14 Apr 2013, 21:56

Hoi Bjorn,

Zelf heb ik hier geen I2c LCD bij de hand, maar ik heb je code aangepast zodat alles naar de seriële poort gaat. Alle 4 de toetsen worden "bediend" en als laatste de down vandaar dat er 8 uitkomt.
Als je de setup functie aanpast zoals hieronder staat zou het moeten werken. De LastVal's van de druktoetsen worden nu op de huidige waarde van de betreffende ingang gezet.

Code: Alles selecteren
void setup(){
  lcd.init();
  lcd.backlight();
 
  pinMode(buttonPinUp, INPUT);
  pinMode(buttonPinDown, INPUT);
  pinMode(buttonPinEnter, INPUT);
  pinMode(buttonPinEsc, INPUT);
  Serial.begin(9600);

  lcdItem = 0;
  lcdEdit = 0;

  LastValDown = digitalRead(buttonPinDown);
  LastValUp = digitalRead(buttonPinUp);
  LastValEnter = digitalRead(buttonPinEnter);
  LastValEsc = digitalRead(buttonPinEsc);
}

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten