Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
8 min read

温度管理の自動化を目指して...(10班)

渋温泉の旅館「かどや」の温泉の温度管理をお客さんが手動で水を出す形でしており、温度も旅館の人がわざわざ温泉に行って確認を行っている。その手間を省くために温度管理の自動化システムを作るという問題に取り組みました。

こんにちは、温泉ハッカソンの10班です。

本記事では、私たちが温泉ハッカソンで取り組んだ内容についてまとめています。

取り組んだ問題

渋温泉の旅館「かどや」の温泉の温度管理をお客さんが手動で水を出す形でしており、温度も旅館の人がわざわざ温泉に行って確認を行っている。その手間を省くために温度管理の自動化システムを作るという問題に取り組みました。

出したアイデア

出したアイデアは主に3つあります。

1つ目は、温度管理はスマホから行えるようにするアプリを作るというアイデアです。具体的には、

  • UIの作成
  • ラズパイとのデータとやり取り(電磁弁の開閉、温度の表示)
  • 温度の表示
  • 適温の設定
  • 適温になった時の通知

などのアイデアが出されました。

2つ目は、温度測定はラズパイと温度センサーを活用するというアイデアです。ラズパイが持っている情報の授受ができるGPIOピンを利用して温度センサーと電気的に接続することで温度を取得することを考えていました。また、温度の測定を行う際に混ぜる前後の温度のずれを少なくするために源泉が出てくる位置に木の箱を設置するというアイデアが出されましたが、時間の都合上、採用されませんでした。(参考にしたサイト:源泉100%掛け流しの秘密。温泉の裏側 | 鈴の宿 登府屋旅館 (tofuya.jp)

3つ目は、スマホのARゲームを温泉のお客様に対して提供することで、お客様が楽しんで温泉の温度管理を行いつつ、かどやさんの手間をなくすというアイデアです。このアイデアは、期日までに実装が間に合わないということで採用されませんでした。

中間発表

中間発表では、出されたアイデアを元に、発表を行いました。発表のコンセプトは、「スマートフォン一つで手間を削減」として、スマホアプリを用いて温度管理を行うアイデアを発表しました。

発表スライド(今回のハッカソンで利用するアイテム)
発表スライド(予定している最終成果物)

作成したスライドは以下のリンクからアクセスできます。

中間発表 スライド
スマートフォンを用いた 自動流水管理 10班 高薬師 岡友也(@okapi-) 山田悠人(@yuto) 岡村亮汰(@岡村亮汰) 西中蒼(@aoi_will) 吉田光志(@Koshi) 小野寺優輝(@Yuki Onodera)

発表後の質疑応答を通して、

  • 温度を測る場所によって測定値が変わるため、複数のセンサーを増やすと、より正確に温度を測定できるのではないか。
  • APIを用いると後から拡張できるため、他の班の成果物と連携ができるのではないか。
  • 作成した後のメンテナンスがしやすいようにハードウェアに依存しない方が良いのではないか。

という意見をいただきました。私たちは、できるだけこれらの意見を取り入れることができるように努力しました。

Dawnでの作業

Dawnでは、ラズパイ関係のタスクをやる人たち(データ班)とスマホアプリを作る人たち(モバイル班)に分かれて作業を行いました。

データ班では、ラズパイのセットアップや回路設計をオンラインで行う必要があったため、Dawnに加えてZoomの映像を使い、ラズパイや電気回路を映し、コミュニケーションを取りながら作業をしました。とてもやりずらかったですが、貴重な経験をすることができて良かったです。なかなか全員の都合が合うことがないため、時間を合わせて一緒に作業することが難しかったですが、少ない時間でできる限りのことはできたと思うので良かったと思います。

また、モバイルでは、アプリを実装する前に画面のUIのデザインを考えました。使う人はかどやの方を想定し、デザインはシンプルで分かり易くすることにしました。デザインを考え終わったら、さっそく作成したUIの実装に取り組みました。Dawnでは、UIの実装の途中まで行いました。通信や適温設定の機能は現地で実装しましたが、現地に行く前に通信の方法を調べました。

渋温泉での作業

1日目

ラズパイと温度センサーや電磁弁がまだ物理的につながっていなかったので、モバイル班とデータ班で分かれて作業しました。

モバイル班は、事前準備でUIが作成し終わらなかったので、UIを作成しました。

また、データ班は、電子回路がなぜうまくいかないか回路を組みなおしたり、ラズパイ内部の設定を変更したり試行錯誤しました。

2日目

午前中は「初の湯」という旅館で作業しました。作業内容は1日目の残りの電子回路を組み、温度センサーで感知した温度をラズパイに表示するプログラムを作成しました。温度を表示することができたので、「かどや」の温泉に行き、実際に温泉のお湯の温度が表示できるか検証しました。

午後はコミュニティセンサーで作業しました。そこで電磁弁とラズパイの電子回路を組み、モバイルアプリとの遠隔通信を実現するために、サーバーを作りました。モバイルアプリはサーバーからデータを取得する機能を実装しました。

3日目

2日目で電磁弁とラズパイの電子回路を組み換えたので、「かどや」の温泉に行き、電磁弁を実際にどう組み込むかや温度の表示ができるか検証しました。その後、最終発表ギリギリまで、スライドの作成に取り掛かり、最終発表に臨みました。

成果物

成果物としては、温度管理を行うスマホアプリと、アプリと通信を行うサーバーであるラズパイ、ラズパイによって制御される電子回路の3つができました。

これらの成果物で以下のようなことができます。

  • 温度の測定及び取得
  • 電磁弁の開閉(開閉音で確認)
  • ローカル環境またはPythonプログラム同士の通信による制御の実現

しかし、一方で以下のような課題が残されました。

  • 本番環境におけるアプリとラズパイ間の通信と制御
  • 実際の水道につないだ時の電磁弁の開閉が未確認
  • 複数の位置での温度取得及び温度計算
  • 最適温度になった時の通知機能
  • 複数人がアプリを利用した際の同期処理

用いた技術

データ

データ班では、モバイルと通信するサーバーや電子回路の管理機器として、ラズパイを利用し、ラズパイを制御するプログラミング言語としてPythonを利用しました。ラズパイでは、ラズパイ自身が持つピンを用いて電子回路を組みました。水温センサーと電磁弁のために作成した回路はそれぞれ以下の図のようになっています。

センサーを利用するための電子回路
電磁弁を利用するための電子回路

次に、Pythonでは、ラズパイ上で動くサーバープログラムとサーバーの動作を確認するためのクライアントプログラムを作成しました。サーバープログラムでは、ウェブソケットを介して通信の内容を受け取り、その内容に応じてラズパイを制御します。ウェブソケットを利用する理由として、Python言語以外で作られたアプリと通信するために必要だったからです。また、制御の内容は、

  • 水温の取得
  • 電磁弁の開閉

の二つになります。

そしてクライアントプログラムでは、サーバープログラムと通信を行い、特定の内容を送信した時に、その内容に応じた処理を行うかを確認しました。

モバイル

モバイル班では、プログラミング言語にDartを使いました。UIの実装の時に用いた技術は文章やボタンなどを縦に並べてくれるColumnウィジェットやボタンを作るTextButtonウィジェット、ボタンの縦や横のサイズを決めたり空白を作ったりする時に使うSizedBoxウィジェット、ボタンの形や色を決める時に使うContainerウィジェットなどです。

また、適温を設定する際にボタンを押したら温度が上がったり下がったりする機能をつけるために、状態管理を簡単にしてくれるProviderパッケージを使いました。

最初は、SetStateを用いて、温度の上げ下げ機能を実装しようとしました。しかし、適温の設定画面から現在の温度や電磁弁の操作ができるトップページに戻る時に、設定する必要があったので、それが簡単に実装できるProviderパッケージにしました。

さらに、サーバーを介してラズパイと遠隔通信できるようにするためにWebSocketパッケージを使いました。遠隔通信に必要であるWebSocketサーバーがPythonでも利用でき、PythonとDartをつなげることができるからです。主にWebSocketでの通信は_channel.sink.add('open')でラズパイに電磁弁を開けることを指示し、_channel.sink.add('close')で閉めることを指示します。また、ラズパイが取得した温度データをラズパイから取ってきます。以上がモバイルアプリを作る上で用いた技術です。

最終発表

最終発表では、作成したアプリの概要、利用した技術、実際のデモや今後取り組めたら良い点を発表しました。

アプリのデモ画面(温度取得、電磁弁開閉)
アプリのデモ画面(適温設定)

作成したスライドは以下のリンクからアクセスできます。

最終発表
温泉の温度管理を自動化 10班 高薬師 岡友也(@okapi-) 山田悠人(@yuto) 岡村亮汰(@岡村亮汰) 西中蒼(@aoi_will) 吉田光志(@Koshi) 小野寺優輝(@Yuki Onodera) 7分(1スライド18秒程度を目安)

最終的に賞を取ることはできませんでしたが、私たちの成果をちゃんと渋温泉やかどやの方々に伝えることができたと思います。

感想、学んだこと

  • 最初はなかなか思った通りに行かずどうなるかと思いましたが、何とか成果物として形に残すことができて良かったです。また、自身が行ったことがないコースについてのタスクの割り振りや設定が難しく苦労したため、そこの管理についてもう少し詳しく学ぶ必要性を感じました。
  • 1つの問題に対して、みんなでシステムを開発するのは初めてだったので、とても貴重な体験をさせていただきました。もちろん渋温泉の温泉巡りなどの観光も多少して楽しみました。また、この温泉ハッカソンで、FlutterとPython間での通信の仕方など技術的な部分を知ることができたので、今後に活かしていきたいです。また、このようなハッカソンが開催されるのなら、参加したいです。3日間ありがとうございました。
  • 事前に立てた計画通りには進まず、現地で試行錯誤しながらの作業になりました。しかし、壁にぶつかりながらも代案や別の手法をとることで、1つのアイデアを形にして成果物を作り出すことに成功しました。今回のハッカソンを通じてチームでの開発、課題解決力を学ぶことができたと思います。また機会があればハッカソンに参加させて頂きたいです。
  • 最初は軽い気持ちで、ハッカソンに参加しましたが、技術面でレベルの高さを感じました。最初はやっていることのレベルの高さに戸惑いましたが、何とか挫折せずについていくことができました。学生デモこのような難しい問題を乗り越えて、成果物を作り上げることができることを知れて良かったです。私も最後まで自走できる力を身に着けられるようになりたいと感じました。最後まで試行錯誤しながらも完成させることができて良かったです。
  • 今回のハッカソンでFlutterとPythonファイルの連携ははじめて行ったのですが、自分の無知なのもあり難航してしまいました。そのような苦い出来事もありプログラミング学習への意欲がより高まりました。このような経験を与えてくれたハッカソンはとても良いイベントだと改めて実感しました。