#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int Mode = 0;
unsigned long last_time = 0;
uint16_t Times = 0;
int HH = 0; // ตัวแปรเก็บค่าชั่วโมง
int MM = 0; // ตัวแปรเก็บค่านาที
int Ss = 0; // ตัวแปรเก็บค่าวินาที
void setup()
{
Serial.begin(9600);
//lcd.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" TIMER PROGRAM "); //พิมพ์ข้อความ
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" 3");
delay(1000);
lcd.setCursor(7, 1);
lcd.print("2");
delay(1000);
lcd.setCursor(10, 1);
lcd.print("1");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" START "); //พิมพ์ข้อความ
delay(1000);
}
void loop()
{
char Key = keypad.getKey(); // สร้างตัวแปร key มารับค่าการกด Keypad
/*Serial.print("Keypad: ");
Serial.println(Key); // แสดงอักขระของปุ่มที่กด*/
if(Key) // ถ้ามีการกดปุ่ม
{
switch (Key)
{
case 'A': // ถ้ากด A
Serial.println("Menu 1 - Set Time");
Mode = 1;
Times = readnumber();
Serial.println(Times);
break;
case 'B': // ถ้ากด B
Serial.println("Menu 2 - Count Down");
Mode = 2;
break;
case 'C': // ถ้ากด C
Serial.println("Menu 3 - Pause Time");
Mode = 3;
break;
case 'D': // ถ้ากด D
Serial.println("Menu 4 - Reset Time");
Mode = 4;
Serial.println("Reset Time");
break;
default:
Serial.println(Key);
}
}
else
{
/*lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print("Press A B C *"); //พิมพ์ข้อความ*/
if (Mode == 0)
{
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print("A:Set - B:Start"); //พิมพ์ข้อความ
lcd.setCursor(0, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print("C:Stop - D:Reset"); //พิมพ์ข้อความ
}
else if (Mode == 1)
{
HH = Times/3600; // แปลงเวลาเป็นวินาที เพิ่อลดลงทุกๆ 1 วินาทีตามโจทย์
MM = (Times%3600)/60;
Ss = (Times%3600)%60;
/*Serial.print(HH);
Serial.print(":");
Serial.print(MM);
Serial.print(":");
Serial.println(Ss);*/
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Set time "); //พิมพ์ข้อความ
lcd.setCursor(3, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(HH); //พิมพ์ข้อความ
lcd.setCursor(5, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(7, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(MM); //พิมพ์ข้อความ
lcd.setCursor(9, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(11, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(Ss); //พิมพ์ข้อความ
}
else if (Mode == 2) // Count Down
{
HH = Times/3600; // แปลงเวลาเป็นวินาที เพิ่อลดลงทุกๆ 1 วินาทีตามโจทย์
MM = (Times%3600)/60;
Ss = (Times%3600)%60;
/*Serial.print(HH);
Serial.print(":");
Serial.print(MM);
Serial.print(":");
Serial.println(Ss);*/
if(millis() - last_time > 1000) // LED กระพริบทุกๆ 1 วินาที และเวลาลดลงทุกๆ 1 วินาที
{
last_time = millis(); // อัพเดตค่าเวลาที่จับได้ใหม่ลงตัวแปร last_time ปล last_time ไม่ใช่ตัวแปรเวลาที่แสดงบน TM1638 แต่เป็นเวลาที่นับตั้งแต่ Arduino เริ่มทำงาน
if (Times <= 0)
{
HH = 0;
MM = 0;
Ss = 0;
Times = 0;
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Count Down "); //พิมพ์ข้อความ
lcd.setCursor(0, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Finish "); //พิมพ์ข้อความ
}
else
{
//Serial.println(Times);
HH = Times/3600; // แปลงเวลาเป็นวินาที เพิ่อลดลงทุกๆ 1 วินาทีตามโจทย์
MM = (Times%3600)/60;
Ss = (Times%3600)%60;
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Count Down "); //พิมพ์ข้อความ
lcd.setCursor(3, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(HH); //พิมพ์ข้อความ
lcd.setCursor(5, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(7, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(MM); //พิมพ์ข้อความ
lcd.setCursor(9, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(11, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(Ss); //พิมพ์ข้อความ
Times--; // ลดเวลาลง 1 ทุกๆ 1 วินาที
}
}
}
else if (Mode == 3) // Pause Time
{
HH = Times/3600; // แปลงเวลาเป็นวินาที เพิ่อลดลงทุกๆ 1 วินาทีตามโจทย์
MM = (Times%3600)/60;
Ss = (Times%3600)%60;
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Pause Time "); //พิมพ์ข้อความ
lcd.setCursor(3, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(HH); //พิมพ์ข้อความ
lcd.setCursor(5, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(7, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(MM); //พิมพ์ข้อความ
lcd.setCursor(9, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(11, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(Ss); //พิมพ์ข้อความ
}
else if (Mode == 4) // Reset Time
{
HH = 0;
MM = 0;
Ss = 0;
Times = 0;
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print(" Reset Time "); //พิมพ์ข้อความ
lcd.setCursor(3, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(HH); //พิมพ์ข้อความ
lcd.setCursor(5, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(7, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(MM); //พิมพ์ข้อความ
lcd.setCursor(9, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(":"); //พิมพ์ข้อความ
lcd.setCursor(11, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 2 บรรทัดที่ 1
lcd.print(Ss); //พิมพ์ข้อความ
delay(2000);
Mode = 0;
}
else
{
Mode = 0;
}
}
delay(100);
}
uint16_t readnumber(void)
{
lcd.clear();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ ตัวที่ 0 บรรทัดที่ 0
lcd.print("Set time - D:Set"); //พิมพ์ข้อความ
lcd.setCursor(0, 1);
lcd.print("Time: ");
uint16_t num = 0;
String inString = ""; // string to hold input
while (num == 0)
{
char key = keypad.getKey();
if(key) // Check for a valid key.
{
if (key == 'D')
{
num = inString.toInt();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเคอร์เซอร์ที่ แถวที่ 0 บรรทัดที่ 0
lcd.print(" TIME (Minutes) "); //พิมพ์ข้อความ
lcd.setCursor(0, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ แถวที่ 0 บรรทัดที่ 0
lcd.print(" "); //พิมพ์ข้อความ
lcd.setCursor(7, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ แถวที่ 0 บรรทัดที่ 0
lcd.print(inString); //พิมพ์ข้อความ
delay(1000);
break;
}
else
{
num = 0;
inString += key;
lcd.setCursor(6, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ แถวที่ 0 บรรทัดที่ 0
lcd.print(" "); //พิมพ์ข้อความ
lcd.setCursor(6, 1); // กำหนดตำแหน่งเคอร์เซอร์ที่ แถวที่ 0 บรรทัดที่ 0
lcd.print(inString); //พิมพ์ข้อความ
delay(100);
}
}
}
return num*60;
}