首页 > 解决方案 > 计算时间时出现while循环异常[Ardiuno|LED-matrix]

问题描述

我是一个编程菜鸟,多年来一直在一个项目上工作……这将是一个字钟。160 个 LED(WS2812B)矩阵与 ardiuno uno 组合用于显示特定时间。

在搜索了类似的项目后,我从 dgoersch 找到了这个。我不使用 eeprom 库,并且“只想硬编码”时间和事件(打开和关闭 LED 阵列)。

我使用延迟功能等待每分钟更换 LED。但是,如果我想使用按钮按下中断来手动更改小时和分钟(列表中的下一个实现),它将无法工作,因为 arduino 在延迟时无法做出反应。因此,我找到了 while 循环和一种方法来计算时间并在某个时间间隔过去时更改索引。请在下面找到计数时间的代码片段:

void loop()
{
  //the current time for every loop-run
  unsigned long currentHourMillis = millis(); 
  // checking time-difference if time-interval has passed or not
  while ((unsigned long)(currentHourMillis - previousHourMillis) >= intervalHour) 
  {
    // if the time-interval was passed, a new previous time will be saved
    previousHourMillis = millis(); 
    if (i < 1)
    {
      word2stripe(wordhZwoelf, sizeof(wordhZwoelf) / sizeof(int), CRGB::Black);
      word2stripe(wordhEin, sizeof(wordhEin) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 2)
    {
      word2stripe(wordhEin, sizeof(wordhEin) / sizeof(int), CRGB::Black);
      word2stripe(wordhZwei, sizeof(wordhZwei) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 3)
    {
      word2stripe(wordhZwei, sizeof(wordhZwei) / sizeof(int), CRGB::Black);
      word2stripe(wordhDrei, sizeof(wordhDrei) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 4)
    {
      word2stripe(wordhDrei, sizeof(wordhDrei) / sizeof(int), CRGB::Black);
      word2stripe(wordhVier, sizeof(wordhVier) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 5)
    {
      word2stripe(wordhVier, sizeof(wordhVier) / sizeof(int), CRGB::Black);
      word2stripe(wordhFuenf, sizeof(wordhFuenf) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 6)
    {
      word2stripe(wordhFuenf, sizeof(wordhFuenf) / sizeof(int), CRGB::Black);
      word2stripe(wordhSechs, sizeof(wordhSechs) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 7)
    {
      word2stripe(wordhSechs, sizeof(wordhSechs) / sizeof(int), CRGB::Black);
      word2stripe(wordhSieben, sizeof(wordhSieben) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 8)
    {
      word2stripe(wordhSieben, sizeof(wordhSieben) / sizeof(int), CRGB::Black);
      word2stripe(wordhAcht, sizeof(wordhAcht) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 9)
    {
      word2stripe(wordhAcht, sizeof(wordhAcht) / sizeof(int), CRGB::Black);
      word2stripe(wordhNeun, sizeof(wordhNeun) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 10)
    {
      word2stripe(wordhNeun, sizeof(wordhNeun) / sizeof(int), CRGB::Black);
      word2stripe(wordhZehn, sizeof(wordhZehn) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 11)
    {
      word2stripe(wordhZehn, sizeof(wordhZehn) / sizeof(int), CRGB::Black);
      word2stripe(wordhElf, sizeof(wordhElf) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 12)
    {
      word2stripe(wordhElf, sizeof(wordhElf) / sizeof(int), CRGB::Black);
      word2stripe(wordhZwoelf, sizeof(wordhZwoelf) / sizeof(int), CRGB( 8, 75, 10));
      FastLED.show(); Serial.println("Stunde"); Serial.println(i);
      i++;
    }
    else if (i < 13)
    {
      i = 0; Serial.println("Stunde"); Serial.println(i);
    }
  }
}

我宣布:

int i = 0; 
unsigned long intervalHour = 10000;// the time we need to wait for an hour
unsigned long previousHourMillis = 0;// millis() returns an unsigned long 

在 setup() 开始之前。

我的问题:

我想以上午-下午的方式计算小时数。(从 12 到 11 然后循环)while 条件需要为真才能显示第一个 LED。但是我需要一个 LED 阵列(第 12 小时:)word2stripe(wordhZwoelf, sizeof(wordhZwoelf) / sizeof(int), CRGB( 8, 75, 10));,而时间一直计数到第一个intervalHour,因为没有零小时之类的东西。

在计算到第一个时间间隔时,是否有可能在 while 循环中编写异常代码?

标签: ctimewhile-looparduinocounting

解决方案


推荐阅读