インドアな日常

IT系のネタを記載していくブログです。アウトドアも好きなのでそのブログも書いてます。→ http://tamin-ta.hatenadiary.jp

nature remo + raspberry piで温度/湿度を表示させたよ日記 ②

前回nature remoから取得できた湿度データを今度は、7segdisplayに表示させるよ。

 

まずはラズパイでLEDを制御してみる。

とりあえずググったりしてLEDを光らす回路を作ってLEDを光らせることにした。

でもなぜか光らなかったり。

ちょっとブレッドボードが適当な作りな気がして、いろいろと接触不良があるっぽい。

でもとりあえず作った回路とサンプルコードでLEDを光らすことに成功。

 

めっちゃ簡単なんだけども、おおーってなったよ。ちょっと感動しますね。

この後PNPトランジスタも使って増幅させてみたりして遊んだ。コレクタ接地コレクタ接地。

こんなことやるの大学以来だから楽しいなー。

 

使った言語はpythonです。別にpythonでなくてもなんでもいいんだけどもね。

f:id:tamin-ta:20200719160750j:plain

 

7segdisplayに湿度を表示させる。

で、7segdisplayをいじってたら、シフトレジスタを使うっぽかった。

なんでつかうんだっけと思ってデータシート調べたらフリップフロップが中に入っているらしい。わおまじか。

なんとなくの挙動は覚えているけどどういう用途で使うのかがおじさんすっかりわすれてしまったよ。

というわけでググる

 

8ビットシフトレジスタで配線さっぱり - Qiita

このサイトが一番個人的に参考になりましたね。

ラズパイのGPIOに限りがあるので、それを減らすためにシリアルの信号を保持して、

パラレルの信号に変換できるよってもん。

なーるほどね。じゃあGPIOがが余ってたらあえて使わなくてもいいんだね。

まあ今回はせっかくなのでシフトレジスタを使って実装してみる。

 

回路図は以下の通り。字が汚くて悲しい。

f:id:tamin-ta:20200719162007j:plain
桁は数値の桁のことですね。

 

回路はこんな感じ。後はpythonスクリプト書くよ。

 

import json
import requests
import RPi.GPIO as GPIO
import time as time

D4 = 17
D3 = 18
D2 = 19
INPUT = 20
STCP = 22
SHCP = 21
segCode = [0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f]

def getSensorData():
apikey = "[APIキー]"

headers = {
'accept': 'application/json',
'Authorization': 'Bearer ' + apikey ,
}

response = requests.get('https://api.nature.global/1/devices', headers=headers, verify=False)
data = response.json()
# print(data[0]["newest_events"]["te"]["val"])
return data

def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(D4, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(D3, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(D2, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(INPUT, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(STCP, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(SHCP, GPIO.OUT,initial=GPIO.LOW)

def shift(dat,seg_num):
GPIO.output(seg_num,GPIO.HIGH)
for bit in range(0, 8):
GPIO.output(INPUT, 0x80 & (dat << bit))
GPIO.output(SHCP, GPIO.HIGH)
GPIO.output(SHCP, GPIO.LOW)
GPIO.output(STCP, GPIO.HIGH)
GPIO.output(STCP,GPIO.LOW)

def clear():
for i in range(8):
GPIO.output(INPUT, 1)
GPIO.output(SHCP, GPIO.HIGH)
GPIO.output(SHCP, GPIO.LOW)
GPIO.output(STCP, GPIO.HIGH)
GPIO.output(STCP, GPIO.LOW)

def initialize():
for i in [D2,D3,D4]:
GPIO.output(i,GPIO.LOW)

def main():
data = getSensorData()
s = str(data[0]["newest_events"]["hu"]["val"])
while True:
clear()
initialize()
shift(segCode[int(s[-1])],D4)

clear()
initialize()
shift(segCode[int(s[-2])],D3)

try:
clear()
initialize()
shift(segCode[int(s[-3])],D2)

except IndexError:
clear()
initialize()

def destroy():
GPIO.cleanup()

if __name__ == '__main__':
setup()
try:
main()
except KeyboardInterrupt:
destroy()

 

こんなコード書いたら動くよ。もっと綺麗にかければいいんだけどね。

 

流れは以下の通り。

1 nature remoからセンサデータを取得。

2 一桁ずつ読み込み、ビットシフトを使ってパラレル変換し、displayに出力。

3 出力のたびにクリア、初期化を行う。

 

これを3桁分繰り返すことで、displayに表示される。

 

f:id:tamin-ta:20200719160759j:plain

 

わーい。光った。この63は湿度のことっすね。

家の湿度63%ってことだよ。なんか感想言いづらい普通の湿度でしたわ。

 

ちなみに最初はトランジスタ使って電流増幅させてたんだけど、取っ払ってもそんなに

暗くなかったので、取っ払ったものが完成版になりました。

※ソースはトランジスタ取っ払ったバージョンですよ。

 トランジスタ有り版との違いは、HIGHかLOWかが逆になるくらいですね。

 

とりあえず完成したので、遊びがてた適宜使っていくか、もしくはLINEと連携させて、

湿度をLINEに送るやつ作っても、楽しいかもね。