สอบถามเรื่องการใช้ Keypad รับเลขมากกว่า 1 หลักและใช้ กับโปรแกรมนับถอยหลังเวลาครับ

ในส่วนแรกคือ โค้ดสำหรับการรับค่าหลายหลักครับ

#include <Keypad.h>
unsigned long previousTime = 0;
int setTime = 0;
int start = 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}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {30, 32, 34, 36}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  Serial.begin(9600);}
void loop()
{ int Num;
  Num = GetNum(4, 16, 3);
  Serial.print(Num);
  
}
char BufNum[8];
void  SlideNum(void)
{
  BufNum[6]  = BufNum[5];
  BufNum[5]  = BufNum[4];
  BufNum[4]  = BufNum[3];
  BufNum[3]  = BufNum[2];
  BufNum[2]  = BufNum[1];
  BufNum[1]  = BufNum[0];
}
unsigned long GetNum(int Count, int X, int Y);
unsigned long showTime = millis();
{ char Key, i, N;
  float Sum;


  N = 0;
  for (i = 0; i < Count; i++) {BufNum = ' ';}
  i = 0;
  while (Key != '#') //เมื่อไม่มีการกด
  { Key = NO_KEY;
    while (Key == NO_KEY) {Key = keypad.getKey();}

    if (Key == '*')
    {
      for (i = 0; i < Count; i++) {BufNum = ' ';}
      N = 0;
    }
    if ((N < Count) && (Key >= '0') && (Key <= '9'))
    { SlideNum();
      BufNum[0] = Key;
      N++;
    }
    unsigned long showTime = millis();
}
}
for (i = 0; i < Count; i++)
  {
    if (BufNum[Count - (i + 1)] == 0x20)
    {
      BufNum[Count - (i + 1)] = '0';
    }
    Sum = (Sum * 10) + (BufNum[Count - (i + 1)] - '0');
  }
  return Sum;
  Serial.print(Sum);
}


ในส่วนที่2 คือ โค้ดของการนับถอยหลัง
void loop()
{
  unsigned long showTime = millis();
  char key = myKeypad.getKey(); // ตัวแปร key เป็นตัวแปรแบบ char รับค่าการกดปุ่ม
  if (key != NO_KEY && key != 'A' && key != 'B' && key != ' ') //เมื่อกดปุ่ม (เฉพาะเลข 0 - 9) ค่า setTime จะเท่ากับปุ่มที่กด
  {
    setTime = (key - 48); //นำค่า key ที่ได้มาลบกับ 48 เนื่องจากเป็นรหัส ascii48 ที่เลข 0 จะเริ่มที่ 48
    Serial.print(key);
  }

  if (key == 'A') //เมื่อกดปุ่ม A ตัวแปร start จะเท่ากับ 1 และค่า previousTime สุดท้ายจะเท่ากับ showTime ณ ตอนนั้น
  {
    start = 1;
    previousTime = showTime;
    Serial.print("Start...");
  }

  if (key == 'B') //เมื่อกดปุ่ม B ทุกอย่างจะถูกหยุด
  {
    start = 0;
    buzzer = 0;
    previousTime = 0;
    Serial.print("Stop!...");
  }

  if (start == 1) //เมื่อ start = 1 จะเป็นการวน loop จับเวลาไปเรื่อยๆ จนกว่าจะครบกำหนด
  {
    Serial.print("setTime: ");
    Serial.print(setTime); //แสดงค่าเวลาที่ตั้งไว้
    Serial.print("   showTime: ");
    Serial.print(showTime); //แสดงเวลา millis() ของ Arduino ซึ่งจะเป็นค่าที่วิ่งไปเรื่อยๆ
    Serial.print("   previousTime: ");
    Serial.print(previousTime); //แสดงค่าสุดท้ายของ previousTime หลังจากที่กดปุ่ม A ซึ่งจะเป็นค่าคงที่ ไม่วิ่งตาม millis()
    Serial.print("   Time: ");
    Serial.println((showTime - previousTime) / 1000); //แสดงผลการคำนวณว่าจับเวลาไปกี่วิแล้ว

    if ((showTime - previousTime) / 1000 >= setTime) //ถ้าเวลาที่จับได้ มากกว่าหรือเท่ากับเวลาที่ตั้งไว้...
    {
      start = 0;
      buzzer = 1;
      Serial.print("Finish!");
    }
  }


อยากจะสอบถามว่าจะใช้งานโค้ด 2ชุดนี้ด้วยกันได้อย่างไรครับ  มือใหม่หัดทำครับ


ที่มาของโค้ดชุดแรก  ขอขอบคุณ https://www.youtube.com/watch?v=nY5I3J8-JQU
ที่มาของโค้ดชุดที่2   ขอขอบคุณ https://commandronestore.com/learning/timer001.php
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่