ผมอยากทำตัวจับเวลาแล้ว ดึงเวลามา คำนวน ทำยังไงอะคับ ช่วยแนะนำผมหน่อยคับ
โค้ดนี้แสดงเวลาได้ แต่ เวลาเอาไปคำนวน คำตอยที่ได้วันยังไม่ใช่อะคับ
ก็คือ เมือเรารันโปรแกรมแต่ยังไม่กดปุ่มจับเวลา เวลามันก็เดินไปเอง คือมันเอาเวลาที่เดินไปก่อนนั้นมาคำนวนอะคับ
,เวลากดปุ่มเริ่มจับเวลาเเสดงปกตินะคับ,
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte numRows= 4;
const byte numCols= 4;
unsigned long previousTime = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte numRows= 4;
const byte numCols= 4;
unsigned long previousTime = 0;
char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', ' '},
{' ', '0', ' ', ' '}
};
byte rowPins[numRows] = {A3 ,A2 ,A1 ,A0}; //connect to row pinouts
byte colPins[numCols] = {9, 8, 7, 6}; //connect to column pinouts
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
void setup()
{
lcd.begin(16,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 ); //นำค่า 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 ทุกอย่างจะถูกหยุด
{
int ans;
start = 0;
//buzzer = 0;
previousTime = 0;
ans=(((showTime - previousTime) / 1000)/2);
lcd.setCursor(0,1);
//lcd.print("Stop!...\n");
lcd.print(ans);
}
if(start == 1) //เมื่อ start = 1 จะเป็นการวน loop จับเวลาไปเรื่อยๆ จนกว่าจะครบกำหนด
{
lcd.setCursor(0,0);
lcd.print((showTime - previousTime) / 1000);
}
}
ลองแกะโคดทีละส่วน ผมว่าน่าจะยังมีบางจุดที่โคดยังไม่ถุก ที่แนะนำคือ เอา unsigned long showTime = millis(); ไปไว้ข้างนอก ใน loop เรียกใช้ showTime = millis(); ตัวแปรจะไม่ถูกสร้างใหม่ทุกครั้งที่ทำงานครับ
คำสั่ง millis() ให้ค่า 1 ใน 1000 วินาทีแล้วครับ
millis()
Description
Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.
ลองแกะโคดดูก่อนนะว่าคำสั่งนี้ใช้ทำอะไร ans=(((showTime - previousTime) / 1000)/2);