Arduino Menysystem Hjälp

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Trigger
Inlägg: 27
Blev medlem: 12 september 2011, 09:51:26

Arduino Menysystem Hjälp

Inlägg 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:");
  

}





   




Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino Menysystem Hjälp

Inlägg 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.
Trigger
Inlägg: 27
Blev medlem: 12 september 2011, 09:51:26

Re: Arduino Menysystem Hjälp

Inlägg 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; 
  }
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino Menysystem Hjälp

Inlägg 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.
Trigger
Inlägg: 27
Blev medlem: 12 september 2011, 09:51:26

Re: Arduino Menysystem Hjälp

Inlägg 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....
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Arduino Menysystem Hjälp

Inlägg av ffredrik »

Det egentliga problemet med Arduino är att det saknas en debugger.
Trigger
Inlägg: 27
Blev medlem: 12 september 2011, 09:51:26

Re: Arduino Menysystem Hjälp

Inlägg av Trigger »

Tror ni jag behöver ett helt nytt menusystem eller kan den jag har funka? Om man nu löser problemet.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino Menysystem Hjälp

Inlägg 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.
hummel
Inlägg: 2259
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Arduino Menysystem Hjälp

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino Menysystem Hjälp

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino Menysystem Hjälp

Inlägg 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...)
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino Menysystem Hjälp

Inlägg 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.
Skriv svar