Skip to contentSkip to main navigation Skip to footer

Игрушка для кота на адресной ленте

Задача


  • Сделать игру для котика: анимация движения “пикселя” в случайном направлении

Базовые уроки


Подключение


Подключаем как в уроке, на всякий случай через резистор. Arduino и лента питаются от сетевого адаптера на 5V (есть в наборе):

Примечание: не подключайте Arduino к компьютеру без внешнего питания 5V, так как лента потребляет большой ток!

Библиотеки


  • FastLED – можно установить через менеджер библиотек

Программа


Зададим константы для удобства переноса кода, подключим и подготовим библиотеку для работы с лентой, как в уроке:

#define LED_PIN 2     // пин ленты
#define LED_NUM 300   // кол-во светодиодов
#define LED_BR 250    // яркость ленты

#include "FastLED.h"
CRGB leds[LED_NUM];

В блоке setup() настраиваем ленту:

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, LED_NUM);
  FastLED.setBrightness(LED_BR);
}

Нам понадобятся три переменные. Две для хранения текущей и целевой позиции, и одна на цвет. Цвет будет меняться во время работы, от 0 до 255, поэтому его переменная будет типа byte. Это позволит увеличивать его на 1 и автоматически сбрасываться в 0 при переполнении.

int tar, cur;      // храним позицию и цель
byte color;        // храним цвет

Движение от точки к точке реализуется очень просто: если текущая позиция равна целевой – задаём новую случайную цель:

if (tar == cur) tar = random(0, LED_NUM);   // новая случайная позиция

Следующий шаг – двигаем текущую позицию на 1 в сторону к цели. Это можно сделать в одну строчку кода:

cur += (cur < tar) ? 1 : -1;  // направление движения

Зациклив эти две строчки, получим постоянное движение и сменяемость цели.

Но там нужно ещё вывести всё на ленту, поэтому продолжаем. Вместо очистки ленты сделаем затухание всех пикселей, это даст красивый шлейф за бегущим светодиодом:

for (int i = 0; i < LED_NUM; i++) leds[i].fadeLightBy(180);

Осталось покрасить светодиод на текущей позиции, сделаем это при помощи setHue()

leds[cur].setHue(color);  // зажигаем светодиод

Осталось прибавить цвет, обновить ленту и чуть подождать для плавности движения:

color++;                  // меняем цвет
FastLED.show();           // выводим
delay(5);                 // ждём

Это и было содержимое основного цикла программы loop()! Вот полный код:

Код программы
/*
  Игра на адресной светодиодной ленте "Мышка"
  - Светодиод случайно бегает туды-сюды
*/

#define LED_PIN 2     // пин ленты
#define LED_NUM 300   // кол-во светодиодов
#define LED_BR 250    // яркость ленты

#include "FastLED.h"
CRGB leds[LED_NUM];

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, LED_NUM);
  FastLED.setBrightness(LED_BR);
}

int tar, cur;      // храним позицию и цель
byte color;        // храним цвет
void loop() {
  if (tar == cur) {             // позиция совпала
    tar = random(0, LED_NUM);   // новая случайная позиция
    delay(500);                 // ждём
  }
  cur += (cur < tar) ? 1 : -1;  // направление движения

  // снижаем яркость всей ленты
  for (int i = 0; i < LED_NUM; i++) leds[i].fadeLightBy(180);

  leds[cur].setHue(color);  // зажигаем светодиод
  color++;                  // меняем цвет
  FastLED.show();           // выводим
  delay(5);                 // ждём
}

Видео


Полезный пример?

0 Комментариев

Нет комментариев

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *