ラズパイに接続したタクトスイッチを押すと、その履歴をsqliteに保存しつつ、押された回数をカウントして、
htmlでwebブラウザに値を返すようなプログラムを考えております。
下記サイトを参考にしております。
https://reerishun.com/makerblog/?p=653
下記コードを考えました。
python
1# table writer 2 3def table_wrt(): 4 5 def _count(hoge): 6 if GPIO.input(17): 7 global count 8 count += 1 9 print(str(count) + "回目") 10 time.sleep(0.2) 11 12 @app.route("/") 13 def index(): 14 print(str(os.getpid()) + ": index(): count=" + str(count)) 15 return render_template("index1.html", testcount = count) 16 17 GPIO.add_event_detect(17, GPIO.BOTH, callback=_count, bouncetime=1000) 18 time.sleep(0.2) 19 20 # connect DB 21 conn = sqlite3.connect('pushswitch.db') 22 c = conn.cursor() 23 24 # count variable 25 i = 0 26 27 28 # create table 29 c.execute('select count(*) from sqlite_master where type="table" and name="data"') 30 if c.fetchone() == (0,): 31 c.execute('create table data(time text)') 32 33 34 try: 35 while True: 36 if GPIO.input(17) == 1: 37 while GPIO.input(17) == 1: 38 continue 39 # get date and time 40 dt_now = datetime.datetime.now() 41 42 sql = 'insert into data values (?)' 43 params = (dt_now.strftime('%Y/%m/%d %H:%M:%S'),) 44 45 46 # insert table 47 c.execute(sql, params) 48 i += 1 49 print("pushed:", i, "time") 50 51 52 except KeyboardInterrupt: 53 # data commit 54 conn.commit() 55 56 # fin 57 conn.close() 58 GPIO.cleanup() 59 sys.exit(0) 60 61 # data commit 62 conn.commit() 63 64 # fin 65 conn.close() 66 GPIO.cleanup() 67 68app.run("0.0.0.0", debug=True)
下記のエラーログが出力されます。
sqlite3.OperationalError: database is lockedが出力されると、
〇回目のカウントができなくなるようです。
同時に、5214: index(): count=2のカウントも進まなくなります。
sqlite3.OperationalError: database is lockedが出力される前は、
webブラウザ上にカウント回数を表示することもできております。
^C1回目
1回目
('pushed:', 1, 'time')
2回目
2回目
('pushed:', 2, 'time')
Traceback (most recent call last):
File "countupcustom.py", line 159, in <module>
table_wrt()
File "countupcustom.py", line 74, in table_wrt
c.execute(sql, params)
sqlite3.OperationalError: database is locked
pi@raspberrypi:~/dev/flask/countup5 $ 5214: index(): count=2
192.168.43.57 - - [15/Jun/2021 21:50:47] "GET / HTTP/1.1" 200 -
('pushed:', 3, 'time')
('pushed:', 4, 'time')
('pushed:', 5, 'time')
5214: index(): count=2
192.168.43.57 - - [15/Jun/2021 21:51:00] "GET / HTTP/1.1" 200 -
5214: index(): count=2
また、上記コードを実行してctl+Cで強制終了したあとは、
下記エラーが出力されるので、psとkillでプロセスを終了させなければなりません。
socket.error: [Errno 98] Address already in use
解決方法やご意見など、ご教示頂けないでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/21 08:00