#import "../PageTemplate.typ": *
#import "@preview/tiaoma:0.3.0"
#import "@preview/fletcher:0.5.8" as fletcher: diagram, edge, node
#import fletcher.shapes: circle, diamond, pill
#show: chapter-page
#set heading(numbering: "บทที่ 1")

#heading([#linebreak()วิธีการดำเนินโครงงาน])
#set heading(numbering: "1.1")

#i ในการดำเนินการศึกษาครั้งนี้
คณะผู้จัดทำโครงงานได้ศึกษาข้อมูลเบื้องต้นในการสร้างเครื่องยืนยันตัวตนด้วย NFC
และได้ดำเนินการตามขั้นตอนนี้

#set enum(indent: 3em)
1. วางแผนการดำเนินงาน
2. การออกแบบ
3. วัสดุอุปกรณ์
4. ขั้นตอนการประกอบ
5. การทดลอง
6. การวิเคราะห์ข้อมูล

#show heading.where(level: 3): it => {
  block(
    it,
    inset: (left: 1.7em),
  )
}
#show heading.where(level: 4): it => {
  block(
    it,
    inset: (left: 4.1em),
  )
}
#show heading.where(level: 5): it => {
  block(
    it,
    inset: (left: 7.3em),
  )
}

== วางแผนการดำเนินงาน

#show table.cell.where(y: 1): strong
#set par(leading: 0.5em)

#let arrow = [
  #place(
    left + horizon,
    text(weight: "bold", size: 14pt)[#sym.arrow.l],
    dx: -5pt,
    dy: -0.7pt,
  )
  #place(
    horizon,
    line(length: 100%, stroke: (thickness: 1pt)),
    dx: 0pt,
    dy: 0pt,
  )
  #place(
    right + horizon,
    text(weight: "bold", size: 14pt)[#sym.arrow.r],
    dx: 5pt,
    dy: -0.7pt,
  )
]

=== แผนขั้นตอนและวิธีการดำเนินงาน

ตาราง 3.1 ระยะเวลาการดำเนินงาน
#v(0.5em, weak: true)

#table(
  columns: (2fr, 1fr, 1fr, 1fr, 1fr, 1fr),
  align: (
    left + horizon,
    center,
    center,
    center,
    center,
    center,
  ),
  table.header(
    table.cell(
      [ขั้นตอนการดำเนินการ],
      rowspan: 2,
    ),
    table.cell(
      [พ.ศ.2568],
      colspan: 3,
    ),
    table.cell(
      [พ.ศ.2569],
      colspan: 2,
    ),
    [ต.ค.],
    [พ.ย.],
    [ธ.ค.],
    [ม.ค.],
    [ก.พ.],
  ),
  [ศึกษาค้นคว้าข้อมูล],
  table.cell(arrow, colspan: 3),
  [],
  [],
  [เสนอหัวข้อ], arrow, [], [], [], [],
  [เสนอครั้งที่ 1], [], arrow, [], [], [],
  [ออกแบบและสร้าง], [], table.cell(arrow, colspan: 3), [],
  [จัดซื้ออุปกรณ์ทดลอง],
  [],
  table.cell(arrow, colspan: 3),
  [],
  [ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 2), [],
  [ปรับปรุงแก้ไข], [], [], [], [], arrow,
  [เสนอครั้งที่ 2], [], [], [], arrow, [],
  [จัดทำรูปเล่ม], table.cell(arrow, colspan: 5),
  [นำเสนอโครงงาน], [], [], [], [], [],
)

#show: page-theme
#set par(leading: 0.5em)

=== ผังการดำเนินงาน

#include "ProjectFlowchart.typ"

#pagebreak()

=== ผังการทำงาน

#include "ProductFlowchart.typ"

#pagebreak()
#set par(leading: 1em)

== การออกแบบ

#figure(
  image(
    "imgs/ProjectDraft_Modules.png",
    alt: "ภาพแสดงการโมเดลโครงงานซึ่งประกอบไปด้วยสามส่วน",
    width: 5in,
  ),
  caption: [การออกแบบโครงสร้างเครื่องยืนยันตัวตนด้วย NFC],
)

#v(2em)

== วัสดุอุปกรณ์

#set enum(indent: 1.7em)

1. บอร์ด ESP32 (NodeMCU)
2. กล่องพลาสติก
3. บัซเซอร์ (Buzzer)
4. เซนเซอร์ NFC (PN532)
// 5. เซนเซอร์ PIR

== ขั้นตอนการประกอบ

=== การติดตั้งอุปกรณ์

#h(4.1em) โครงงานแบ่งออกเป็น 3 โมดูล

#set enum(indent: 4.1em)
1. โมดูลบอร์ด ESP32
2. โมดูลเซนเซอร์ NFC
// 3. โมดูลเซนเซอร์ PIR

==== โมดูลบอร์ด ESP32

#h(7.3em) ทำการเจาะรู 2 รูสำหรับสายและร้อยสายเข้าไปในกล่อง

#figure(
  image(
    "imgs/MainModuleInternal.jpg",
    alt: "ภายในกล่องโมดูลหลัก มีบอร์ดอยู่ภายใน",
    height: 2in,
  ),
  caption: [ภายในกล่องโมดูล ESP32],
)

#v(2em)

==== โมดูลเซนเซอร์ NFC

#h(7.3em) ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ
จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อย

#figure(
  image(
    "imgs/NFCSensor_cropped.jpg",
    alt: "ภายกล่องโมดูลเซนเซอร์ NFC",
    height: 2in,
  ),
  caption: [โมดูลเซนเซอร์ NFC],
)
#v(1.5em)

// ==== โมดูลเซนเซอร์ PIR

=== การเขียนเฟิร์มแวร์ <writingFirmware>

#iii โครงงานนี้ใช้ซอฟต์แวร์ PlatformIO ในการสร้างและจัดการโปรเจกต์เฟิร์มแวร์
โดยหากต้องการเพียงแค่เขียนเฟิร์มแวร์ลงไปยังบอร์ด ESP32 คุณจำเป็นต้องใช้ซอฟต์แวร์หลัก ๆ คือ
PlatformIO Core และ Git (ไม่จำเป็น แต่เพื่อความสะดวกสบาย) อย่างไรก็ตาม PlatformIO
จำเป็นต้องใช้ Python เวอร์ชัน 3.6 ขึ้นไปด้วยเช่นกัน ดังนั้นคุณจำเป็นต้องติดตั้ง Python
ด้วยหากคุณยังไม่มี

#iii ในขั้นตอนแรก โปรดเปิดเทอร์มินัลของคุณ ซึ่งโดยทั่วไปแล้วคุณสามารถค้นหาแอปพลิเคชัน#jb
"Terminal" ได้เลย โดยบน Windows 10 เวอร์ชั่นใหม่ ๆ และ Windows 11 จะมาพร้อมกับแอปพลิเคชัน
Windows Terminal อย่างไรก็ตาม เมื่อเปิดแล้ว โปรดตรวจสอบให้แน่ใจว่าคุณกำลังใช้ PowerShell
และไม่ใช่ Command Prompt

#iii โดยในปัจจุบัน Python เวอร์ชันล่าสุดคือ Python 3.14.2 โดยคุณสามารถติดตั้ง Python และ Git
บน Windows ได้ด้วยการใช้คำสั่งต่อไปนี้

#figure(
  ```sh
  winget install Python.Python.3.14 Git.Git -e -s winget
  ```,
  kind: image,
  caption: [คำสั่งในการติดตั้ง Python 3.14 และ Git],
)

#v(1.5em)

#iii สำหรับระบบปฏิบัติการอื่นนั้น โดยปกติแล้วจะไม่ต้องติดตั้ง Python
เพิ่มเนื่องจากมีติดมากับระบบปฏิบัติการอยู่แล้ว อย่างไรก็ตาม บน Linux อาจต้องมีการติดตั้งการรองรับ
Virtual Environment แยก โดยแต่ละระบบจะมีชื่อแพคเกจไม่เหมือนกัน โดยบน Debian, Fedora,
และ Arch สามารถใช้คำสั่งต่อไปนี้ในการติดตั้งทั้ง Python Virtual Environment และ Git
พร้อมกันได้

#show raw.where(block: true): set block(below: 2em)
#figure(
  ```sh
  # Debian
  sudo apt install python3-venv git
  # Fedora
  sudo dnf install python3-virtualenv git
  # Arch
  sudo pacman -S python-virtualenv git
  ```,
  kind: image,
  caption: [คำสั่งในการติดตั้ง Virtual Environment และ Git บนการแจกจ่าย Linux ต่าง ๆ],
)

#v(1.5em)

#pagebreak()

==== การติดตั้ง PlatformIO Core ผ่านแพคเกจ

#h(7.3em) หากคุณใช้ Fedora Linux หรือ Arch Linux (หรือลูก ๆ ของมัน) คุณสามารถติดตั้งแพคเกจ
PlatformIO ได้โดยตรง โดยมีคำสั่งดังนี้

#figure(
  ```sh
  # Fedora Linux
  sudo dnf install platformio
  # Arch Linux
  sudo pacman -S platformio-core
  ```,
  kind: image,
  caption: [คำสั่งในการติดตั้ง PlatformIO Core บน Fedora และ Arch Linux],
)

#v(1.5em)

#set enum(indent: 7.3em)
1. หากคุณติดตั้งแพคเกจ Fedora นั้นแล้ว คุณไม่จำเป็นที่จะต้องติดตั้งกฎ udev ด้วยตนเอง
(ที่จะถูกกล่าวถึงใน@pioudev)

2. หากคุณใช้ Arch คุณสามารถติดตั้งแพคเกจกฎ udev ได้โดยตรงโดยไม่ต้องดาวน์โหลดเอง
  #figure(
    ```sh
    sudo pacman -S --asdeps platformio-core-udev
    ```,
    kind: image,
    caption: [คำสั่งในการติดตั้งกฎ udev ของ PlatformIO บน Arch Linux],
  )

#v(2.5em)

==== การติดตั้ง PlatformIO Core ผ่านสคริปต์

#h(7.3em) ถัดไป ในการติดตั้ง PlatformIO Core สามารถทำได้โดยการใช้สคริปต์ติดตั้ง โดยสำหรับ
`curl` สามารถใช้คำสั่งนี้ได้

#figure(
  ```sh
  curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
  ```,
  kind: image,
  caption: [คำสั่ง `curl` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO],
)

#pagebreak()

#h(7.3em) หรือหากต้องการใช้ `wget`

#figure(
  ```sh
  wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
  ```,
  kind: image,
  caption: [คำสั่ง `wget` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO],
)

#v(1.5em)

#h(7.3em) หรือสำหรับ PowerShell, สามารถใช้ `iwr` (หรือชื่อเต็มคือ `Invoke-WebRequest`)
ได้

#figure(
  ```sh
  iwr -OutFile get-platformio.py -Uri https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
  ```,
  kind: image,
  caption: [คำสั่ง `iwr` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO],
)

#v(1.5em)

(มีการเว้นบรรทัดใหม่เนื่องจากพื้นที่ไม่เพียงพอ โปรดอย่าเว้นบรรทัดเมื่อพิมพ์คำสั่งจริง)

#h(7.3em) แล้วดังนั้นจึงใช้คำสั่ง `python3 get-platformio.py`
ในการรันสคริปต์ติดตั้งที่ได้ทำการดาวน์โหลดมา โดยค่าเริ่มต้นแล้ว PlatformIO
จะไม่เพิ่มตนเองเข้าไปยังตัวแปรสิ่งแวดล้อม PATH
ซึ่งจำเป็นในการใช้คำสั่งจากที่ใหนก็ได้โดยไม่ต้องกล่าวถึงไฟล์พาธ

#h(7.3em) โดยสำหรับ Linux แล้วนั้น คุณต้องเพิ่ม `$HOME/.local/bin/` เข้าไปยัง PATH ของคุณ
โดยหากคุณใช้ Bash คุณสามารถแก้ไข `~/.bash_profile` และเพิ่มบรรทัดนี้เข้าไปได้

#figure(
  ```sh
  export PATH=$PATH:$HOME/.local/bin
  ```,
  kind: image,
  caption: [โคดที่ต้องใช้ในการเพิ่ม `~/.local/bin` เข้า PATH],
)

#v(1.5em)

#h(7.3em) หากคุณใช้ Zsh สามารถใช้โคดเดียวกันได้ เพียงแต่คุณต้องแก้ไขไฟล์ `~/.zprofile` หรือ
`~/.zshrc` แทน

#h(7.3em) โดยบน Windows มีขั้นตอนดังนี้

#[
  #set enum(indent: 7.3em)
  1. กด Windows + R
  2. พิมพ์ `sysdm.cpl` และกด Enter
  3. ในหน้าต่าง _System Properties_ คลิกไปยังแท็บ _Advanced_
  4. คลิกปุ่ม _Environment Variables_
]

#h(7.3em) จากนั้น เลือกตัวแปร _Path_ ในส่วน _User variables_ แล้วจึงกด _Edit_ แล้วเพิ่ม
`%USERPROFILE%\.platformio\penv\Scripts\` เข้าไปในรายการ

==== 99-platformio-udev.rules <pioudev>

#h(7.3em) ผู้ใช้ Linux จำเป็นที่จะต้องติดตั้งกฎ udev โดยสามารถดูไฟล์กฎ udev เวอร์ชันล่าสุดได้ที่
https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules
และโปรดตรวจสอบว่า PID และ VID ของบอร์ดคุณอยู่ในไฟล์กฎนั้น โดยคุณสามารถดู PID/VID
ของบอร์ดคุณได้ผ่านคำสั่ง `pio device list`

#h(7.3em) โดยไฟล์นั้นต้องถูกวางอยู่ที่ `/etc/udev/rules.d/99-platformio-udev.rules`
(ตำแหน่งที่ดีที่สุด) หรือ `/lib/udev/rules.d/99-platformio-udev.rules`
(อาจจำเป็นสำหรับบางระบบที่พัง)

#h(7.3em) โปรดใช้คำสั่งต่อไปนี้ในการดาวน์โหลดและวางไฟล์นั้นไว้ในสถานที่ที่ถูกต้อง

#figure(
  ```sh
  curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
  ```,
  kind: image,
  caption: [คำสั่งในการดาวน์โหลดไฟล์กฎ `udev`],
)

#v(1.5em)

#h(7.3em) หรือคุณก็สามารถดาวน์โหลดไฟล์นั้นด้วยตัวเองและคัดลอกมันไปในโฟลเดอร์ที่หมายได้เช่นกัน

#figure(
  ```sh
  sudo cp 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules
  ```,
  kind: image,
  caption: [คำสั่งในการคัดลอกไฟล์กฎ `udev` ไปยังสถานที่ที่ถูกต้อง],
)

#v(1.5em)

#h(7.3em) หลังจากนั้น รีสตาร์ทบริการ udev

#figure(
  ```sh
  sudo service udev restart
  ```,
  kind: image,
  caption: [คำสั่งในการรีสตาร์ทบริการ `udev`],
)

#v(1.5em)

#h(7.3em) หรือทำการรีโหลดและทริกเกอร์กฎ

#figure(
  ```sh
  sudo udevadm control --reload-rules
  sudo udevadm trigger
  ```,
  kind: image,
  caption: [คำสั่งในการรีโหลดกฎ `udev`],
)

#v(1.5em)

#h(7.3em) หลังจากติดตั้งไฟล์นี้แล้ว ถอดสายที่เชื่อมต่อระหว่างบอร์ดและคอมพิวเตอร์ของคุณแล้วเสียบมันใหม่

==== การดาวน์โหลดโปรเจกต์

#h(7.3em) สามารถใช้ Git ในการ clone โปรเจกต์ได้ด้วยคำสั่งต่อไปนี้

#figure(
  ```sh
  git clone https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32.git
  ```,
  kind: image,
  caption: [คำสั่งในการโคลนโคดสำหรับเฟิร์มแวร์],
)

#v(1.5em)

#h(7.3em) โดย Git นั้นจะทำการโคลนโปรเจกต์ไปที่โฟลเดอร์ `liteauth-firmware32`
เนื่องจากเป็นชื่อของ Git repository หรือหากไม่ต้องการใช้ Git กรุณาไปที่
https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32 และทำการคลิกปุ่ม
_Code_ แล้วกด _Download ZIP_ หรือ _Download TAR.GZ_ แล้วทำการแตกไฟล์ได้ตามปกติ
จากนั้นจึงไปที่โฟลเดอร์ของคุณในเทอร์มินัลโดยใช้คำสั่ง `cd`

==== คำสั่ง PlatformIO เบื้องต้น

#[
  #set enum(indent: 7.3em)
  1. `pio run --list-targets` เพื่อดูรายการเป้าหมายคำสั่งรัน
  2. `pio run upload` เพื่อรันเป้าหมายอัพโหลด
    ซึ่งนี่คือคำสั่งที่คุณควรจะใช้ในการเขียนเฟิร์มแวร์ลงบนบอร์ด
  3. `pio device monitor` เพื่อเปิด Serial Monitor
]

#h(7.3em) และโปรดใช้คำสั่งประเภท `pio run` ในโฟลเดอร์ของโปรเจกต์

#include "BuildApp.typ"

== การทดสอบ

#set enum(indent: 1.7em)
1. เข้าแอพลิเคชัน liteauthconfig
2. ทำการเชื่อมต่อไวไฟที่ต้องการให้อุปกรณ์เชื่อมต่อ (ต้องไม่ใช่ไวไฟ 2.4 GHz)
3. กดปุ่มบวก
4. กดตั้งค่าอุปกรณ์ใหม่ (Setup new device)
5. ตั้งชื่ออุปกรณ์และใส่รหัสผ่านเครือข่าย
6. กดปุ่มติ๊กถูกเพื่อเริ่มการตั้งค่าอุปกรณ์
7. เข้าสู่โหมดลงทะเบียนอุปกรณ์ NFC
8. ทำการแตะอุปกรณ์ NFC (เช่นโทรศัพท์ที่รองรับหรือแท็ก NFC)
9. ออกจากโหมดลงทะเบียน
10. ทำการแตะอุปกรณ์ NFC ที่ลงทะเบียน
11. รอสังเกตุรายการกิจกรรม (Activity Logs)

== การวิเคราะห์ข้อมูล

#h(1.7em) วิเคราะห์จากตารางการทดลองตามความเร็วในการทำงานจริงของเครื่องยืนยันตัวตนด้วย NFC
