ในส่วนแรกคือ โค้ดสำหรับการรับค่าหลายหลักครับ
#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
สอบถามเรื่องการใช้ 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