見える化。
意外と多いタスク
小1の娘は初めての長い夏休みを堪能しつつ、初めての夏休みの宿題をこなしています。意外と学校の宿題も多く大変そうだなぁと思いつつ、親がいちいち「あれやった?」みたいなポーリングによる進捗確認は工数だけがかかる作業なのであまりしたくありません。
そこで、デイリーでこなすべき宿題の進捗を可視化できるガジェットを作ってみました。
Arduinoで作っていきます
イメージとしては光り物で、タスクが一覧できる物理的なカンバンを作って、タスクごとに光らせるんですが、タスクが終わったらボタンを押して光っている色を変える感じ。
とりあえず家に転がってたArduino Mega互換ボードに、NeopixelのLEDとスイッチを接続。スイッチはプルアップとして使うので、スイッチはGPIOとGNDにつなげます。Neopixelは信号線を1つでも良かったのですが、無心で作ってたので、複数信号線を作ってしまいました…(笑)
さらに、3DプリンタでLEDを覆うようなパーツを作って・・・。
これらをすべてOSBボードに打ち付けて、できました。
動作の様子はこちら
起動直後はすべてのタスクが赤く光ります。
タスクを終えて、ボタンを押すと赤→青になります。
全部のタスクが終わると、白色点滅。
全クリ時に、おめでとう感を出していくスタイルです。
導入してみてどうだった?
普段は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(); }