Sida 1 av 1

Arduino Menysystem Hjälp

Postat: 25 februari 2017, 15:02:13
av Trigger
Hej.

Jag försöker göra ett menysystem, men har nu kört fast:(

Ska försöka förklara vad problemet är:)

När jag starta så kommer jag till första menyn, vilket fungera, där kan jag välja att trycka "A" för att komma till "Längd" menyn eller trycka "B" för att komma till "Bredd" menyn, detta fungerar också.

När jag är i "Längd" menyn kan jag mata in siffror och ta bort siffror, allt fungerar som det ska.
Om jag sen trycker "B" för "Bredd" menyn, så kommer jag in i den menyn, MEN, där kan jag inte
mata in siffror, utan så fort jag gör detta så kommer jag tillbaks till "Längd" menyn???

Allså, "B" menyn skall fungera lika som "A" menyn.

Jag har fått hjälp att skriva delar av koden då jag är ny på detta, menysystemet har jag försökt att göra själv som ni säkert
ser på koden:)

Finns det någon vänlig själ som kan tänkas hjälpa mig att få menyn att fungera?

Tack på förhand

Kod: Markera allt

#include <AccelStepper.h> 
#include <Keypad.h>  
#include <LiquidCrystalFast.h>

LiquidCrystalFast lcd(12, 10, 11, 5, 4, 3, 2);

volatile int aPos=0;
volatile int bPos=0;
volatile int currPos=0;
volatile int aCur=0;
volatile int bCur=0;

int val = 0;  

const byte ROWS = 4;
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {31, 33, 35, 37}; 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Keypad Library definition

#define backlight_pin A2
  
AccelStepper stepperA(1, A0, A1);
AccelStepper stepperB(2, A3, A4);  

void setup() {
  
  lcd.begin(20, 4); 
  lcd.setCursor(0,0);
  lcd.print( "->PALLINSTELLNING<-" );
  lcd.setCursor(0,2);
  lcd.print("A = LENGD"); 
  lcd.setCursor(11,2);
  lcd.print("B = BREDD"); 
  analogWrite(backlight_pin, 250);  
  stepperA.setMaxSpeed(1500);  
  stepperA.setAcceleration(400);
  stepperB.setMaxSpeed(1500);  
  stepperB.setAcceleration(400);

 
  
 
}

void loop(){
  
  pinMode(6, OUTPUT);  
  analogWrite(6, 140);
 
  char keypressed = keypad.getKey();  
  if (keypressed != NO_KEY){     
  switch (keypressed) { 

    
    case '1':   
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case '0':
    
    setPos( keypressed );
    
    
   
     break;
    case 'A':
      menylengd();
      break; 
       
    case 'B':
      menybred();
      break;
      
    case '*':
      deletenumber();
       break;
       
    case '#':
      calculatedistance();
      break;

    case 'C':
      currPos=0;
      break;
      
    case 'D':
      currPos=1;
      break;
    }
  }
}
     
      
void setPos( char num ) {
  int iNum = String(num).toInt();
  switch( currPos ) {
  case 0:
   if( aPos>999) return;
    aPos*=10;
    aPos+=iNum;
    break;
    case 1:
   if( aPos>999) return;
    bPos*=10;
    bPos+=iNum;
    break; 
  }
  

   Lcdlengd();

}



void deletenumber() {  
  switch( currPos ) {
    case 0:
      aPos/=10;
      break;
    case 1:
      bPos/=10;
      break;

    }
  
 Lcdlengd();
  
}  

void menylengd() {  
  switch( currPos ) {
  case 0:
  break;
  }

Lcdlengd();

  
}

void menybred() {  
  switch( currPos ) {
  case 0:
  break;
  }

Lcdbredd();

 }
 
void calculatedistance() {  // Used to create a full number from entered numbers
  if( aPos != aCur ) {
    moveStepper( 0 );
  }
  if( bPos != bCur ) {
    moveStepper( 1 );
  }
Lcdlengd();
  
}



void moveStepper( int which ) {
  lcd.begin( 20,4 );
  lcd.setCursor( 0,1 );
  lcd.print( "->FLYTTAR FOTOCELL<-" );
  lcd.print(" ");
  

  
  
  
  long calculatedmove;
  
  switch( which ) {
    case 0:
      calculatedmove = (aPos * 1938UL)/20;
      stepperA.runToNewPosition( calculatedmove );
      aCur = aPos;
      break;
    case 1:
      calculatedmove = (bPos * 1938UL)/20;
      stepperB.runToNewPosition( calculatedmove );
      bCur = bPos;
      break;
  }
 
Lcdlengd();

   
} 




 
void Lcdbredd() {
  
  String strA = String(bPos)+ "mm"; 
  String strB = String(bCur)+ "mm"; 
  String strC = "----->BREDD<------";
  lcd.begin(20, 4); 
  lcd.setCursor(0,0);
  lcd.print(strC);
  lcd.setCursor(0,2);
  lcd.print(aPos);
  lcd.setCursor(0,2);
  lcd.print(strA); 
  lcd.setCursor(0,1);
  lcd.print("ANGE:");
  lcd.setCursor(14,2);
  lcd.print(strB); 
  lcd.setCursor(8,1);
  lcd.print("AKTUELL POS:");
  
 
  
 
 

  
}

 void Lcdlengd() {
  String strA = String(aPos)+ "mm"; 
  String strB = String(aCur)+ "mm"; 
  String strC = "----->LENGD<------";
  lcd.begin(20, 4); 
  lcd.setCursor(0,0);
  lcd.print(strC);
  lcd.setCursor(0,2);
  lcd.print(aPos);
  lcd.setCursor(0,2);
  lcd.print(strA); 
  lcd.setCursor(0,1);
  lcd.print("ANGE:");
  lcd.setCursor(14,2);
  lcd.print(strB); 
  lcd.setCursor(8,1);
  lcd.print("AKTUELL POS:");
  

}





   





Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 15:54:43
av Icecap
Du måste ju ha en variabel som anger vilket menypunkt du håller på med. Som jag ser det börjar du om hela tiden vid att ta in knapptryckning för varje "varv".

Jag har vanligen en variabel med just menypunkten man håller på med, den kan sedan ha undermenyer om det behövs.

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 16:09:07
av Trigger
Tack för svaret.

Tyvärr är jag för ny på detta för att förstå:(

Hur kan jag lägga till så att jag kan skriva i båda menyerna? , har det inte något med detta att göra?

Kod: Markera allt

void setPos( char num ) {
  int iNum = String(num).toInt();
  switch( currPos ) {
  case 0:
   if( aPos>999) return;
    aPos*=10;
    aPos+=iNum;
    break;
    case 1:
   if( aPos>999) return;
    bPos*=10;
    bPos+=iNum;
    break; 
  }

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 16:19:03
av Icecap
Inte det minste.

Du ska ju trycka på 'B' varje gång du kommer till att det ska tryckas på en knapp för att stanna kvar i menyn.
Du kan alltså INTE välja vilket menypunkt du ska gå till på det sätt!

Du måste ha en variabel som håller vilket menypunkt du håller på med, Huvudmeny, Breddmeny eller Längdmeny.
Sedan kan den variabel användas för att välja vad som ska hända med de numeriska knapptryckningar samt radering osv som sker.

Själv har jag gjort menyer ganska mycket men håller mig mycket långt borta från Arduino för att jag anser att det är skräp på så många sätt. Principen bakom ett menysystem är dock lika i alla fall.

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 16:25:28
av Trigger
Aha...

Då är det nog lite för komplicerat för mig, jag trodde att det var ett mindre fel som gjorde att just "B" menyn inte fungerarde.
Eftersom jag kommer till rätt meny men kan "bara" inte slå in siffror i "b" menyn....

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 17:02:37
av ffredrik
Det egentliga problemet med Arduino är att det saknas en debugger.

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 17:31:19
av Trigger
Tror ni jag behöver ett helt nytt menusystem eller kan den jag har funka? Om man nu löser problemet.

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 18:03:18
av Icecap
Den du har fungerar inte - eller hur?
Hur skulle du då ha kvar det?

I grunden är det inte så himla svårt med det begränsade system du kör.

1: Du behöver en variabel som "vet" vilket menypunkt du är i.
2: Du behöver en rutin för att lägga till och radera tal.

Med så få menypunkter hade jag gjort en rutin för att editera talen och sedan - med menyvariabeln - vald vilka tal den ska redigera. Detta göre enkelt med ett par pekare, rent faktisk behövs bara en som pekar på talet för längden eller höjden.

Jag hade gjort ett par buffrar som håller talen i textform, sedan kan man editera dom.
När "OK" (eller vad du använder) aktiveras konverteras dessa tal till värden och dessa värden sparas.

På det vis använder du en enda rutin till "alla" menypunkter.

Re: Arduino Menysystem Hjälp

Postat: 25 februari 2017, 20:50:48
av hummel
ffredrik skrev:Det egentliga problemet med Arduino är att det saknas en debugger.
Det är sant. Man får ta till en hederlig och gammal beprövad metod. Skriva debugdata på serieporten.

Re: Arduino Menysystem Hjälp

Postat: 26 februari 2017, 15:29:53
av jesse
Trigger skrev:
Icecap skrev:Du måste ju ha en variabel
Aha...

Då är det nog lite för komplicerat för mig
Det är inte så lätt att förklara för någon hur man ska ändra i ett program om den inte kan grunderna i programmering.
Det går inte bara att kopiera kod och sedan köra. Läs nån nybörjarbok om C.

Re: Arduino Menysystem Hjälp

Postat: 26 februari 2017, 15:56:34
av jesse
Sättet programmet är skrivet på verkar lite ... eh... inte som jag skulle ha gjort. Det känns som om det lätt blir krångligt om man skulle bygga ut menyn t.ex.

Men ändå. Jag tittade lite på det. Den där 'variabeln' som Icecap pratade om är väl currPos?

Du ser väl att när du anger en siffra (1-9) så hamnar du alltid i funktionen setPos( keypressed ).
I samma funktion anropar du alltid Lcdlengd(), Så självklart kommer du aldrig till Lcdbredd() då.

Det tycks som om det är variabeln CurrPos som anger vilket värde du editerar för tillfället (aPos eller bPos).
Vad är aPos och vad är bPos? Är det dessa som ska innehålla värdena för langd och bredd?

Varför väljer du meny med 'A' och 'B' ... vad väljer du då med 'C' och 'D'?
jag skulle nog slå ihop dessa och bara använda 'A' och 'B':

Kod: Markera allt

    case 'A':
      currPos=0;
      menylengd();
      break; 
       
    case 'B':
      currPos=1;
      menybred();
      break;
och då skulle funktionen setPos() kunna se ut så här:

Kod: Markera allt

void setPos( char num ) {
  int iNum = String(num).toInt();
  switch( currPos ) {
  case 0:
   if( aPos>999) return;
    aPos*=10;
    aPos+=iNum;
    Lcdlengd();
    break;

    case 1:
   if( aPos>999) return;
    bPos*=10;
    bPos+=iNum;

    Lcdbredd();
    break; 
  }
}
Men som sagt... koden är något kaotisk och jag gillar t.ex. inte att man anropar displayfunktionerna lite överallt.... Det kommer garanterat bli svårare att få det att fungera samt kunna ändra i koden om det ser ut så. Man får försöka tänka sig en viss ordning i programmet:

1) skriv ut AKTUELL menybild till display
2) kolla tangent-tryck
3) utför olika åtgärder beroende på vad som tryckts ner (t.ex. ändra värde, byt menybild, starta operation, radera värde etc...)

Re: Arduino Menysystem Hjälp

Postat: 27 februari 2017, 12:00:57
av Icecap
Jag brukar ha en "Update"-variabel som jag inkrementer när jag har utförd något som ska uppdateras på displayen.

Uppdateringen av displayen dekrementer sedan variabeln om den är sann (större än 0), därmed kan en ändring under tiden det uppdateras fortfarande utlösa en ny uppdatering.