作ってきたやつをまとめる
今まで処理ごとに作ってきたやつを一つにまとめて、完成させようと思う。処理の流れとしては
- 10分ごとに処理を行う。
- 時間がきたら明るさを取得する。
- 明るさをもとにライトを点けるか判断する。
- 暗かったらライトを点ける。
- 撮影をする。
- 撮影した画像に時間と明るさを表示する。
- 毎日18:03に微速度動画を作成する。
こんな感じ。その前に明るさ測定をちょっといじる。
ADCにパスコンを使ってみる
ADCの入力にバイパスコンデンサを使うと数値が安定するらしい。データシートに書いてあったので、1μFのコンデンサを買ってきた。それをICの入力前に入れる。0.1秒毎に1000回数値を取得してみて、違いがあるか確認してみた。
上がパスコン無し、下があり。どうですか。表にしてみよ。
パスコンあり | パスコンなし | |
平均 | 3079.985 | 3309.093 |
中央 | 3082 | 3311 |
最大 | 3174 | 3372 |
最小 | 2980 | 3238 |
標準偏差 | 48.34716926 | 43.57428543 |
どうですか。パスコンありの方がバラついてんじゃねぇか。意味なさそうだな。やめよ。
CdSセルのもう一方の抵抗の値
ICのCHへかける電圧は分圧回路を使っているので電圧の変化は曲線な感じになる。暗い時に数字が0になって、薄暗いあたりの数字が細かくなる抵抗の値ってどうやって求めんだろーなーと調べたけどよく分かんなかったので力技でいくことにした。CdSセルの抵抗の値は1kΩから100kΩぐらいに変わるとして、R1にCdS、R2に固定値の抵抗を入れるとする。
こんな感じで、R2の抵抗値が大きくなるほどカーブが緩やかになってくみたい。25kΩ使いたかったけど22kΩしか持ってないし、合成するスペースもあんまないので22kΩにすることにした。一度一日中回してみて、数値の変化を追いかけてみっと大体MPCから吐き出される数値が1000ぐらいのときが閾値っぽい。うーん適当な。
プログラミング
そろそろ気が済んだのでプログラミングする。作ったやつのコピペだ。今回はコメント形式で意図を残しとこっと。
#必要なもんimport import picamera import datetime from time import sleep import os from PIL import Image, ImageFont, ImageDraw import pigpio as pg pi = pg.pi() #GPIO使う準備 h = pi.spi_open(0, 50000, 0) #SPI通信のハンドラ #準備できてなかったら終了 if not pi.connected: exit(0) #ADCからバイナリを取得、 (count, rx_data) = pi.spi_xfer(h, [0b00000110, 0, 0]) bi = rx_data[1] << 8 | rx_data[2] #暗かったらライト点ける if bi < 1000: pi.set_mode(17, pg.OUTPUT) pi.write(17, pg.HIGH) islighted = True #ライトが点いてるかのbool値にTrue #カメラの画像保存準備 dir_path = '/home/pi/nas/pic/' #保存場所 files = os.listdir(dir_path) #保存場所内のファイル数を取得し… file_name = str(len(files)).zfill(5) #5桁で0フィルしてファイル名で使う #撮影 with picamera.PiCamera() as camera: sleep(5) #ウォームアップ camera.hflip = True #画像回転 camera.vflip = True #これも camera.capture(dir_path+file_name+'.jpg') #フルパスとファイル名を指定して保存 #写真に追加描画する準備 now = datetime.datetime.now() #日付時刻取得 text = now.strftime('%Y-%m-%d %H:%M') #フォーマットして文字列に変換 illumi = str(bi) #明るさの数値を文字列型にしとく ※いらないかも #画像編集 img = Image.open(dir_path+file_name+'.jpg') #撮影した写真開く draw = ImageDraw.Draw(img) #描画のなんか font = ImageFont.truetype('/home/pi/nas/DSEG7Classic-Bold.ttf', 15) #フォント指定 draw.text((6, 6), text, font=font, fill=(0,0,0)) #影づくり draw.text((5, 5), text, font=font, fill=(255,255,255)) draw.text((6, 25), illumi, font=font, fill=(255,255,255)) #めんどいので明るさの方は影作ってない img.save(dir_path+file_name+'.jpg') #上書き保存 #ライト点いてたら消す if islighted: pi.write(17, pg.LOW) pi.spi_close(h) #SPI通信の後処理 pi.stop() #GPIOの後処理
…我ながら汚いコードだ。でもとりあえず形になった!嬉しいね。
追記:上記コードはエラーになる。続き
コメント