
最近著迷一部動漫
新石紀 , 是以科研為主題展開的作品; 這邊不是要討論這部作品,
重點是女角們身材都很好 而是其中以陸續展開的科技樹, 只要玩過即時戰略遊戲的人應該都深知科技樹的重要性, 放到現實生活中, 不斷的研究開發的過程對(阿宅)而言, 幾乎是一股能夠與性並駕齊驅的樂趣!
扯遠了回到標題, 為什麼要搞電錶, 而且是無線電錶?
其實是最近的電費實在是太貴, 冷氣沒有開整天, 兩個月就跑了一千度, 為了瞭解用電狀況, 初期我將
米家智能插座 插在懷疑用電量高的 洗衣機、飲水機上.
後來我覺得有些電器就是該開, 省不了的話, 單獨看一個電器的用電量是沒有幫助的. 應該要從總量來看, 人不在家的時候不必要的電器是不是吃了太多的電量? 如此就必須監控電錶的變化.

不斷的記錄電錶的變化也是個辦法, 但這實在是太原始了吧! 如果等
智慧電錶 也是個辦法, 不過是要等多久?
這時候只好發揮科技宅的科技能力, 自動電錶度數辨識系統!
很幸運的是已經有前人開發了類似的程式碼:
analog-gauge-reader
當然不能直接套用, 但是整個系統概念開發都是從這個sample延伸的.
平台
如果按照目前智慧電錶的運作, 15分鐘要截取一次, 續航力至少要達到一天, 所以用手機基本上不可行, 況且電錶在地下室, 手機也傳不出去.
而續航力至少一天的原因是, 電錶在地下室沒有插座可以供電
, 就算有鐵定也是公用電, 隨便使用是會被別人白眼的.
所以每天出門前去更換電池是還可行的(雖然還是有點麻煩), 運算力要足夠, 可以擷取影像, 又不會太耗電, 看來Raspberry Pi Zero W是最適合的了!
搭配行動電源10000mAh/額定6200mAh/5V, 耗電量100mAh 理論上應該可以供電 62h, 大約是兩天半.
影像擷取
很可惜迷你相機的視角不夠廣, 而且對焦距離不夠近, 所以只能拍攝到兩格的度數, 且相當模糊.
還好兩位數的度數也足夠判斷用電狀況, 模糊的問題還不至於影響度數的判讀太多.
數據傳輸
數據的部分, 毫無懸念就是Lora了, 家裡的智慧瓦斯電錶也是Lora抄錶. 之前買過的Lora模組, 測試可以從B3傳輸到12F, 完全沒有問題
而整個系統大概分為以下幾個部分:
- 電錶影像擷取
- 度數辨識
- 度數傳送
電錶影像截取
影像擷取前人樹都種得很好了, 利用picamera就可以在Python很簡單的控制camera:
但是有一個坑要注意, 要是picamera拍下來不想存成檔案, 再用opencv函式讀回來這樣沒效率的事情, 就要用BytesIO的stream去接picamera的影像, 然後再轉到numpy, 再轉到opencv (opencv只吃numpy).
from io import BytesIO
from picamera import PiCamera
import cv2
import numpy as np
import time
# Create the in-memory stream
stream = BytesIO()
camera = PiCamera()
camera.start_preview()
camera.capture(stream, format='png')
# "Rewind" the stream to the beginning so we can read its content
stream.seek(0)
file_bytes = np.asarray(bytearray(stream.read()), dtype=np.uint8)
img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
format = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())
filename = format + '.png'cv2.imwrite(filename, img)
此外, 還要安裝picamera[array]
(非常重要!)
pip install "picamera[array]"
度數辨識
度數辨識的部分是本文重點, 但是我打算留到下篇文章再好好介紹:P