はじめに
フルカラーLEDのWS2813Bを7セグLED風に並べて数字を表示する基板(WS2813-7segPanel)を作成したので、その基板を1電子サイコロを作成します。
基板の表面に手をかざすとハンドパワーで1から6のランダムな数字が回転して停止します。
#基板の説明
基板単体の大きさは82×100mmの大きさで、表面にはWS2813Bを24個実装して7セグ風の数字と、ピリオド(.)とコロン(:)表現できます。また右上に温度、湿度、気圧センサのBME280と、中央下側に照度センサを搭載しています。
裏面は制御用マイコンWROOM-02とその周辺回路となっています。
基板の入手方法はスイッチサイエンス殿で販売させてもらってます。
#完成品
完成品の動画です。
手を基板に近づけるとLEDの文字回転し始めます。だんだん変化する速度が遅くなり停止したら点滅するようにします。
#プログラム
####仕様
・明るさが暗いから明るいに変化した時にサイコロをスタートする。
・LED色は乱数で決定する。
・数字は乱数で生成して30回変化して停止する。
・同じ数字が連続して表示しないようにする。
・変化する速度は徐々に遅くなり停止する。
・停止後、数字を3回点滅する。
/*******************************************************
電子サイコロ
********************************************************/
#include "WS2813Panel.h"
WS2813Panel MyPanel(1);
uint32_t color[] = {0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff, 0xffffff};
uint8_t bright = 0x20; //明るさ
//uint16_t swstat = 0; //ボタンの状態記録用 チャタリング防止
int PreBright = 0xff;
int CurBright = 0;
//-------------------------------
void setup()
{
Serial.begin(115200);
Serial.println("Program Start");
Serial.println("LED Initialze");
MyPanel.Begin();
// MyPanel.SetBrightness(bright);
//明るさ自動調整ON
MyPanel.AutoBright = true;
delay(10);
MyPanel.Clear();
MyPanel.DispNum(0, 0, 0xffffff);
MyPanel.Show();
}
//-------------------------------
void loop()
{
CurBright = MyPanel.GetBright();
// Serial.printf("CurBright = %d PreBright = %d\n", CurBright, PreBright);
if ((CurBright - PreBright) > 5 && PreBright < 5)
{
Dice();
}
PreBright = CurBright;
delay(200);
}
//-------------------------------
void Dice()
{
randomSeed(millis());
int num;
int temp;
uint32_t clr = color[random(0, 7)];
//数字を30回変化させる 変化する間隔はだんだん遅くなる
for (int i = 0; i < 30; i++)
{
temp = random(1, 7);
if (temp == num)
continue;
num = temp;
MyPanel.DispNum(0, num, clr);
MyPanel.Show();
delay(i * 20);
}
//停止した数字を点滅3回
for (int j = 0; j < 3; j++)
{
MyPanel.DispNum(0, num, 0);
MyPanel.Show();
delay(200);
MyPanel.DispNum(0, num, clr);
MyPanel.Show();
delay(200);
}
}
#参考リンク
GitHub WS2813-7segPanelライブラリー
YouTube RainClock2
お天気時計
コントローラ付基板
コントローラ無し基板