Исключение в то время как l oop при отсчете времени [Ardiuno | LED-матрица] - PullRequest
0 голосов
/ 11 апреля 2020

Я нуб-программист и много лет работал над одним проектом ... Это будут словесные часы. Матрица из 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 пока он рассчитывает на первый интервал времени?

...