このチュートリアルは武蔵野美術大学通信教育課程授業用に作成したものです。
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ミリ秒ごとに更新するという処理を実現しているのですね!