Pages: [1]   Go Down
Author Topic: op keypad een nummer intoetsen en die dan naar uitgangen sturen  (Read 1309 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hoi Allemaa,

ik ben kompleet nieuw in de arduino wereld en heb al een aantal dingen gebouwd, ( geweldige taal )
nu ben ik bezig met een matrix keyboard 4x4 om daar een nummer mee in te toetsen zodat deze ( via een LCD bevestigd moet worden met accoord ) en dat deze daarna een aantal uitgangen achter elkaar aanstuurd.

de "code" kan tussen de 1 en 4 cijfers zijn. dus als tje ware van 1 tot 9999
deze stop ik nu in een INT en dat lukt ook allemaal, ook het weergeven van de ingetoetste waarde komt op het LCD en de bevestiging lukt ook.

Dit was even het voorwoord en dan Nu het probleem.
ik wil deze "code" op een aantal uitgangen zichtbaar maken, dus b.v.
als ik als "code" "264" intoets dan moet b.v. eerst uitgang 2 hoog worden met een delay(100) en dan weer laag en dan uitgang 6 hoog enz.

op welke manier kan ik dit realiseren omdat de "code" telkens anders kan zijn varierend van 1 tot 9999.
dus de  "array"  is eigenlijk 4 plaatsen alleen kan het zo zijn dat alleen plaats 1 gevuld is bij een "code" van b.v.  "5".

ik hoor graag hoe ik dit moet aanvliegen.

ik hoop dat jullie het een beetje begrijpen.

samenstelling project arduino one, matrix keypad, LCD, CD4514  4 to 16 multiplexer. ( de multiplexer is om de code de verschillende uitgangen hoog te laten zijn )

Groetjes Adriaan
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 50
Posts: 1709
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hoi.

Als je code uit maximaal 4 posities kan bestaan maar je ze niet altijd alle 4 gaat intypen, moet je ze dus zelf maken.
Je hebt het over 1 tot en met 9999.
Dat zijn dus in totaal 9999 mogelijkheden.
Maar dan denk je als het ware aan tellen op je vingers.
Als je met een programma/processor telt, is de eerste mogelijkheid niet 1, maar 0.
Daarom heb je met 0 tot 255 ook 256 mogelijkheden (een getal dat deelbaar is door 8 ).
Op die manier heb je dus 10000 mogelijkheden, maar kun je er 9999 intypen.
Wanneer er maar 1 cijfer word ingegeven, vul je de rest dus aan met nullen.
Overigens heb je niet aangegeven hoe de ingave beëindigd word.
Gebruik je daarvoor sterretje, hekje, A, B, C of D of ofzo, of is er een time out (of misschien wel beide) ?
Maar dat maakt hier even niets uit.

Eigenlijk zou ik zeggen definieer eerst je ingave als 0000.
Daarna ga je de nullen een voor een weggooien en van rechts naar links met ingetypte waarden vervangen.
Aangezien je al met het woord "array" hebt gerept, heb je vast wel een idee hoe dat te doen.
Als je de nullen niet wil laten zien, kun je controleren of er van links naar rechts nullen staan en die vervolgens niet laten zien op je display.
Alleen heb je dan wel een probleem wanneer je gebruiker zijn code begint met zo'n nul.

Als het 4 naar 16 is, lijkt het mij overigens een demultiplexer, en het typenummer CD4514 googlen lijkt dat ook te bevestigen.

hoe ik dit moet

Je moet niets.
Maar men kan je voorstellen hoe je iets kunt doen.
Das al een aardig verschil.

Edit:
Ik ging er hierboven van uit dat je op je display eerst niets staat en er telkens het ingevoerde cijfer geplaatst word van rechts naar links (net zoals op een rekenmachine).
Maar nu ik het nog een keer lees, ben ik daar niet zeker van (met name omdat je positie 1 noemt als je maar 1 cijfer ingeeft).
Door met die nullen te werken ga je dat dus anders doen.
Wanneer je de cijfers in een ASCII string zet, kun je dus op bovenstaande wijze werken.
Je kunt zo ook het ingeven van de nul als eerste waarde oplossen, omdat je dan als lege waarde een teken neemt die men niet kan intoetsen (zoals "x").
Uit zo'n string kun je ook vrij eenvoudig van links naar rechts (of andersom als je dat wil) het betreffende teken eruit halen en verwerken.
« Last Edit: November 30, 2012, 04:40:41 pm by MAS3 » Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

op dit moment heb ik dit stukje code lopen

Code:
void readKeypad(){
  char key = customKeypad.getKey();                                                 
  if (key != NO_KEY)  {
    switch(key)  {
      case '#':                                                                       
        lcd.clear();                                                                 
        lcd.setCursor(0,0);                                                           
        lcd.print("toest code");                                                 
        lcd.setCursor(0,1);                                                             
        lcd.print(" A=Enter  C=Wis ");                                                       
        z=0;                                                                           
        break;                                                                         
      case 'A':                                                                       
        delay(100);                                                                 
        codeOKcheck();                                                       
        break;                                                                   
      case 'C':
        delay(100);
        memset(code,0,sizeof(code));                                             
        z=0;
        break;
      default:                                                                       
        code[z]=key;                                                               
        z++;                                                                   
    }
  }
}

void loop () {                                                                       
  readKeypad();                                                                   
}

de void (code) geeft puur en aleen tekst op het LCD dat de code goed is.
 
alleen dan zou ik graag willen dat hij positie voor postitie uit het array leest en hiermee een betreffende uitgang aanstuurd ( van de demultiplexer uiteraard )
door een binaire waarde op de demuxer te zetten zodat 1 uitgang hoog wordt)

Code:
//uitgang cijfer 2
void geeftwee(){
  digitalWrite(INHIBIT,1);
  delay(100);
  digitalWrite(BIT0,0);
  digitalWrite(BIT1,1);
  digitalWrite(BIT2,0);
  digitalWrite(BIT3,0);
  digitalWrite(INHIBIT,0);
  delay(100);
}

heb je een idee om dit code technisch op te lossen ?

Groetjes Adriaan
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 50
Posts: 1709
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je had al geantwoord terwijl ik aan het editen was.
Lees nog even het onderste stukje van bovenstaande posting.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tja snel he,

op zich heb ik wel eens wat gelezen uit een array ( doe ik in deze ook ) alleen op welke manier moet je 1 teken lezen, en dan de volgende , enz.

trouwens de tekens moeten van link naar rechts worden gelezen, de code wordt ook van links naar rechts gevuld.
b.t.w. de code begint nooit met een 0.

Groetjes Adriaan
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 50
Posts: 1709
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In mijn stukje word eerst de lengte van de code altijd op 4 cijfers gesteld en vervolgens de code binnengehaald.
Dus eerst zet je 0000 en vervolgens ga je dat van rechts naar links vullen.
Dan krijg je dus naar jouw voorbeeld: 0002 dan 0026 en vervolgens 0264.
Dit betekent wel dat je dus moet gaan schuiven met je cijfers tijdens het intypen van de code.
Je geeft inmiddels aan dat beginnen met een nul niet mogelijk is, dus daarmee kun je het nog steeds op deze manier doen.

Als je met een string werkt, dan haal je de waarde van het ingetypte getal eruit.
Voor jouw code doet de waarde van de cijfercombinatie (het getal) er niet toe (je gaat er (nog) niet mee rekenen en kun je dit dus zondermeer doen.
Ik dacht in eerste instantie aan de handelingen die je in de basic taal met strings kunt doen, maar die heb je hier niet.
Maar wel vergelijkbare dingen.
Zoals charAt en setCharAt.
Daarmee bekijk je het teken op een positie in een string of stel je dat teken in.
Ik heb dat (nog) niet geprobeerd en denk ook niet dat ik daar binnenkort tijd voor heb, maar je moet dus op die manier vrij eenvoudig de waarde van het vierde cijfer naar het derde cijfer verplaatsen en vervolgens de zojuist opgehaalde waarde in dat vrijgekomen cijfer te plaatsen.

Je kunt zelf de  hier op de site de string functie opzoeken en kijken hoe je daar mee aan de slag kunt.
Ik heb alleen nog niet gezien of en hoe je de tekstwaarde weer in een getal kunt omzetten want uiteindelijk wil je toch een getal naar je decoder sturen.
Wel zie ik dat je zulke strings kunt gebruiken als een integer en er dus mee kunt tellen.
Ik vermoed nu dat als een string als een getal te lezen is, je m ook zo kunt behandelen.
Met een beetje geluk worden nullen aan de linkerkant weggelaten als je er een integer van maakt.
Dat is een kwestie van proberen.

Nu te laat, ga mn bed opzoeken.
Als ik morgen uitgewerkt ben, heb ik misschien nog wat tijd om hiermee verder te spelen.
Ondertussen kun je dat zelf natuurlijk ook.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Pages: [1]   Go Up
Jump to: