このチュートリアルは武蔵野美術大学通信教育課程授業用に作成したものです。
Arduino フルカラーLEDを光らせる(NEOPIXEL)ではFastLEDをインストールしてサンプルプログラムを実装しました。今回はもう少し実用的に、delay関数を使わずに利用する方法を学びます。
delay関数は便利な関数ですが、処理を中断してしまうため、何かのセンサーで値を取り続けながら他の処理を行うということが難しく、使い勝手が悪いです。そのためdelayを使わずmillis関数という同じように時間を扱う関数で実装します。少し複雑になりますが、条件分岐を行いながら実装したいなどの途中処理が必要な場合は覚えておいて損は無いのでぜひチャレンジしてみてください。
プログラム
まず前回のプログラムコードを記載します
#include <FastLED.h> #define NUM_LEDS 4 #define DATA_PIN 3 CRGB leds[NUM_LEDS]; //////////////////////////////////////////////////////////// void setup() { FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); LEDS.setBrightness(84); } //////////////////////////////////////////////////////////// void loop() { for (int hue = 0; hue < 255; hue++) { for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue, 255, 255); FastLED.show(); } delay(10); } }
今回のコードはこちらです。
#include <FastLED.h> //フルカラーLEDを便利に使うためのライブラリを呼び出しています。 #define NUM_LEDS 4 //プログラム中の定数に対して名前を付けることができます。#defineで定義された定数は、コンパイル時に値へと置き換えられ、チップ上のメモリ(RAM)を消費しません。 #define DATA_PIN 3 CRGB leds[NUM_LEDS]; unsigned long previousLEDMillis = 0; unsigned long LEDinterval = 10; //delayの代わりの待機ミリ秒 int hue = 0; //////////////////////////////////////////////////////////// void setup() { FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); LEDS.setBrightness(84); } //////////////////////////////////////////////////////////// void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousLEDMillis >= LEDinterval) { hue = hue + 1; if (hue >= 255) { hue = 0; } for (int j = 0; j < NUM_LEDS; j++) { leds[j] = CHSV(hue, 255, 255); } FastLED.show(); previousLEDMillis = currentMillis; } } ////////////////////////////////////////////////////////////
「unsigned long currentMillis = millis();」にてArduino の起動から経過した時間millsをcurrentMillisという変数に格納します。
現在時間から、previousLEDMillisの値を引いた値がLEDinterval(今回は10ミリ秒)以上になった場合、hueという変数に1を加えます。こうすることで、10ミリ秒ごとに更新するという処理を実現しているのですね!
以下に流れるように点灯するサンプルを記載します(20241117更新)
#include <FastLED.h> #define LED_PIN 6 // LEDストリップのデータピン #define NUM_LEDS 20 // LEDの数 #define BRIGHTNESS 64 // LEDの明るさ CRGB leds[NUM_LEDS]; unsigned long previousMillis = 0; // 前回のLED更新時刻 const long interval = 100; // 点灯間隔(ミリ秒) int currentLED = 0; // 現在点灯しているLEDのインデックス void setup() { FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.clear(); // 全てのLEDをオフにする FastLED.show(); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // タイムスタンプを更新 // すべてのLEDを消灯 // for (int i = 0; i < NUM_LEDS; i++) { // leds[i] = CRGB::Black; // } // 現在のLEDを点灯 leds[currentLED] = CRGB::Blue; // 任意の色を指定(例: 青色) // 次のLEDへ currentLED++; if (currentLED >= NUM_LEDS) { currentLED = 0; // 最後まで行ったら最初に戻る } // LEDの状態を反映 FastLED.show(); } }