Часы на 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().
Задание
СложноДобавь часовую стрелку и смешивай стрелки:
- час определяется выражением
(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); // перерисовывать десять раз в секунду
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
3Парковочный датчик
Парковочный датчик: расстояниеПарковочный датчик: световые сигналыПарковочный датчик: звуковые сигналыПарковочный датчик: дисплей6Часы на NeoPixel
Часы на NeoPixel: секундыЧасы на NeoPixel: минутыЧасы на NeoPixel: смешиваем стрелкиЧасы на NeoPixel: устанавливаем времяПотренируйтесь самостоятельно: Песочница Arduino