nyanpyou Note

主な目的は調べたり作ったりしたプログラミング備忘録(予定)

そうだ温度計を作ろう その3

ブログ執筆に着手してから思った以上に時間(1か月近く)がかかってしまいましたが、温度計最終回その3外観編。

さっくり行こうと思います。

nyanpyou.hatenablog.com

nyanpyou.hatenablog.com

外観

完成した温度計の外観はこんな感じになった。

f:id:nyanpyou106:20210220144412j:plain
前面
f:id:nyanpyou106:20210220144437j:plain
背面
f:id:nyanpyou106:20210220144507j:plain
上面

液晶にマウントしたラズパイを、アクリル板に固定してみた。自分でアクリルの加工を行うと絶対仕上がりが汚くなると思ったので、3DCADで図面を描いてみて業者の方にお願いすることにした。使用したのはFusion360。3DCAD自体使ったことが無かったのでソフトはどれを選んでもよかったが、無料で使える3DCADとして有名らしいということで選択。実際これが無料で使えるなんて驚いた。DIYで何か作りたいことは全部これでやれちゃいそう。

f:id:nyanpyou106:20210220150347p:plain
見よう見まねで設計した温度計の枠
知りたい方がもしいたら各種寸法入りのデータも掲載します

加工を依頼したのはアクリルショップはざいや様

www.hazaiya.co.jp

100mm×140mm×3mmのアクリル板2枚に、穴あけと磨き仕上げをお願いして、送料込みおよそ4500円。

依頼から納品まで2週間程度かかるが、この値段でとても綺麗に加工して貰えたので非常に満足。多少穴位置がずれたとしても仕方ないなと思っていたが、一切追加の加工や調整の必要が無く組み上げることができた。

その他は必要になったものを随時ホームセンターやAmazonで調達した。

Amazon.co.jp: Geekworm Raspberry pi(ラズベリーパイ) インストールツール M2.5シリーズ (132pcs)六角真鍮スペーサー + スタンドオフ + ナット + ネジを含み、 収納ケース入りのPi4B / 3B +/ 3B / Zero W用アクセサリーキット: パソコン・周辺機器

Amazon | UGREEN L字 USB Cケーブル PD対応 60W/3A 急速充電 断線防止 アンドロイド スマホ 2018 iPad Pro Macbook Pro Dell XPS Lenovo Yoga Galaxy S9 S8 Plus その他USB-C機器対応 2m | UGREEN | USBケーブル 通販

Amazon.co.jp: Anker PowerPort PD 2(PD対応 30W 2ポート USB-A & USB-C 急速充電器)【PSE認証済 / Power Delivery対応 / PowerIQ搭載 / コンパクトサイズ】iPhone 11 / 11 Pro / 11 Pro Max / XR / 8、S10 / S10+、その他対応: ホーム&キッチン

改善点

まだまだ改善点や問題点はあるので、まとめて列挙する。

実は室温がズレる

割と致命的だが、ラズパイ本体の発熱が想像以上に強烈で、背面に配置している温度センサーが正しい室温を恐らく出していない。背面のアクリル板を触ると少し暖かいし、実際に家にあった別の温度計をそばに持ってきて比較してみると、大体1.5℃くらい高く温度が表示されていることが分かった。

温度センサーを本体から離すとなると、デザインを作り直すことになるためちょっと難しそうだが、今現在は温度センサーがラズパイ側を向いて接続されているため、ピンヘッダを取り付けなおして外向きにすれば、ある程度改善するのではないかと予想している。

動作させ続けると液晶に白い靄が生じる

2~3日温度計を起動し続けると、液晶の外枠付近に白い靄が生じる。一度電源を落とし、しばらく放置してから再度電源を入れると復旧したが、原因は不明。熱?

HTMLにアクセスした瞬間にエラーが出力される

見かけ上問題なく機能はしているが、ローカルサーバーを立てた後、温度計のHTMLにアクセスすると、エラーが出力される。

#温度計エラー全文
Traceback (most recent call last):
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 138, in run
    self.finish_response()
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 180, in finish_response
    self.write(data)
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 279, in write
    self._write(data)
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 453, in _write
    result = self.stdout.write(data)
  File "/usr/lib/python3.7/socketserver.py", line 799, in write
    self._sock.sendall(b)
ConnectionResetError: [Errno 104] Connection reset by peer
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 38578)
Traceback (most recent call last):
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 138, in run
    self.finish_response()
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 180, in finish_response
    self.write(data)
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 279, in write
    self._write(data)
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 453, in _write
    result = self.stdout.write(data)
  File "/usr/lib/python3.7/socketserver.py", line 799, in write
    self._sock.sendall(b)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 141, in run
    self.handle_error()
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 368, in handle_error
    self.finish_response()
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 180, in finish_response
    self.write(data)
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 274, in write
    self.send_headers()
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 331, in send_headers
    if not self.origin_server or self.client_is_modern():
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 344, in client_is_modern
    return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/socketserver.py", line 316, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.7/socketserver.py", line 347, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.7/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.7/socketserver.py", line 720, in __init__
    self.handle()
  File "/usr/lib/python3.7/wsgiref/simple_server.py", line 133, in handle
    handler.run(self.server.get_app())
  File "/usr/lib/python3.7/wsgiref/handlers.py", line 144, in run
    self.close()
  File "/usr/lib/python3.7/wsgiref/simple_server.py", line 35, in close
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
----------------------------------------

調べても全く不明だったため、もし知っている方がいれば教えて頂けると幸いです。自力で分かったのは、どうも__pycache__フォルダが作成されていると出るっぽいということだけ。理由を理解できるかはわからないけど、「よくわからんエラーが出るけど動きます」は気持ち悪い。

終わりに

想像以上にお金と時間(3万円&4か月くらい)はかかってしまいましたが、ちゃんと最後まで形にすることができました。安堵。

次に何を作るかはまだ分かりませんが、唐突に作りたいと思ったものを作ろうと思います。いつも通り。

その前に転職活動しなきゃ(使命感)