Go Down

Topic: how to count time between two btn presses ? (Read 329 times) previous topic - next topic

kourpetis

Feb 10, 2012, 05:38 am Last Edit: Feb 10, 2012, 06:34 am by Coding Badly Reason: 1
First of all Thank you all for your help !

I am trying to create a text messenger ! I will pressent the code in a sec ! Now everything works just fine ( if i press the same btn agen it changes characters in the same cursor point, if i press another one the cursor moves 1 point to the right and does the same thing, when it reaches the end of a row to the lcd screen goes to the next) everything is perfect. BUT ..... i want to have a function that counts the time between btn press when i press the same bt, so if it is less than a sec to continue changing the characters but if it more than a sec to move the cursor 1 point to the right and start the same all over agen.

Here is the code so far :


Code: [Select]
#include <Keypad.h>
#include <ctype.h>
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
// Define the keymaps.  The blank spot (lower left) is the space character.
char alphaKeys[ROWS][COLS] = {
   { 'a','d','g', },
   { 'j','m','p', },
   { 's','v','y', },
   { ' ','.','#', }
};

char numberKeys[ROWS][COLS] = {
   { '1','2','3', },
   { '4','5','6', },
   { '7','8','9', },
   { ' ','0','#', }
};

boolean alpha = false;   // Start with the numeric keypad.
char* keypadMap = (alpha == true) ? makeKeymap(alphaKeys) : makeKeymap(numberKeys);

byte rowPins[ROWS] = {48, 49, 50, 51};    //connect to the row pinouts of the keypad
byte colPins[COLS] = {40, 41, 43, 42};    //connect to the column pinouts of the keypad

//create a new Keypad
Keypad keypad = Keypad(keypadMap, rowPins, colPins, sizeof(rowPins), sizeof(colPins));

unsigned long startTime;
const byte ledPin = 13;    
int i = 0;
int j = 0;
int flag = 0;
long LastDebounceTime = 0;
long FirstDebounceTime = 0;

void setup(){
   lcd.begin(16, 2);
   Serial.begin(9600);
   pinMode(ledPin, OUTPUT);
   digitalWrite(ledPin, LOW);                                                // Turns the LED on.
   keypad.addEventListener(keypadEvent);                                      // Add an event listener.
   keypad.setHoldTime(500);
};

void loop(){
 FirstDebounceTime = millis();
 
 char key = keypad.getKey();

   if (alpha && millis()-startTime>100) {           // Flash the LED if we are using the letter keymap.
       digitalWrite(ledPin,!digitalRead(ledPin));
     startTime = millis();
   }
char waitForKey();
};

// Take care of some special events.
void keypadEvent(KeypadEvent key) {
   static char virtKey = NO_KEY;      // Stores the last virtual key press. (Alpha keys only)
   static char physKey = NO_KEY;      // Stores the last physical key press. (Alpha keys only)
   static char buildStr[12];
   static byte buildCount;
   static byte pressCount;

   switch (keypad.getState())
   {
   case PRESSED:
       if (isalpha(key)) {          // This is a letter key so we're using the letter keymap.
           if (physKey != key) {        // New key so start with the first of 3 characters.
               pressCount = 0;
               virtKey = key;
               physKey = key;
           }
           else {              // Pressed the same key again...
           
               LastDebounceTime = millis() - startTime;
               if ((LastDebounceTime - startTime)>1000){
               virtKey++;               // so select the next character on that key.
               pressCount++;            // Tracks how many times we press the same key.
               i--;
               }
           }
           if (pressCount > 2) {        // Last character reached so cycle back to start.
               pressCount = 0;
               virtKey = key;
           }
           if (i == 16 & flag == 0 & j == 0){
             i = 0;
             j = 1;
             flag = 1;
             
           }
           lcd.setCursor(i,j);
           Serial.print(i);       // Used for testing.
           Serial.print(j);      // Used for testing.
           lcd.print(virtKey);
           if (i == 15 & j == 1){
             i = 0;
             j = 0;
             flag = 0;
           }
           else {
             i++;
           };
             
     }
       if (isdigit(key) || key == ' ' || key == '.')  lcd.print(key);
       if (key == '#')  Serial.println();
       break;

   case HOLD:
       if (key == '#')  {                   // Toggle between keymaps.
           if (alpha == true)  {            // We are currently using a keymap with letters
               keypad.begin(*numberKeys);   // and want to change to numbers.
               alpha = false;
               digitalWrite(ledPin, LOW);
           }
           else  {                          // Or, we are currently using a keymap with numbers
               keypad.begin(*alphaKeys);    // and want to change to letters.
               alpha = true;
           }
       }
       else  {                             // Some key other than '#' was pressed.
           buildStr[buildCount++] = (isalpha(key)) ? virtKey : key;
           buildStr[buildCount] = '\0';
           Serial.println();
           Serial.println(buildStr);
       }
       break;

   case RELEASED:
       if (buildCount >= sizeof(buildStr))  buildCount = 0;    // Our string is full. Start fresh.
       break;

   }  // end switch-case
}  // end keypad events



it doesnt work

any help ?


Moderator edit: [code] [/code] tags added.

Coding Badly


Go Up