Я нуб-программист и много лет работал над одним проектом ... Это будут словесные часы. Матрица из 160 светодиодов (WS2812B) в сочетании с Ardiuno Uno были использованы для отображения определенного времени.
После поиска похожих проектов я нашел этот от dgoersch . Я не использую библиотеку eeprom и «просто хочу жестко запрограммировать» время и события (включение и выключение светодиодных массивов).
Я использовал функцию задержки, чтобы ждать каждой минуты, чтобы измениться светодиоды. Но если я хочу использовать прерывание button-pu sh для изменения часов и минут вручную (следующая реализация в списке), оно не будет работать, потому что arduino не может реагировать, пока находится в задержке. Поэтому я нашел while l oop и метод для подсчета времени и изменения индекса, если прошел определенный промежуток времени. Ниже приведен фрагмент кода для подсчета часов:
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 ().
Моя проблема:
Я хочу считать часы в стиле AM - PM. (от 12 до 11, а затем через l oop) Условие while должно быть истинным, чтобы показывать первые светодиоды. Но мне нужен массив светодиодов (час 12: word2stripe(wordhZwoelf, sizeof(wordhZwoelf) / sizeof(int), CRGB( 8, 75, 10));
), пока идет отсчет времени до первого intervalHour
, потому что нет такого понятия, как час ноль.
Есть ли возможность кодировать исключение в то время как l oop пока он рассчитывает на первый интервал времени?