
Makoto
勤怠管理がめんどくさいーーー!

しろまる
どうしたにゃ?

Makoto
勤怠を管理するのを忘れちゃったりすると
時間覚えてないから大変だし毎日するのも。。。

しろまる
それで自動化したいって考えてるのかにゃ?

Makoto
そうなの!
たまたま焦電センサが手に入ったからそれを使って勤怠の
自動記録つけれないかなって思ってるの!

ジェームズ
それでしたらラズパイに組み込んでみましょうか

Makoto
頑張る!

ジェームズ
それではまず簡単に今回のシステムの設計をしましょうか
まず定義として
1.7−9時で焦電センサに反応があったら出勤記録
2.17時以降に4分以上反応がなければ退勤記録
3.7時から17時までに4分以上反応がなければ休憩として記録
4.上の記録をCSVで吐き出す
という感じでどうでしょうか?

Makoto
そうそんな感じのが欲しいの!

ジェームズ
それではプログラムを書いてみましょうか
今回はpythone3で書いてみましょう
保存場所は好きな所にするといいでしょう
今回は後々のことも考えてhtmlフォルダに格納しています。
#ライブラリ設定 import RPi.GPIO as GPIO import time import datetime import os #焦電センサ設定 GPIO_PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_PIN,GPIO.IN) #カウンタ設定 count_a = 0 #動作検知カウント count_b = 0 #動作非検知カウント #フラグ設定 flag_a = 0 #出勤フラグ flag_b = 0 #休憩フラグ #勤怠記入 def write_csv(a,b): path = '/var/www/html/csv/Kintai/Kintai' + time.strftime("%Y%m", time.strptime(time.ctime())) + '.csv' is_file = os.path.isfile(path) #ファイルを新しく作る場合のみ改行を入れない if is_file: with open(path, 'a') as f: f.write("\n" + str(a)+ "," + str(b) ) else: with open(path, 'a') as f: f.write(str(a)+ "," + str(b) ) #休憩記入 def write_csv2(a,b): path = '/var/www/html/csv/Kyukei/Kyukei' + time.strftime("%Y%m", time.strptime(time.ctime())) + '.csv' is_file = os.path.isfile(path) #ファイルを新しく作る場合のみ改行を入れない if is_file: with open(path, 'a') as f: f.write("\n" + str(a)+ "," + str(b) ) else: with open(path, 'a') as f: f.write(str(a)+ "," + str(b) ) #メイン処理 if __name__ == '__main__': print('勤怠記録開始!') while True: if (GPIO.input(GPIO_PIN) == GPIO.HIGH) and count_a < 20: #動作検知時に開始時間を記録 if count_a == 0: now = time.strftime("%Y/%m/%d %H:%M", time.strptime(time.ctime())) now_h = time.strftime("%H", time.strptime(time.ctime())) #動作確認用(確認しないなら削除する) if count_a % 10 == 0 and count_a != 0: print(time.strftime("%Y/%m/%d %H:%M", time.strptime(time.ctime())) +" 反応あり!:"+ str(count_a)) #9時迄の(10秒間連続)感知は一回だけ出社扱い if count_a == 10 and flag_a == 0: if 9 >= int(now_h): flag_a = 1 write_csv("出勤",now) print("記入") #休憩フラグが立っている場合のみ仕事再開扱い if count_a == 10 and flag_b == 1: flag_b = 0 write_csv2("仕事再開",now) print("記入") time.sleep( 1 ) count_a += 1 count_b = 0 elif (GPIO.input(GPIO_PIN) == GPIO.LOW) and count_b < 300: #動作非検知時に開始時間を記録 if count_b == 0: now = time.strftime("%Y/%m/%d %H:%M", time.strptime(time.ctime())) now_h = time.strftime("%H", time.strptime(time.ctime())) #動作確認用(確認しないなら削除する) if count_b % 30 == 0 and count_b != 0: print(time.strftime("%Y/%m/%d %H:%M", time.strptime(time.ctime())) +" 反応なし:"+ str(count_b)) if count_b == 240: #17時以降の(240秒間連続非感知)離席は退勤扱い if 17 <= int(now_h) and 19 >= int(now_h): flag_a = 0 write_csv("退勤",now) print("記入") #8-17時の(240秒間連続非感知)離席は休憩扱い elif 8 <= int(now_h) and 17 >= int(now_h) and flag_b == 0: flag_b = 1 write_csv2("休憩開始",now) print("記入") time.sleep( 1 ) count_a = 0 count_b += 1

Makoto
できたー!

ジェームズ
おめでとうございます。

Makoto
これでしばらく記録つけてみるね!
あと、ここにプログラムあげとくー>w<
https://github.com/Makoto603/AttendanceManagement/
コメント