Androidのメモとか

ポキオの日記です。今日も遅延してない。

娘の夏休みの宿題のデイリー進捗を可視化してみた

見える化

ポキオ Arduino Todo カンバン Adafruit Neopixel

意外と多いタスク

小1の娘は初めての長い夏休みを堪能しつつ、初めての夏休みの宿題をこなしています。意外と学校の宿題も多く大変そうだなぁと思いつつ、親がいちいち「あれやった?」みたいなポーリングによる進捗確認は工数だけがかかる作業なのであまりしたくありません。

そこで、デイリーでこなすべき宿題の進捗を可視化できるガジェットを作ってみました。

Arduinoで作っていきます

イメージとしては光り物で、タスクが一覧できる物理的なカンバンを作って、タスクごとに光らせるんですが、タスクが終わったらボタンを押して光っている色を変える感じ。

ポキオ Arduino Todo カンバン Adafruit Neopixel

とりあえず家に転がってたArduino Mega互換ボードに、NeopixelのLEDとスイッチを接続。スイッチはプルアップとして使うので、スイッチはGPIOとGNDにつなげます。Neopixelは信号線を1つでも良かったのですが、無心で作ってたので、複数信号線を作ってしまいました…(笑)

ポキオ Arduino Todo カンバン Adafruit Neopixel

さらに、3DプリンタでLEDを覆うようなパーツを作って・・・。

ポキオ Arduino Todo カンバン Adafruit Neopixel

これらをすべてOSBボードに打ち付けて、できました。

動作の様子はこちら

起動直後はすべてのタスクが赤く光ります。

ポキオ Arduino Todo カンバン Adafruit Neopixel

タスクを終えて、ボタンを押すと赤→青になります。

ポキオ Arduino Todo カンバン Adafruit Neopixel

全部のタスクが終わると、白色点滅。

全クリ時に、おめでとう感を出していくスタイルです。

導入してみてどうだった?

普段はWFHな私ですが、仕事中も娘の進捗が見えて非常によかったです。また、娘も達成感を味わえるようで、進んでArduinoの電源を入れて宿題に取り組んでました。

とりあえず、大成功?

コードはこんな感じ

#define使えよ…(笑)

#include <Adafruit_NeoPixel.h>

int b1 = 0;
int b2 = 15;
int b3 = 17;
int b4 = 19;
int b5 = 21;

int l1 = 12;
int l2 = 10;
int l3 = 5;
int l4 = 8;
int l5 = 7;

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(2, l1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(2, l2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(2, l3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(2, l4, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels5 = Adafruit_NeoPixel(2, l5, NEO_GRB + NEO_KHZ800);

bool stat1 = false;
bool stat2 = false;
bool stat3 = false;
bool stat4 = false;
bool stat5 = false;

void setup() {
  Serial.begin(9600);

  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  pinMode(b3, INPUT_PULLUP);
  pinMode(b4, INPUT_PULLUP);
  pinMode(b5, INPUT_PULLUP);

  pixels1.begin();
  pixels2.begin();
  pixels3.begin();
  pixels4.begin();
  pixels5.begin();

  pixels1.setBrightness(64);
  pixels2.setBrightness(64);
  pixels3.setBrightness(64);
  pixels4.setBrightness(64);
  pixels5.setBrightness(64);
}

void loop() {
  stat1 = stat1 || (digitalRead(b1) == LOW);
  stat2 = stat2 || (digitalRead(b2) == LOW);
  stat3 = stat3 || (digitalRead(b3) == LOW);
  stat4 = stat4 || (digitalRead(b4) == LOW);
  stat5 = stat5 || (digitalRead(b5) == LOW);

  if (stat1) {
    pixels1.setPixelColor(0, pixels1.Color(0, 0, 255));
    pixels1.setPixelColor(1, pixels1.Color(0, 0, 255));
  } else {
    pixels1.setPixelColor(0, pixels1.Color(255, 0, 0));
    pixels1.setPixelColor(1, pixels1.Color(255, 0, 0));
  }

  if (stat2) {
    pixels2.setPixelColor(0, pixels1.Color(0, 0, 255));
    pixels2.setPixelColor(1, pixels1.Color(0, 0, 255));
  } else {
    pixels2.setPixelColor(0, pixels1.Color(255, 0, 0));
    pixels2.setPixelColor(1, pixels1.Color(255, 0, 0));
  }

  if (stat3) {
    pixels3.setPixelColor(0, pixels1.Color(0, 0, 255));
    pixels3.setPixelColor(1, pixels1.Color(0, 0, 255));
  } else {
    pixels3.setPixelColor(0, pixels1.Color(255, 0, 0));
    pixels3.setPixelColor(1, pixels1.Color(255, 0, 0));
  }

  if (stat4) {
    pixels4.setPixelColor(0, pixels1.Color(0, 0, 255));
    pixels4.setPixelColor(1, pixels1.Color(0, 0, 255));
  } else {
    pixels4.setPixelColor(0, pixels1.Color(255, 0, 0));
    pixels4.setPixelColor(1, pixels1.Color(255, 0, 0));
  }

  if (stat5) {
    pixels5.setPixelColor(0, pixels1.Color(0, 0, 255));
    pixels5.setPixelColor(1, pixels1.Color(0, 0, 255));
  } else {
    pixels5.setPixelColor(0, pixels1.Color(255, 0, 0));
    pixels5.setPixelColor(1, pixels1.Color(255, 0, 0));
  }

  pixels1.show();
  pixels2.show();
  pixels3.show();
  pixels4.show();
  pixels5.show();

  if (stat1 && stat2 && stat3 && stat4 && stat5) {
    congrats();
  }
}

void congrats() {
  for (int i = 0; i < 100; i++) {
    setColor(255, 255, 255);
    delay(500);
    setColor(0, 0, 0);
    delay(500);
  }

  setColor(255, 255, 255);
  while (1) {}
}

void setColor(int r, int g, int b) {
  pixels1.setPixelColor(0, pixels1.Color(r, g, b));
  pixels1.setPixelColor(1, pixels1.Color(r, g, b));
  pixels2.setPixelColor(0, pixels1.Color(r, g, b));
  pixels2.setPixelColor(1, pixels1.Color(r, g, b));
  pixels3.setPixelColor(0, pixels1.Color(r, g, b));
  pixels3.setPixelColor(1, pixels1.Color(r, g, b));
  pixels4.setPixelColor(0, pixels1.Color(r, g, b));
  pixels4.setPixelColor(1, pixels1.Color(r, g, b));
  pixels5.setPixelColor(0, pixels1.Color(r, g, b));
  pixels5.setPixelColor(1, pixels1.Color(r, g, b));

  pixels1.show();
  pixels2.show();
  pixels3.show();
  pixels4.show();
  pixels5.show();
}

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。