Project Note

班メンバー

企画案

今回、私たち3人は、現代人のスマホ依存症に注目し、進んで制限しようと思える制限ケースの作成を考えています。

スケッチ

現状考えている案は感圧センサーを使い、ケースにスマホを入れていた時間によって背面ライトの光が増していき、視覚的に自分がどれほど我慢したのかわかるようにしようとしています。

企画1

フィールドワーク

このケースの必要性を調べるために、「どのくらいスマホを使用しているか」、「スマホを触る時間を減らしたいか」について調査しました。

結果として、6時間以上スマホを触っている人が過半数を超えていることがわかりました。
そしてその時間を減らしたいと考えている人も70%弱いることが判明し、我々がその解決の糸口になる必要があると再確認しました。

設計図1

設計図1] MDFで箱を作り、土台を完成させながら、光で時間を伝えられるようにその上からアクリルをかぶせるようなデザインを考えています。

動作確認

まず、手元に届いた圧力センサーがちゃんと動くのかを確認しました。

参考にしたサイトはこちらです

プロトタイプするぞ

まず初めに、スマホを入れるための箱を作りました。 毎度のごとく、MakerCaseを使用してデータを作成。
そのデータに充電コード用の穴などをつけています。 Protype_Box1

時間で光り方が変わるコード

先週、プロトタイプの箱が出来たので次は圧力を感知した時間によってLEDテープが光り方が変えられるコードを考えました。
完成形のイメージとしては、徐々に光が強くなり、スマホを触っていない時間が「感覚的」にわかるようにしたいのですが とりあえず一定時間ごとに光が増えるようにコードを製作しました。

下記のコードは動画のものに、少し改良を加えたものです。

  1.  #include <Adafruit_NeoPixel.h>
  2. // NeoPixelの設定
  3. #define NUM_PIXELS 5
  4. #define PIN_PIXELS 6
  5. Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);
  6. // 圧力センサーのピン設定
  7. #define PRESSURE_SENSOR_PIN A0
  8. // LEDの色設定
  9. #define LED_COLOR_R 255, 0, 0
  10. #define LED_COLOR_Y 255, 255, 0
  11. #define LED_COLOR_O 255, 69, 0
  12. #define LED_COLOR_W 255, 255, 255
  13. #define LED_COLOR_B 0, 0, 255
  14. // 初期LEDの数
  15. int numLEDs = 0; // 最初はLEDはすべて消灯状態
  16. void setup() {
  17. pixels.begin(); // NeoPixelの初期化
  18. Serial.begin(9600); // シリアル通信の開始(デバッグ用)
  19. }
  20. void loop() {
  21. // 圧力センサーの値を読み込む
  22. int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
  23. if (sensorValue < 200) { // 圧力センサーの閾値(例: 200)
  24. // 圧力がかかっている場合
  25. // LEDを点灯させる
  26. for (int i = 0; i < numLEDs; i++) {
  27. switch(i) {
  28. case 0:
  29. pixels.setPixelColor(i, pixels.Color(LED_COLOR_B));
  30. break;
  31. case 1:
  32. pixels.setPixelColor(i, pixels.Color(LED_COLOR_W));
  33. break;
  34. case 2:
  35. pixels.setPixelColor(i, pixels.Color(LED_COLOR_Y));
  36. break;
  37. case 3:
  38. pixels.setPixelColor(i, pixels.Color(LED_COLOR_O));
  39. break;
  40. case 4:
  41. pixels.setPixelColor(i, pixels.Color(LED_COLOR_R));
  42. break;
  43. }
  44. }
  45. pixels.show(); // LEDに色を表示
  46. // 5秒待つ
  47. delay(5000);
  48. // LEDの数を増やす(最大NUM_PIXELSまで)
  49. if (numLEDs < NUM_PIXELS) {
  50. numLEDs++;
  51. }
  52. } else {
  53. // 圧力がかかっていない場合、すぐにLEDを消灯させる
  54. pixels.clear(); // すべてのLEDを消灯
  55. pixels.show(); // LEDに反映
  56. // LEDの数を初期化
  57. numLEDs = 0;
  58. }
  59. delay(100); // 少し待つ

置けば置くほど光る箱

私たちは、徐々に光が増えていき、1時間を視覚的にわかるように、dfLinkでグラフとしても可視化出来るようにプログラムを組みました。
前回のレポートでは出来ていなかった徐々光量が増えて、視覚的に時間がわかるプログラムも完成しています。

概要

下記のソースコードで徐々に光らせるプログラムは出来るのですが、授業で使ったコードでdfLinkにつなげようとするとうまくいきません。
pyファイルのコードには、圧力センサーが圧力数値を0と示した時に、信号を送れないという仕様があるようで、「0になったらスキップする」というプログラムをしてグラフ化することに成功しました。
箱の側面にアクリルを配置しているのは光を拡散させるための装飾です。

反省点

改良したかった点

もともと、dfLinkを介して置いた時間がLINEにメッセージとして送られるプログラムを作りたかったが
コードが複雑で頭がパンクしそうになり、惜しくも断念してしまった。

ソースコード

  1. #include <Adafruit_NeoPixel.h>
  2. #define NUM_PIXELS 5
  3. #define PIN_PIXELS 6
  4. Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);
  5. #define PRESSURE_SENSOR_PIN A0
  6. #define LED_COLOR_R 255, 0, 0
  7. #define LED_COLOR_Y 255, 255, 0
  8. #define LED_COLOR_O 255, 69, 0
  9. #define LED_COLOR_W 255, 255, 255
  10. #define LED_COLOR_B 0, 0, 255
  11. unsigned long startTime = 0;
  12. unsigned long elapsedTime = 0;
  13. const unsigned long ONE_HOUR = 3600000; // 1時間のミリ秒
  14. const unsigned long LED_INTERVAL = ONE_HOUR / NUM_PIXELS; // 各LEDが点灯を開始する間隔
  15. int currentLED = 0;
  16. int ledBrightness[NUM_PIXELS] = {0}; // 各LEDの明るさ
  17. void setup() {
  18.   pixels.begin();
  19.   Serial.begin(9600);
  20.   pixels.clear();
  21.   pixels.show();
  22. }
  23. void loop() {
  24.   int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
  25.   Serial.println(sensorValue);
  26.   if (sensorValue >= 201) {
  27.     // 圧力が201以上の場合、即座に消灯
  28.     resetLEDs();
  29.   } else if (sensorValue <= 200) {
  30.     if (startTime == 0) {
  31.       startTime = millis();
  32.     }
  33.     
  34.     elapsedTime = millis() - startTime;
  35.     unsigned long elapsedMinutes = elapsedTime / 60000;
  36.     
  37.     Serial.print("Elapsed time: ");
  38.     Serial.print(elapsedMinutes);
  39.     Serial.println(" minutes");
  40.     updateLEDs();
  41.   }
  42. }
  43. void resetLEDs() {
  44.   startTime = 0;
  45.   elapsedTime = 0;
  46.   currentLED = 0;
  47.   for (int i = 0; i < NUM_PIXELS; i++) {
  48.     ledBrightness[i] = 0;
  49.   }
  50.   pixels.clear();
  51.   pixels.show();
  52. }
  53. void updateLEDs() {
  54.   for (int i = 0; i <= currentLED; i++) {
  55.     if (i == currentLED) {
  56.       // 現在のLEDの明るさを徐々に上げる
  57.       unsigned long ledElapsedTime = elapsedTime % LED_INTERVAL;
  58.       ledBrightness[i] = map(ledElapsedTime, 0, LED_INTERVAL, 0, 255);
  59.     } else {
  60.       // 既に点灯済みのLEDは最大輝度に設定
  61.       ledBrightness[i] = 255;
  62.     }
  63.     // LEDの色を設定
  64.     uint32_t color;
  65.     switch (i) {
  66.       case 0: color = pixels.Color(0, 0, ledBrightness[i]); break; // 青
  67.       case 1: color = pixels.Color(ledBrightness[i], ledBrightness[i], ledBrightness[i]); break; // 白
  68.       case 2: color = pixels.Color(ledBrightness[i], ledBrightness[i], 0); break; // 黄
  69.       case 3: color = pixels.Color(ledBrightness[i], ledBrightness[i] * 69 / 255, 0); break; // オレンジ
  70.       case 4: color = pixels.Color(ledBrightness[i], 0, 0); break; // 赤
  71.     }
  72.     pixels.setPixelColor(i, color);
  73.   }
  74.   pixels.show();
  75.   // 次のLEDの点灯を開始するタイミングをチェック
  76.   if (elapsedTime >= (currentLED + 1) * LED_INTERVAL && currentLED < NUM_PIXELS - 1) {
  77.     currentLED++;
  78.   }
  79. }