Menu
CoddyTech

Часы на NeoPixel: смешиваем стрелки

Часть раздела Проекты путешествия по Arduino на Coddy. Урок 23 из 24.

Стрелка часов красная. На циферблате 12 часов, поэтому час равен (now / 3600) % 12: от 0 до 11, где 0 — это 12 часов. Это уже номер пикселя.

Теперь стрелки могут совпадать. В 10:24:52 секундная стрелка находится на пикселе 10, поверх часовой стрелки. Если рисовать их одну за другой, вторая перекрывает первую, и одна стрелка исчезает.

Вместо этого можно смешивать свет. Задай для каждой стрелки свой цветовой компонент (красный для часов, зелёный для минут, синий для секунд) и формируй каждый пиксель с учётом стрелок на нём:

for (int i = 0; i < pixelCount; i++) {
  int r = 0;
  int g = 0;
  int b = 0;
  if (i == hourPixel) {
    r = 255;
  }
  if (i == minutePixel) {
    g = 255;
  }
  if (i == secondPixel) {
    b = 255;
  }
  ring.setPixelColor(i, ring.Color(r, g, b));
}

Там, где стрелки совпадают, компоненты складываются: красный и синий дают пурпурный, зелёный и синий — голубой, красный и зелёный — жёлтый. Каждый пиксель задаётся при каждом проходе, поэтому цикл также заменяет ring.clear().

challenge icon

Задание

Сложно

Добавь часовую стрелку и смешивай стрелки:

  • час определяется выражением (now / 3600) % 12 и отображается на этом пикселе
  • собирай каждый пиксель в цикле for: красный — 255, если на нём находится часовая стрелка, зелёный — 255 для минутной стрелки, синий — 255 для секундной стрелки

Нажми Run: часы запускаются в 10:24:50, секундная и часовая стрелки смешиваются. Затем нажми Check.

Попробуйте сами

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

// Время, с которого начинают идти часы, в секундах с полуночи: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

void setup() {
  ring.begin();
}

void loop() {
  unsigned long now = startTime + millis() / 1000;  // время суток в секундах
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // секундная стрелка: синяя
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // минутная стрелка: зелёная
  ring.show();
  delay(100);  // перерисовывать десять раз в секунду
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino