프로젝트
Generate Report학생용 Micro-Bit정의
1. A버튼은 입실로 처리하는 코드
참고 사이트:파이썬 마이크로비트 바로가기
from microbit import *
import radio
radio.on()
radio.config(group=1)
student_id = "20260101" # 학생마다 다르게 설정
while True:
if button_a.was_pressed():
radio.send("IN:" + student_id)
display.show(Image.YES)
sleep(1000)
display.clear()
if button_b.was_pressed():
radio.send("OUT:" + student_id)
display.show(Image.ARROW_S)
sleep(1000)
display.clear()
2. B버튼은 퇴실로 처리하는 코드 참고 사이트:파이썬 마이크로비트 바로가기
교사용 Micro-Bit정의
from microbit import *
import radio
radio.on()
radio.config(group=1)
while True:
msg = radio.receive()
if msg:
# 입실 → V 표시
if msg.startswith("IN:"):
print(msg)
display.show(Image.YES) # ✔
sleep(1000)
# 퇴실 → X 표시
elif msg.startswith("OUT:"):
print(msg)
display.show(Image.NO) # ❌
sleep(1000)
display.clear()
라즈베리파이
모니터링코드
app.py
데이터베이스 설치
시스템 업데이트
sudo apt update
sudo apt upgrade -y
MYSQL 설치
sudo apt install mariadb-server -y
import serial
import datetime
ser = serial.Serial('COM6',115200,timeout=1)
while True:
data = ser.readline().decode(errors="ignore").strip()
#print(data)
if data:
try:
status,sid = data.split(":")
print(sid)
now = datetime.datetime.now()
#
# # 상태 변환
if status == "IN":
action = "입실"
elif status == "OUT":
action = "퇴실"
else:
action = "알수없음"
#
with open("attendance.csv","a",encoding="utf-8") as f:
f.write(f"{sid},{action},{now}\n")
print(f"{action}: {sid}")
except:
print("잘못된 데이터:", data)
app.py
from flask import Flask, render_template, jsonify
import serial
import datetime
import threading
import json
#import pandas as pd
app = Flask(__name__)
#ser = serial.Serial('/dev/ttyACM0',115200)
with open("students.json","r",encoding="utf-8") as f:
students = json.load(f)
attendance = {}
def read_serial():
ser = serial.Serial('/dev/ttyACM0',115200)
while True:
data = ser.readline().decode().strip()
if data:
status,sid = data.split(":")
print(sid,status)
name = students.get(sid,"Unknown")
now = datetime.datetime.now()
time = now.strftime("%H:%M:%S")
if sid not in attendance:
attendance[sid] = {
"name":name,
"in":"",
"out":"",
"status":""
}
if status == "IN":
attendance[sid]["in"] = time
attendance[sid]["status"] = "입실"
if status == "OUT":
attendance[sid]["out"] = time
attendance[sid]["status"] = "퇴실"
save_excel()
def save_excel()
data = []
for sid in attendance:
a = attendance[sid]
data.append([
sid,
a["name"],
a["in"],
a["out"],
a["status"]
])
#df = pd.DataFrame(data,columns=["학번","이름","등원","하교","상태"])
#df.to_excel("attendance.xlsx",index=False)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/data")
def data():
return jsonify(attendance)
thread = threading.Thread(target=read_serial)
thread.daemon = True
thread.start()
if __name__ == "__main__":
app.run(host="0.0.0.0",port=5000)
데이터베이스 설치
시스템 업데이트
sudo apt update
sudo apt upgrade -y
MYSQL 설치
sudo apt install mariadb-server -y