c - 计算时间时出现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 循环中编写异常代码?
解决方案
推荐阅读
- javascript - 是否可以锁定网站上的移动键盘?
- sql - 如何从 select * from tableName 查询中删除/过滤记录?
- java - 在 webclient 调用之后没有调用 FlatMap
- matlab - 求解包含 Lambert-W 函数的非线性方程组
- java - 将角色分配给没有 FetchType.EAGER 的用户
- qt - 基于屏幕分辨率计算 QT 5.12 中的投影矩阵
- java - 如何在 clojure 中导入 java 类?
- c# - 传递下拉列表数据,然后在表单中显示
- visual-studio-code - 如何在本地安装 VSCode 扩展?
- charts - 生成图表时出错:Google 地球引擎中显示计算超时