RaspberryPiで電子工作×データベース
RaspberryPi(以下ラズパイ)でデータベース(以下DB)を使って電子工作に導入しちゃいましょう!って言う記事です。
今回使用するのは外部のDBではなく、ラズパイ内にDBを建てて使用します。
まず何を作るか
今回は入門っぽい内容にしたいので、一家に1個は転がってるであろうプッシュスイッチを使って、押された時刻をDBへ記録していきたいと思います。
DBはSQLite3を使用します!予備知識等はなくてもOKです!
必要なモノ
- RaspberryPi×1(筆者はraspbianが入った3B+を使用)
- プッシュスイッチ×1
- ジャンパー×3
- 抵抗470Ω(値は違ってもOK)×1
- ブレッドボード
現在時刻のチェック
ラズパイの現在時刻がもしかすると間違っているかもしれないので、コーディング前に一度確認しておきましょう!
現在時刻は以下のコマンドで確認できます。
1 |
$ date |
おかしかった場合は以下で設定しましょう。
1.最新の時刻を取得
1 |
$ sudo apt-get install ntpdate
$ sudo ntpdate -v ntp.nict.jp |
2.日本時刻に変更
1 |
$ sudo timedatectl set-timezone Asia/Tokyo |
完了後にまた改めて dateコマンド で確認してみてください!
ソースコード
GitHubにも挙げてあるので、こっちからクローンしてもOKです。
1 |
# import
import RPi.GPIO as GPIO
import sqlite3
import datetime
import sys
# define
SWITCH_PIN = 18
# commandline argument
args = sys.argv
# table writer
def table_wrt():
# switch setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# connect DB
conn = sqlite3.connect('pushswitch.db')
c = conn.cursor()
# count variable
i = 0
# create table
c.execute('select count(*) from sqlite_master where type="table" and name="data"')
if c.fetchone() == (0,):
c.execute('create table data(time text)')
try:
while True:
if GPIO.input(SWITCH_PIN) == 1:
while GPIO.input(SWITCH_PIN) == 1:
continue
# get date and time
dt_now = datetime.datetime.now()
sql = 'insert into data values (?)'
params = (dt_now.strftime('%Y/%m/%d %H:%M:%S'),)
# insert table
c.execute(sql, params)
i += 1
print("pushed:", i, "time")
except KeyboardInterrupt:
# data commit
conn.commit()
# fin
conn.close()
GPIO.cleanup()
sys.exit(0)
# data commit
conn.commit()
# fin
conn.close()
GPIO.cleanup()
# table printer
def table_prt():
# connect DB
conn = sqlite3.connect('pushswitch.db')
c = conn.cursor()
# check DB
c.execute('select count(*) from sqlite_master where type="table" and name="data"')
if c.fetchone() == (0,):
print('not found')
conn.close()
sys.exit(0)
# get data
for row in c.execute('select * from data order by time asc'):
print(row)
# close DB
conn.close()
# table delete
def table_del():
# connect DB
conn = sqlite3.connect('pushswitch.db')
c = conn.cursor()
# confirmation
print('data table delete OK? [y/n]:')
answer = input()
if answer == "y":
# delete table
drop_table = 'drop table if exists data'
c.execute(drop_table)
print('delete success')
else :
print('delete failed')
# close DB
conn.close()
# main
# commandline argument
args = sys.argv
# mode
if 2 > len(args):
print("-w : record the number of presses.")
print("-p : display the recorded data.")
print("-d : delete the recorded data.")
elif args[1] == "-w":
table_wrt()
elif args[1] == "-p":
table_prt()
elif args[1] == "-d":
table_del()
else :
print("-w : record the number of presses.")
print("-p : display the recorded data.")
print("-d : delete the recorded data.") |
記事内に入れるとめちゃくちゃ長く感じますね。
スマホで見てる人はスクロール祭りですね…
配線
配線は3本だけ
実行方法
まず、実行方法はこんな感じ
1 |
$ python3 sqlite_sample.py |
ファイル名が違う方は「sqlite_sample.py」を変更してください。
すると、以下のようにコード説明が出てくると思います。
1 |
-w : record the number of presses.
-p : display the recorded data.
-d : delete the recorded data. |
これは、実行時にコマンドライン引数として上記の値を与えることで、モードが指定できるという内容です。
実行例
・データの記録
1 |
$ python3 switchDB.py -w |
実行中にボタンを押すとDBにボタンを押した時刻が格納されます。
Ctrl+Cで終了します。
・データの表示
1 |
$ python3 switchDB.py -p |
データベースに格納されているデータを全て表示します。
・テーブルの削除
1 |
$ python3 switchDB.py -d |
データをテーブルごと削除します。
実行すると削除するかの確認をYes/Noで聴きますので、Yesなら「y」、Noなら「n」を入力してEnterを押してください。(仕様上、「y」以外は全部Noになります。)
ざっくり解説
基本的にDBを作成して、テーブルを作成して、ボタンが押されたら現在時刻を挿入という感じです。
コードはコメントアウトしてあるので雰囲気でくみ取ってもらえればと思います。
尚、英語で書いてあるのは日本語設定がめんどくさく、日本語がエラーになるので英語にしてあります。英語と呼んでいい文法なのか不明ですが…
詳しいことは参考にした記事も合わせて読んでもらえればと思います。
今後はちゃんとしたセンサーを使ったりして、データを活用していきたいと思います。
参考にした記事
⇒【TECH ACADEMY】Pythonでデータベースに接続し利用する方法【初心者向け】
⇒【note.nkmk.me】Pythonで現在時刻・日付・日時を取得
⇒【Qiita】Python で Ctrl-C をキャッチする
今回のブログ曲
今回投稿中に聴いていた曲はこちら