프로젝트

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()
라즈베리파이
모니터링코드
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