我对此代码有疑问。我知道问题是什么,但我无法找到一个好的解决方案。
我使用millis()
- clock()
和time()
有两个功能。
函数clock()
返回日期和时间,函数time()
返回另一个操作开启的时间。
问题在于我无法存储time()
函数计算的时间。当我调用该函数2次时,从0:00开始。
我知道这是因为我每次调用循环都会覆盖变量,但我找不到合适的解决方案。这看起来很愚蠢,但我有一段时间有这个问题。
PS:我希望每次循环都有时间信息。
预期结果:
Start
2s: press 1 - clock = 2s, time = 0s.
5s: press 2 - clock = 5s, time = 3s.
15s: press 1 - clock = 15s, time = 3s.
20s: press 2 - clock = 20s, time = 8s.
我的代码:
void clock() {
// ... function that returns date and time;
// ... using millis();
}
void time(){
if (first == 0){
sec_aux = 0;
min_aux = 0;
UtlTime = millis();
first = -1;
}
if(millis() - UtlTime < 0){
UtlTime = millis();
}
else{
sec_aux = int((millis() - UtlTime) / 1000);
}
if(sec_aux > 59){
sec_aux = 0;
min_aux++;
UtlTime = millis();
}
sec = sec_aux;
min = min_aux;
Serial.println("TIME");
Serial.print(min); Serial.print(":"); Serial.println(sec);
}
void loop() {
if (Serial.available()) {
inChar = Serial.read();
}
switch(inChar){
case '1':
time();
clock();
break;
case '2':
clock();
first = 0;
break;
default:
clock();
}
}
答案 0 :(得分:0)
好的,如果我理解正确你想要一个
的功能1)你打电话一次然后重置计数器 2)你连续打电话告诉你经过了多少时间 3)你有时可以重置
如果是这样,你必须问自己&#34;我该如何重置计时器?&#34;。恕我直言,最好的解决方案是使用传递给函数的标志。
并且......避免两次使用millis
函数;)
而且,顺便说一句,我认为你想在收到串口数据时只执行一次动作,所以将开关移到测试中......
以下是一个示例:
void time(bool reset){
unsigned long currMillis = millis();
if (reset){
sec_aux = 0;
min_aux = 0;
UtlTime = currMillis;
}
while ((currMillis - UtlTime) > 1000)
{
UtlTime += 1000;
sec_aux++;
}
while(sec_aux > 59){
sec_aux -= 60;
min_aux++;
}
// Why do you duplicate the data?
sec = sec_aux;
min = min_aux;
Serial.println("TIME");
Serial.print(min); Serial.print(":"); Serial.println(sec);
}
void loop() {
if (Serial.available()) {
inChar = Serial.read();
switch(inChar){
case '1':
// Show time measure
time(false);
clock();
break;
case '2':
clock();
// Start time measure
time(true);
break;
default:
clock();
}
}
}
编辑:
好的,那么你想要一个&#34;可停止的&#34;跑表。我建议你从串行接口分离更新,所以你总是有更新的值。或者至少那是我头脑的工作方式:P
我修改了一些东西。你应该
lastMillis
millis()
到setup
timeIsRunning
为正确值resetTime()
setup
醇>
以下是代码:
void resetTime()
{
msec = 0;
sec = 0;
min = 0;
}
void updateTime()
{
unsigned long currStep = millis() - lastMillis;
lastMillis += currStep;
if (timeIsRunning)
{
msec += currStep;
while (msec > 1000)
{
msec -= 1000;
sec++;
}
while(sec > 59){
sec -= 60;
min++;
}
}
}
void printTime()
{
Serial.println("TIME");
Serial.print(min); Serial.print(":"); Serial.println(sec);
}
void loop()
{
updateTime();
if (Serial.available())
{
inChar = Serial.read();
switch(inChar)
{
case '1':
// Show time measure
timeIsRunning = false;
printTime();
clock();
break;
case '2':
clock();
// Start time measure
timeIsRunning = true;
break;
default:
clock();
}
}
}