Outline for other content & Wording & formatting fixes
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
#import "PageTemplate.typ": i
|
||||
#set underline(evade: false, stroke: (dash: "dotted", thickness: 1pt))
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
column-gutter: 2em,
|
||||
row-gutter: 1em,
|
||||
stroke: (none, (bottom: (dash: "dotted"))),
|
||||
[หัวข้อโครงงาน], [เครื่องยืนยันตัวตนด้วย NFC],
|
||||
[นักศึกษา],
|
||||
grid.cell(
|
||||
stroke: none,
|
||||
grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
row-gutter: 1em,
|
||||
stroke: ((bottom: (dash: "dotted")), none),
|
||||
[นางสาว ประภากร ศรีวรสาร], [รหัสประจำตัว #underline[67219090006]],
|
||||
[นางสาว พีรดา แสงแป้], [รหัสประจำตัว #underline[67219090007]],
|
||||
[นาย ศตคุณ อุตมะ], [รหัสประจำตัว #underline[67219090014]],
|
||||
),
|
||||
),
|
||||
[หลักสูตร], [ประกาศนียบัตรวิชาชีพ],
|
||||
[สาขาวิชา], [ช่างเทคนิคคอมพิวเตอร์],
|
||||
[สาขางาน], [ช่างเทคนิคคอมพิวเตอร์],
|
||||
[พ.ศ.], [2568],
|
||||
[ครูที่ปรึกษา], [นายภาคิน เหรียญทอง],
|
||||
[ครูที่ปรึกษาร่วม], [นายวสันต์ สารคำ],
|
||||
)
|
||||
\ \
|
||||
|
||||
= บทคัดย่อ
|
||||
|
||||
#i โครงงานนี้
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
column-gutter: 2em,
|
||||
row-gutter: 1em,
|
||||
stroke: (none, (bottom: (dash: "dotted"))),
|
||||
[Thesis Title], [NFC Authentication Machine],
|
||||
[Student],
|
||||
grid.cell(
|
||||
stroke: none,
|
||||
grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
row-gutter: 1em,
|
||||
stroke: ((bottom: (dash: "dotted")), none),
|
||||
[Prapakorn Sriworasan], [Student ID #underline[67219090006]],
|
||||
[Peerada Sangpae], [Student ID #underline[67219090007]],
|
||||
[Satakun Utama], [Student ID #underline[67219090014]],
|
||||
),
|
||||
),
|
||||
|
||||
[Degree], [Vocational Certificate Program],
|
||||
[Programme], [Computer Technology],
|
||||
[Year], [2568],
|
||||
[Thesis Advisor], [Mister Pakin Reanthong],
|
||||
[Thesis Co-advisor], [Mister Wasan Sarakum],
|
||||
)
|
||||
\ \
|
||||
|
||||
= Abstract
|
||||
|
||||
#i This project
|
||||
@@ -0,0 +1,15 @@
|
||||
#import "PageTemplate.typ": i
|
||||
|
||||
= กิตติกรรมประกาศ
|
||||
|
||||
#i ผู้จัดทำขอขอบคุณครูที่ปรึกษาและครูที่ปรึกษาร่วม นายภาคิน เหรียญทอง และนายวสันต์ สารคำ ที่ได้ให้คำปรึกษาและคำแนะนำวิธีการในการจัดทำโครงงานให้แก่กลุ่มของข้าพเจ้า ช่วยให้ชิ้นงานสำเร็จลุล่วงตามจุดประสงค์ที่ได้ตั้งไว้อย่างราบรื่น และขอขอบคุณวิทยาลัยเทคนิคหนองคายที่ได้ให้โอกาศแก่กลุ่มของข้าพเจ้าในการประดิษฐ์เครื่องยืนยันตัวตนด้วยระบบ NFC นี้ขึ้นมา
|
||||
|
||||
#align(right, grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
row-gutter: 1em,
|
||||
align: left,
|
||||
[นางสาวประภากร], [ศรีวรสาร],
|
||||
[นางสาวพีรดา], [แสงแป้],
|
||||
[นายศตคุณ], [อุตมะ],
|
||||
))
|
||||
+2
-2
@@ -6,11 +6,11 @@
|
||||
return counter(heading).display() + "." + str(n)
|
||||
},
|
||||
)
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
|
||||
= บทที่ 1 \ บทนำ
|
||||
#heading([#linebreak()บทนำ])
|
||||
|
||||
#set heading(numbering: "1.1")
|
||||
#counter(heading).update((1, 0))
|
||||
|
||||
== ที่มาและความสำคัญของปัญหา
|
||||
|
||||
|
||||
+345
-326
@@ -1,4 +1,5 @@
|
||||
#import "../PageTemplate.typ": *
|
||||
#import "@preview/i-figured:0.2.4"
|
||||
|
||||
= ภาษาซี (C Programming Language) <cprogramming>
|
||||
|
||||
@@ -139,101 +140,109 @@ float a, b, c;
|
||||
#show table.cell.where(y: 1): strong
|
||||
#show table.cell: set par(justify: false, leading: 0.5em)
|
||||
|
||||
#table(
|
||||
columns: 7,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ชื่อประเภท], rowspan: 2),
|
||||
table.cell([ประเภทเทียบเท่า], rowspan: 2),
|
||||
table.cell([จำนวนบิตตามรูปแบบข้อมูล], colspan: 5),
|
||||
[มาตรฐาน C],
|
||||
[LP32],
|
||||
[ILP32],
|
||||
[LLP64],
|
||||
[LP64],
|
||||
#show figure: i-figured.show-figure.with(level: 4)
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: 7,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ชื่อประเภท], rowspan: 2),
|
||||
table.cell([ประเภทเทียบเท่า], rowspan: 2),
|
||||
table.cell([จำนวนบิตตามรูปแบบข้อมูล], colspan: 5),
|
||||
[มาตรฐาน C],
|
||||
[LP32],
|
||||
[ILP32],
|
||||
[LLP64],
|
||||
[LP64],
|
||||
),
|
||||
table.cell(`char`, align: left),
|
||||
`char`,
|
||||
table.cell([อย่างน้อย\ *8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell(`signed char`, align: left),
|
||||
`signed char`,
|
||||
table.cell(`unsigned char`, align: left),
|
||||
`unsigned char`,
|
||||
|
||||
table.cell(`short`, align: left),
|
||||
table.cell(`short int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell(`short int`, align: left),
|
||||
table.cell(`signed short`, align: left),
|
||||
table.cell(`signed short int`, align: left),
|
||||
table.cell(`unsigned short`, align: left),
|
||||
table.cell([`unsigned`\ `short int`], rowspan: 2),
|
||||
table.cell(`unsigned short int`, align: left),
|
||||
|
||||
table.cell(`int`, align: left),
|
||||
table.cell(`int`, rowspan: 3),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 5),
|
||||
table.cell([*16*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell(`signed`, align: left),
|
||||
table.cell(`signed int`, align: left),
|
||||
table.cell(`unsigned`, align: left),
|
||||
table.cell([`unsigned int`], rowspan: 2),
|
||||
table.cell(`unsigned int`, align: left),
|
||||
|
||||
table.cell(`long`, align: left),
|
||||
table.cell(`long int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell(`long int`, align: left),
|
||||
table.cell(`signed long`, align: left),
|
||||
table.cell(`signed long int`, align: left),
|
||||
table.cell(`unsigned long`, align: left),
|
||||
table.cell([`unsigned`\ `long int`], rowspan: 2),
|
||||
table.cell(`unsigned long int`, align: left),
|
||||
),
|
||||
table.cell(`char`, align: left),
|
||||
`char`,
|
||||
table.cell([อย่างน้อย\ *8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell(`signed char`, align: left),
|
||||
`signed char`,
|
||||
table.cell(`unsigned char`, align: left),
|
||||
`unsigned char`,
|
||||
|
||||
table.cell(`short`, align: left),
|
||||
table.cell(`short int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell(`short int`, align: left),
|
||||
table.cell(`signed short`, align: left),
|
||||
table.cell(`signed short int`, align: left),
|
||||
table.cell(`unsigned short`, align: left),
|
||||
table.cell([`unsigned`\ `short int`], rowspan: 2),
|
||||
table.cell(`unsigned short int`, align: left),
|
||||
|
||||
table.cell(`int`, align: left),
|
||||
table.cell(`int`, rowspan: 3),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 5),
|
||||
table.cell([*16*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell(`signed`, align: left),
|
||||
table.cell(`signed int`, align: left),
|
||||
table.cell(`unsigned`, align: left),
|
||||
table.cell([`unsigned int`], rowspan: 2),
|
||||
table.cell(`unsigned int`, align: left),
|
||||
|
||||
table.cell(`long`, align: left),
|
||||
table.cell(`long int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell(`long int`, align: left),
|
||||
table.cell(`signed long`, align: left),
|
||||
table.cell(`signed long int`, align: left),
|
||||
table.cell(`unsigned long`, align: left),
|
||||
table.cell([`unsigned`\ `long int`], rowspan: 2),
|
||||
table.cell(`unsigned long int`, align: left),
|
||||
caption: [ขนาดของข้อมูลเป็นบิต],
|
||||
)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#table(
|
||||
columns: 7,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ชื่อประเภท], rowspan: 2),
|
||||
table.cell([ประเภทเทียบเท่า], rowspan: 2),
|
||||
table.cell([จำนวนบิตตามรูปแบบข้อมูล], colspan: 5),
|
||||
[มาตรฐาน C],
|
||||
[LP32],
|
||||
[ILP32],
|
||||
[LLP64],
|
||||
[LP64],
|
||||
#figure(
|
||||
table(
|
||||
columns: 7,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ชื่อประเภท], rowspan: 2),
|
||||
table.cell([ประเภทเทียบเท่า], rowspan: 2),
|
||||
table.cell([จำนวนบิตตามรูปแบบข้อมูล], colspan: 5),
|
||||
[มาตรฐาน C],
|
||||
[LP32],
|
||||
[ILP32],
|
||||
[LLP64],
|
||||
[LP64],
|
||||
),
|
||||
table.cell(`long long`, align: left),
|
||||
table.cell([`long long int` (C99)], rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell(`long long int`, align: left),
|
||||
table.cell(`signed long long`, align: left),
|
||||
table.cell(`signed long long int`, align: left),
|
||||
table.cell(`unsigned long long`, align: left),
|
||||
table.cell([`unsigned long`\ `long int` (C99)], rowspan: 2),
|
||||
table.cell(`unsigned long long int`, align: left),
|
||||
),
|
||||
table.cell(`long long`, align: left),
|
||||
table.cell([`long long int` (C99)], rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell(`long long int`, align: left),
|
||||
table.cell(`signed long long`, align: left),
|
||||
table.cell(`signed long long int`, align: left),
|
||||
table.cell(`unsigned long long`, align: left),
|
||||
table.cell([`unsigned long`\ `long int` (C99)], rowspan: 2),
|
||||
table.cell(`unsigned long long int`, align: left),
|
||||
caption: [ขนาดของข้อมูลเป็นบิต (ต่อ)],
|
||||
)
|
||||
|
||||
และนอกจากค่าบิตขั้นต่ำ มาตรฐาน C นั้นการันตีว่า:
|
||||
@@ -342,265 +351,275 @@ float a, b, c;
|
||||
#show math.equation: set text(font: "Noto Sans Math")
|
||||
#set list(indent: 0em)
|
||||
|
||||
#table(
|
||||
columns: 5,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ประเภท], rowspan: 2),
|
||||
table.cell([ขนาด\ (บิต)], rowspan: 2),
|
||||
table.cell([รูปแบบ], rowspan: 2),
|
||||
table.cell([ระยะค่า], colspan: 2),
|
||||
[โดยประมาณ], [แน่นอน],
|
||||
),
|
||||
table.cell([ตัวอักษร], rowspan: 4),
|
||||
table.cell([8], rowspan: 2),
|
||||
[signed],
|
||||
[],
|
||||
[*-128* ถึง *127*],
|
||||
#figure(
|
||||
table(
|
||||
columns: 5,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ประเภท], rowspan: 2),
|
||||
table.cell([ขนาด\ (บิต)], rowspan: 2),
|
||||
table.cell([รูปแบบ], rowspan: 2),
|
||||
table.cell([ระยะค่า], colspan: 2),
|
||||
[โดยประมาณ], [แน่นอน],
|
||||
),
|
||||
table.cell([ตัวอักษร], rowspan: 4),
|
||||
table.cell([8], rowspan: 2),
|
||||
[signed],
|
||||
[],
|
||||
[*-128* ถึง *127*],
|
||||
|
||||
[unsigned],
|
||||
[],
|
||||
[*0* ถึง *255*],
|
||||
[unsigned],
|
||||
[],
|
||||
[*0* ถึง *255*],
|
||||
|
||||
[16],
|
||||
[UTF-16],
|
||||
[],
|
||||
[*0* ถึง *65535*],
|
||||
[16],
|
||||
[UTF-16],
|
||||
[],
|
||||
[*0* ถึง *65535*],
|
||||
|
||||
[32],
|
||||
[UTF-32],
|
||||
[],
|
||||
[*0* ถึง *1114111 (0x10ffff)*],
|
||||
[32],
|
||||
[UTF-32],
|
||||
[],
|
||||
[*0* ถึง *1114111 (0x10ffff)*],
|
||||
|
||||
table.cell([จำนวน\ เต็ม], rowspan: 6),
|
||||
table.cell([16], rowspan: 2),
|
||||
[signed],
|
||||
[*± 3.27 · 104*],
|
||||
[*-32768* ถึง *32767*],
|
||||
table.cell([จำนวน\ เต็ม], rowspan: 6),
|
||||
table.cell([16], rowspan: 2),
|
||||
[signed],
|
||||
[*± 3.27 · 104*],
|
||||
[*-32768* ถึง *32767*],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *6.55 · 104*],
|
||||
[*0* ถึง *65535*],
|
||||
[unsigned],
|
||||
[*0* ถึง *6.55 · 104*],
|
||||
[*0* ถึง *65535*],
|
||||
|
||||
table.cell([32], rowspan: 2),
|
||||
[signed],
|
||||
[*± 2.14 · 109*],
|
||||
[*-2,147,483,648* ถึง *2,147,483,647*],
|
||||
table.cell([32], rowspan: 2),
|
||||
[signed],
|
||||
[*± 2.14 · 109*],
|
||||
[*-2,147,483,648* ถึง *2,147,483,647*],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *4.29 · 109*],
|
||||
[*0* ถึง *4,294,967,295*],
|
||||
[unsigned],
|
||||
[*0* ถึง *4.29 · 109*],
|
||||
[*0* ถึง *4,294,967,295*],
|
||||
|
||||
table.cell([64], rowspan: 2),
|
||||
[signed],
|
||||
[*± 9.22 · 1018*],
|
||||
[*-9,223,372,036,854,775,808* ถึง *9,223,372,036,854,775,807*],
|
||||
table.cell([64], rowspan: 2),
|
||||
[signed],
|
||||
[*± 9.22 · 1018*],
|
||||
[*-9,223,372,036,854,775,808* ถึง *9,223,372,036,854,775,807*],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *1.84 · 1019*],
|
||||
[*0* ถึง *18,446,744,073,709,551,615*],
|
||||
[unsigned],
|
||||
[*0* ถึง *1.84 · 1019*],
|
||||
[*0* ถึง *18,446,744,073,709,551,615*],
|
||||
|
||||
table.cell([ทศนิยม\ ไบนารี], rowspan: 2),
|
||||
[32],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation($± 1.401,298,4 · 10^(-45)$, alt: "บวกลบ 1.4012984 คูณ 10 ยกกำลัง -45")
|
||||
- min normal:
|
||||
#math.equation($± 1.175,494,3 · 10^(-38)$, alt: "บวกลบ 1.1754943 คูณ 10 ยกกำลัง -38")
|
||||
- max: \
|
||||
#math.equation($± 3.402,823,4 · 10^(38)$, alt: "บวกลบ 3.4028234 คูณ 10 ยกกำลัง 38")
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
`±0x1p-149`
|
||||
- min normal:\
|
||||
`±0x1p-126`
|
||||
- max:\
|
||||
`±0x1.fffffep+127`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell([ทศนิยม\ ไบนารี], rowspan: 2),
|
||||
[32],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation($± 1.401,298,4 · 10^(-45)$, alt: "บวกลบ 1.4012984 คูณ 10 ยกกำลัง -45")
|
||||
- min normal:
|
||||
#math.equation($± 1.175,494,3 · 10^(-38)$, alt: "บวกลบ 1.1754943 คูณ 10 ยกกำลัง -38")
|
||||
- max: \
|
||||
#math.equation($± 3.402,823,4 · 10^(38)$, alt: "บวกลบ 3.4028234 คูณ 10 ยกกำลัง 38")
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
`±0x1p-149`
|
||||
- min normal:\
|
||||
`±0x1p-126`
|
||||
- max:\
|
||||
`±0x1.fffffep+127`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
|
||||
[64],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation($± 4.940,656,458,412\ · 10^(-324)$, alt: "บวกลบ 4.940656458412 คูณ 10 ยกกำลัง ลบ 324", block: true)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 2.225,073,858,507,201,\ 4 · 10^(-308)$,
|
||||
alt: "บวกลบ 2.2250738585072014 คูณ 10 ยกกำลัง ลบ 308",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.797,693,134,862,315,\ 7 · 10^308$,
|
||||
alt: "บวกลบ 1.7976931348623157 คูณ 10 ยกกำลัง 308",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-1074`
|
||||
- min normal:\
|
||||
`±0x1p-1022`
|
||||
- max:
|
||||
`±0x1` \ `.fffffffffffffp+1023`
|
||||
],
|
||||
align: left,
|
||||
[64],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation(
|
||||
$± 4.940,656,458,412\ · 10^(-324)$,
|
||||
alt: "บวกลบ 4.940656458412 คูณ 10 ยกกำลัง ลบ 324",
|
||||
block: true,
|
||||
)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 2.225,073,858,507,201,\ 4 · 10^(-308)$,
|
||||
alt: "บวกลบ 2.2250738585072014 คูณ 10 ยกกำลัง ลบ 308",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.797,693,134,862,315,\ 7 · 10^308$,
|
||||
alt: "บวกลบ 1.7976931348623157 คูณ 10 ยกกำลัง 308",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-1074`
|
||||
- min normal:\
|
||||
`±0x1p-1022`
|
||||
- max:
|
||||
`±0x1` \ `.fffffffffffffp+1023`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
),
|
||||
caption: [ตารางแสดงขอบเขตประเภทข้อมูล],
|
||||
)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#table(
|
||||
columns: 5,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ประเภท], rowspan: 2),
|
||||
table.cell([ขนาด\ (บิต)], rowspan: 2),
|
||||
table.cell([รูปแบบ], rowspan: 2),
|
||||
table.cell([ระยะค่า], colspan: 2),
|
||||
[โดยประมาณ], [แน่นอน],
|
||||
),
|
||||
#figure(
|
||||
table(
|
||||
columns: 5,
|
||||
align: horizon + center,
|
||||
table.header(
|
||||
table.cell([ประเภท], rowspan: 2),
|
||||
table.cell([ขนาด\ (บิต)], rowspan: 2),
|
||||
table.cell([รูปแบบ], rowspan: 2),
|
||||
table.cell([ระยะค่า], colspan: 2),
|
||||
[โดยประมาณ], [แน่นอน],
|
||||
),
|
||||
|
||||
table.cell([ทศนิยม\ ไบนารี], rowspan: 2),
|
||||
[80],
|
||||
[x86],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation(
|
||||
$± 3.645,199,531,882,474,\ 602,528 · 10^(-4951)$,
|
||||
alt: "บวกลบ 3.645199531882474602528 คูณ 10 ยกกำลัง ลบ 4951",
|
||||
block: true,
|
||||
)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 3.362,103,143,112,093,\ 506,263 · 10^(-4932)$,
|
||||
alt: "บวกลบ 3.362103143112093506263 คูณ 10 ยกกำลัง ลบ 4932",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.189,731,495,357,231,\ 765,021 · 10^(4932)$,
|
||||
alt: "บวกลบ 1.189731495357231765021 คูณ 10 ยกกำลัง 4932",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-16445`
|
||||
- min normal:
|
||||
`±0x1p-16382`
|
||||
- max:
|
||||
`±0x1.ffffffff`\ `fffffffep+16383`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell([ทศนิยม\ ไบนารี], rowspan: 2),
|
||||
[80],
|
||||
[x86],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation(
|
||||
$± 3.645,199,531,882,474,\ 602,528 · 10^(-4951)$,
|
||||
alt: "บวกลบ 3.645199531882474602528 คูณ 10 ยกกำลัง ลบ 4951",
|
||||
block: true,
|
||||
)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 3.362,103,143,112,093,\ 506,263 · 10^(-4932)$,
|
||||
alt: "บวกลบ 3.362103143112093506263 คูณ 10 ยกกำลัง ลบ 4932",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.189,731,495,357,231,\ 765,021 · 10^(4932)$,
|
||||
alt: "บวกลบ 1.189731495357231765021 คูณ 10 ยกกำลัง 4932",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-16445`
|
||||
- min normal:
|
||||
`±0x1p-16382`
|
||||
- max:
|
||||
`±0x1.ffffffff`\ `fffffffep+16383`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
|
||||
[128],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation(
|
||||
$± 6.475,175,119,438,025,\ 110,924,438,958,227,\ 646,552,5 · 10^(-4966)$,
|
||||
alt: "บวกลบ 6.4751751194380251109244389582276465525 คูณ 10 ยกกำลัง ลบ 4966",
|
||||
block: true,
|
||||
)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 3.362,103,143,112,093,\ 506,262,677,817,321,\ 752,602,6 · 10^(-4932)$,
|
||||
alt: "บวกลบ 3.3621031431120935062626778173217526026 คูณ 10 ยกกำลัง ลบ 4932",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.189,731,495,357,231,\ 765,085,759,326,628,\ 007,016,2 · 10^4932$,
|
||||
alt: "บวกลบ 1.1897314953572317650857593266280070162 คูณ 10 ยกกำลัง 4932",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-16494`
|
||||
- min normal:
|
||||
`±0x1p-16382`
|
||||
- max:
|
||||
`±0x1.ffffffffffffff`\ `ffffffffffffffp+16383`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
[128],
|
||||
[IEEE-754],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
#math.equation(
|
||||
$± 6.475,175,119,438,025,\ 110,924,438,958,227,\ 646,552,5 · 10^(-4966)$,
|
||||
alt: "บวกลบ 6.4751751194380251109244389582276465525 คูณ 10 ยกกำลัง ลบ 4966",
|
||||
block: true,
|
||||
)
|
||||
- min normal:
|
||||
#math.equation(
|
||||
$± 3.362,103,143,112,093,\ 506,262,677,817,321,\ 752,602,6 · 10^(-4932)$,
|
||||
alt: "บวกลบ 3.3621031431120935062626778173217526026 คูณ 10 ยกกำลัง ลบ 4932",
|
||||
block: true,
|
||||
)
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 1.189,731,495,357,231,\ 765,085,759,326,628,\ 007,016,2 · 10^4932$,
|
||||
alt: "บวกลบ 1.1897314953572317650857593266280070162 คูณ 10 ยกกำลัง 4932",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:
|
||||
`±0x1p-16494`
|
||||
- min normal:
|
||||
`±0x1p-16382`
|
||||
- max:
|
||||
`±0x1.ffffffffffffff`\ `ffffffffffffffp+16383`
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
|
||||
table.cell([ทศนิยม\ เดซิมอล], rowspan: 3),
|
||||
[32],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-101)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 101")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-95)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 95")
|
||||
- max:\
|
||||
#math.equation($± 9.999'999 · 10^96$, alt: "บวกลบ 9.999999 คูณ 10 ยกกำลัง 96")
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
table.cell([ทศนิยม\ เดซิมอล], rowspan: 3),
|
||||
[32],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-101)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 101")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-95)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 95")
|
||||
- max:\
|
||||
#math.equation($± 9.999'999 · 10^96$, alt: "บวกลบ 9.999999 คูณ 10 ยกกำลัง 96")
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
|
||||
[64],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-398)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ -398")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-383)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 383")
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 9.999'999'999'999'999\ · 10^384$,
|
||||
alt: "บวกลบ 9.999999999999999 คูณ 10 ยกกำลัง 384",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
[64],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-398)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ -398")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-383)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 383")
|
||||
- max:
|
||||
#math.equation(
|
||||
$± 9.999'999'999'999'999\ · 10^384$,
|
||||
alt: "บวกลบ 9.999999999999999 คูณ 10 ยกกำลัง 384",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
|
||||
[128],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-6176)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 6176")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-6143)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 6143")
|
||||
- max:
|
||||
#math.equation(
|
||||
$ ± 9.999'999'999'999'999'\ 999'999'999'999'999'999\ · 10^6144 $,
|
||||
alt: "บวกลบ 9.999999999999999999999999999999999 คูณ 10 ยกกำลัง 6144",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
[128],
|
||||
[IEEE-754],
|
||||
[],
|
||||
table.cell(
|
||||
[
|
||||
- min subnormal:\
|
||||
#math.equation($± 1 · 10^(-6176)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 6176")
|
||||
- min normal:\
|
||||
#math.equation($± 1 · 10^(-6143)$, alt: "บวกลบ 1 คูณ 10 ยกกำลัง ลบ 6143")
|
||||
- max:
|
||||
#math.equation(
|
||||
$ ± 9.999'999'999'999'999'\ 999'999'999'999'999'999\ · 10^6144 $,
|
||||
alt: "บวกลบ 9.999999999999999999999999999999999 คูณ 10 ยกกำลัง 6144",
|
||||
block: true,
|
||||
)
|
||||
],
|
||||
align: left,
|
||||
),
|
||||
),
|
||||
caption: [ตารางแสดงขอบเขตประเภทข้อมูล (ต่อ)],
|
||||
)
|
||||
|
||||
#set list(indent: 1em)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#show heading: i-figured.reset-counters.with(level: 3)
|
||||
#show figure: i-figured.show-figure.with(level: 3)
|
||||
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
#include "Intro.typ"
|
||||
|
||||
#set heading(numbering: "1.1", offset: 1)
|
||||
|
||||
@@ -19,6 +19,8 @@ Linux, macOS และ Windows โดย Flutter ได้รับการพ
|
||||
ช่วยลดความยุ่งยากในการรองรับหลายแพลตฟอร์ม เนื่องจากสามารถใช้โคด UI
|
||||
ที่เหมือนกันได้กับทุกแพลตฟอร์มเป้าหมาย
|
||||
|
||||
#pagebreak()
|
||||
|
||||
== การติดตั้งโปรแกรมเขียนโคด
|
||||
|
||||
#i จริง ๆ แล้วนั้น Flutter สามารถทำงานกับโปรแกรมเขียนโคดใดก็ได้ แต่มีโปรแกรมเหล่านี้ที่อาจมีประสบการณ์การพัฒนาที่ดีกว่าโปรแกรมอื่น:
|
||||
@@ -88,8 +90,6 @@ xcode-select --install
|
||||
|
||||
#i หากคุณไม่ได้ติดตั้งเครื่องมืออยู่แล้ว จะมีไดอะลอกเพื่อคอนเฟิร์มว่าคุณต้องการที่จะติดตั้งมัน กด *Install* และกด *Done* เมื่อทำการติดตั้งเสร็จสิ้นแล้ว
|
||||
|
||||
#pagebreak()
|
||||
|
||||
=== การติดตั้งผ่าน Visual Studio Code
|
||||
|
||||
1. เปิด VSCode
|
||||
@@ -117,6 +117,8 @@ xcode-select --install
|
||||
4. เมื่อเสร็จสิ้น ใช้คำสั่ง `flutter doctor -v` ในเทอร์มินัลที่คุณเลือกเพื่อตรวจสอบการติดตั้ง Flutter ของคุณ \
|
||||
หากคำสั่งไม่เจอหรือเกิดข้อผิดพลาดขึ้น ตรวจสอบ https://docs.flutter.dev/install/troubleshoot สำหรับข้อมูลเพิ่มเติม
|
||||
|
||||
#pagebreak()
|
||||
|
||||
=== การติดตั้งด้วยตนเอง
|
||||
|
||||
#i แนะนำให้ทำตาม https://docs.flutter.dev/install/manual#install-flutter เนื่องจากกระบวนการนี้ต้องใช้ข้อมูลที่ใหม่ล่าสุด
|
||||
@@ -141,7 +143,7 @@ Google สามารถใช้พัฒนาแอปพลิเคชั
|
||||
#i หากยังไม่ได้ติดตั้งปลั๊กอิน Flutter โปรดติดตั้งปลั๊กอินก่อน โดยหากอยู่ในหน้าต้อนรับ สามารถติดตั้งปลั๊กอินได้โดยการเข้าไปยังแท็บ *Plugins* หรือหากเปิดโปรเจกต์อื่นอยู่ สามารถเข้าถึงหน้าปลั๊กอินได้โดยการกดที่ไอคอนฟันเฟืองในแถบเครื่องมือ แล้วกด *Plugins...* หลังจากนั้น ในแท็บ *Marketplace* ของหน้าปลั๊กอิน ค้นหา *Flutter* (ผู้ผลิตปลั๊กอินคือ Google) แล้วกด *Install*
|
||||
|
||||
#afigure(
|
||||
image("Flutter/homePage.png", width: 80%),
|
||||
image("Flutter/homePage.png", width: 65%),
|
||||
attr: "ส่วนหนึ่งของโครงงาน, ศตคุณ อุตมะ, ภายใต้ CC BY-SA 4.0",
|
||||
alt: "หน้ายินดีต้อนรับในแท็บ Projects ที่กำลังแสดงรายการโปรเจกต์และปุ่มในการสร้างโปรเจกต์ใหม่",
|
||||
caption: [หน้ายินดีต้อนรับใน Android Studio],
|
||||
@@ -397,8 +399,6 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
|
||||
#i ไฟล์ `pubspec.yaml` เป็นไฟล์ที่เก็บข้อมูลเกี่ยวกับโปรเจกต์ Flutter ของคุณ เช่น ชื่อ คำอธิบาย เวอร์ชัน และรวมถึงสิ่งที่จะกล่าวถึงในหัวข้อนี้ คือการติดตั้งและนำเข้าแพคเกจภายนอกมาใช้ในโปรเจกต์
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#i โดยหากไม่รวมรายละเอียดโปรเจกต์เบื้องต้นเช่นชื่อและคำอธิบายแล้ว ไฟล์ `pubspec.yaml` จะมีรายละเอียดดังนี้
|
||||
|
||||
`environment` นั้นจะกล่าวถึงสิ่งแวดล้อม ซึ่งในกรณีนี้มีเพียง `sdk` ที่ระบุเวอร์ชันของ Flutter SDK ในการคอมไพล์โปรเจกต์
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
- ผู้ใช้เชื่อมั่นว่าซอฟต์แวร์เบราว์เซอร์ใช้งาน HTTPS ได้อย่างถูกต้องพร้อมกับผู้ให้บริการออกใบรับรองที่ติดตั้งไว้ล่วงหน้าอย่างถูกต้อง
|
||||
- ผู้ใช้เชื่อมั่นว่าผู้ให้บริการออกใบรับรองจะรับรองเฉพาะเว็บไซต์ที่ถูกต้องตามกฎหมายเท่านั้น (กล่าวคือ ผู้ให้บริการออกใบรับรองจะไม่ถูกบุกรุกและไม่มีการออกใบรับรองที่ผิดพลาด)
|
||||
- เว็บไซต์มีใบรับรองที่ถูกต้อง ซึ่งหมายความว่าได้รับการลงนามโดยผู้ให้บริการที่เชื่อถือได้
|
||||
- ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม "https://example.com" ใบรับรองที่ได้รับนั้นถูกต้องสำหรับ "example.com" และไม่ใช่ของหน่วยงานอื่น)
|
||||
- ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม https://example.com ใบรับรองที่ได้รับนั้นถูกต้องสำหรับ example.com และไม่ใช่ของหน่วยงานอื่น)
|
||||
- ผู้ใช้เชื่อมั่นว่าเลเยอร์การเข้ารหัสของโปรโตคอล (SSL/TLS) มีความปลอดภัยเพียงพอจากการดักฟัง
|
||||
|
||||
#i HTTPS มีความสำคัญอย่างยิ่งต่อเครือข่ายที่ไม่ปลอดภัยและเครือข่ายที่อาจถูกแทรกแซง เครือข่ายที่ไม่ปลอดภัย เช่น จุดเชื่อมต่อ Wi-Fi สาธารณะ ซึ่งเปิดโอกาสให้ทุกคนในเครือข่ายท้องถิ่นเดียวกันสามารถดักจับแพ็กเก็ตและค้นพบข้อมูลสำคัญที่ไม่ได้รับการป้องกันโดย HTTPS นอกจากนี้ ยังพบว่าเครือข่าย WLAN ทั้งแบบฟรีและแบบเสียเงินบางเครือข่ายได้แทรกแซงหน้าเว็บโดยการแทรกแพ็กเก็ตเพื่อแสดงโฆษณาของตนเองบนเว็บไซต์อื่น การกระทำเช่นนี้สามารถถูกนำไปใช้ในทางที่ผิดได้หลายวิธี เช่น การฉีดมัลแวร์ลงในหน้าเว็บและการขโมยข้อมูลส่วนบุคคลของผู้ใช้
|
||||
|
||||
+3
-2
@@ -2,9 +2,10 @@
|
||||
#show: chapter-page
|
||||
#set enum(indent: 3em, numbering: n => "2." + str(n))
|
||||
|
||||
= บทที่ 2 \ ทฤษฎีและเอกสารที่เกี่ยวข้อง
|
||||
#heading([#linebreak()ทฤษฎีและเอกสารที่เกี่ยวข้อง])
|
||||
|
||||
#i ผู้จัดทำโครงงาน#h(1em)เครื่องยืนยันตัวตนด้วย NFC#h(1em)ได้ศึกษาทฤษฎีที่เกี่ยวข้องต่าง ๆ และ รวบรวมแนวทางและหลักการต่าง ๆ จากเอกสารงานวิจัยที่เกี่ยวข้องดังต่อไปนี้
|
||||
#i ผู้จัดทำโครงงาน#h(1em)เครื่องยืนยันตัวตนด้วย NFC#h(1em)ได้ศึกษาทฤษฎีที่เกี่ยวข้องต่าง ๆ และ\
|
||||
รวบรวมแนวทางและหลักการต่าง ๆ จากเอกสารงานวิจัยที่เกี่ยวข้องดังต่อไปนี้
|
||||
|
||||
+ ไมโครคอนโทรเลอร์ (Microcontroller)
|
||||
+ เซ็นเซอร์ (Sensors)
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
|
||||
เชื่อมต่อ Wi-Fi และ Bluetooth ในตัว เป็นชิปไมโครคอนโทรลเลอร์แบบ 32 บิต ที่มีความสามารถสูง พัฒนาและผลิตโดย บริษัท Espressif Systems จากประเทศจีน ส่วนประกอบหลักของบอร์ด ESP32
|
||||
|
||||
#i ESP32 คือ ไมโครคอนโทรลเลอร์ราคาประหยัดและประหยัดพลังงานที่ผสานรวมความสามารถทั้งWi-FiและBluetoothชิปเหล่านี้มีตัวเลือกการประมวลผลที่หลากหลาย รวมถึง ไมโครโปรเซสเซอร์ Tensilica Xtensa LX6 ที่มีทั้งแบบดูอัลคอร์และแบบซิงเกิลคอร์ โปรเซสเซอร์ดูอัลคอร์ Xtensa LX7 หรือ ไมโครโปรเซสเซอร์ RISC-V แบบซิงเกิลคอ ร์ นอกจากนี้ ESP32 ยังมีส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายสัญญาณ ตัวรับสัญญาณเสียงรบกวนต่ำ ตัวกรอง และโมดูลจัดการพลังงาน
|
||||
#i ESP32 คือ ไมโครคอนโทรลเลอร์ราคาประหยัดและประหยัดพลังงานที่ผสานรวมความสามารถทั้ง Wi-Fi และ Bluetooth ชิปเหล่านี้มีตัวเลือกการประมวลผลที่หลากหลาย รวมถึง ไมโครโปรเซสเซอร์ Tensilica Xtensa LX6 ที่มีทั้งแบบดูอัลคอร์และแบบซิงเกิลคอร์ โปรเซสเซอร์ดูอัลคอร์\
|
||||
Xtensa LX7 หรือ ไมโครโปรเซสเซอร์ RISC-V แบบซิงเกิลคอร์ นอกจากนี้ ESP32 ยังมีส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายสัญญาณ ตัวรับสัญญาณเสียงรบกวนต่ำ ตัวกรอง และโมดูลจัดการพลังงาน
|
||||
|
||||
โดยทั่วไป ESP32 จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์ หรือนำเสนอเป็นส่วนหนึ่งของชุดพัฒนาที่มี พินและขั้วต่อ GPIO หลากหลายรูป แบบ โดยมีการกำหนดค่าแตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ออกแบบโดย Espressif Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตรเป็นรุ่นต่อยอดจากไมโครคอนโทรลเลอร์ ESP8266
|
||||
#i โดยทั่วไป ESP32 จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์ หรือนำเสนอเป็นส่วนหนึ่งของชุดพัฒนาที่มี พินและขั้วต่อ GPIO หลากหลายรูป แบบ โดยมีการกำหนดค่าแตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ออกแบบโดย Espressif Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตรเป็นรุ่นต่อยอดจากไมโครคอนโทรลเลอร์ ESP8266
|
||||
|
||||
#i นับตั้งแต่เปิดตัว ESP32 รุ่นดั้งเดิม มีการเปิดตัวและประกาศรุ่นต่างๆ มากมาย พวกมันรวมกันเป็นไมโครคอนโทรลเลอร์ตระกูล ESP32 ชิปเหล่านี้มี CPU และความสามารถที่แตกต่างกัน แต่ทั้งหมดใช้ SDK เดียวกันและส่วนใหญ่เข้ากันได้กับโค้ด นอกจากนี้ ESP32 รุ่นดั้งเดิมยังได้รับการปรับปรุง
|
||||
|
||||
#i และส่วนประกอบหลักของบอร์ด ESP32 คือ
|
||||
#i นับตั้งแต่เปิดตัว ESP32 รุ่นดั้งเดิม มีการเปิดตัวและประกาศรุ่นต่างๆ มากมาย พวกมันรวมกันเป็นไมโครคอนโทรลเลอร์ตระกูล ESP32 ชิปเหล่านี้มี CPU และความสามารถที่แตกต่างกัน แต่ทั้งหมดใช้ SDK เดียวกันและส่วนใหญ่เข้ากันได้กับโค้ด นอกจากนี้ ESP32 รุ่นดั้งเดิมยังได้รับการปรับปรุง และส่วนประกอบหลักของบอร์ด ESP32 คือ
|
||||
ไมโครโปรเซสเซอร์ LX6 32 บิตแบบคอร์เดี่ยว/คู่ Xtensa
|
||||
รองรับหน่วยจุดลอยตัวความแม่นยำเดี่ยว (FPU)
|
||||
ไวไฟ: 802.11b/g/n
|
||||
@@ -31,7 +30,7 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง
|
||||
|
||||
ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่:
|
||||
|
||||
+ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร (และไม่มีอักขระพิเศษ)
|
||||
+ *Name:* ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร (ไม่มีอักขระพิเศษ)
|
||||
+ *Type:* ประเภทของพาร์ทัชัน สามารถเป็น `data` หรือ `app` ได้
|
||||
- `app` คือพาร์ทิชันที่ใช้ในการเก็บแอพลิเคชัน
|
||||
- `data` คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
||||
@@ -39,7 +38,7 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง
|
||||
- `data`
|
||||
- `ota`: พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB (0x2000 ไบต์)
|
||||
- `nvs`: พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์, และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory) โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์) และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64 KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า
|
||||
- `coredump`: ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช โดย core dump นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิดพลาดร้ายแรงเช่นการแครชและแพนิค โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)
|
||||
- `coredump`: ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช โดย core dump นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)
|
||||
- `nvs_keys`: พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000)
|
||||
- `fat`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling และการเข้ารหัสได้
|
||||
- `spiffs`: กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส
|
||||
@@ -53,7 +52,7 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง
|
||||
+ *Flags:* ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่
|
||||
|
||||
== LittleFS
|
||||
#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับไมโครคอนโทรลเลอร์
|
||||
#i LittleFS คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ\ ไมโครคอนโทรลเลอร์
|
||||
|
||||
#show raw: set par(leading: 0.5em)
|
||||
|
||||
@@ -76,7 +75,7 @@ ADC SAR #math.equation($2 times 12$, alt: "2 คูณ 12") บิต สูง
|
||||
|
||||
#i ในระดับสูง littlefs เป็นระบบไฟล์แบบบล็อกที่ใช้ไฟล์บันทึกขนาดเล็กในการจัดเก็บข้อมูลเมตาและโครงสร้าง copy-on-write (COW) ขนาดใหญ่ในการจัดเก็บข้อมูลไฟล์
|
||||
|
||||
#i ใน littlefs ส่วนผสมเหล่านี้ก่อตัวเป็นเค้กสองชั้น โดยที่ท่อนไม้ขนาดเล็ก (เรียกว่าคู่เมตาเดตา) จะให้การอัปเดตเมตาเดตาอย่างรวดเร็วในทุกที่ในที่เก็บข้อมูล ในขณะที่โครงสร้าง COW จะจัดเก็บข้อมูลไฟล์อย่างกะทัดรัดและไม่มีค่าใช้จ่ายในการขยายการสึกหรอใดๆ
|
||||
#i ใน littlefs ส่วนผสมเหล่านี้ก่อตัวเป็นเค้กสองชั้น โดยที่ท่อนไม้ขนาดเล็ก (เรียกว่าคู่เมตาเดตา)\ จะให้การอัปเดตเมตาเดตาอย่างรวดเร็วในทุกที่ในที่เก็บข้อมูล ในขณะที่โครงสร้าง COW จะจัดเก็บข้อมูลไฟล์อย่างกะทัดรัดและไม่มีค่าใช้จ่ายในการขยายการสึกหรอใด ๆ
|
||||
|
||||
#i โครงสร้างข้อมูลทั้งสองนี้สร้างขึ้นจากบล็อก ซึ่งถูกป้อนโดยตัวจัดสรรบล็อกร่วม โดยการจำกัดจำนวนการลบข้อมูลที่อนุญาตบนบล็อกต่อการจัดสรรแต่ละครั้ง ตัวจัดสรรจะปรับระดับการสึกหรอแบบไดนามิกทั่วทั้งระบบไฟล์
|
||||
|
||||
|
||||
+10
-7
@@ -34,12 +34,15 @@
|
||||
|
||||
/ คล่องแคล่ว: ทั้งอุปกรณ์เริ่มต้นและอุปกรณ์เป้าหมายสื่อสารกันโดยการสร้างฟิลด์ของตัวเองสลับกัน อุปกรณ์จะหยุดส่งสัญญาณเพื่อรับข้อมูลจากอีกอุปกรณ์หนึ่ง โหมดนี้กำหนดให้อุปกรณ์ทั้งสองต้องมีแหล่งจ่ายไฟ
|
||||
|
||||
#table(
|
||||
columns: 3,
|
||||
table.header([ความเร็ว (กิโลบิต/วินาที)], [อุปกรณ์ที่ใช้งานอยู่], [อุปกรณ์แบบพาสซีฟ]),
|
||||
[424], [แมนเชสเตอร์ 10% ASK], [แมนเชสเตอร์ 10% ASK],
|
||||
[212], [แมนเชสเตอร์ 10% ASK], [แมนเชสเตอร์ 10% ASK],
|
||||
[106], [มิลเลอร์ดัดแปลง ถามได้ 100%], [แมนเชสเตอร์ 10% ASK],
|
||||
#figure(
|
||||
table(
|
||||
columns: 3,
|
||||
table.header([ความเร็ว (กิโลบิต/วินาที)], [อุปกรณ์ที่ใช้งานอยู่], [อุปกรณ์แบบพาสซีฟ]),
|
||||
[424], [แมนเชสเตอร์ 10% ASK], [แมนเชสเตอร์ 10% ASK],
|
||||
[212], [แมนเชสเตอร์ 10% ASK], [แมนเชสเตอร์ 10% ASK],
|
||||
[106], [มิลเลอร์ดัดแปลง 100% ASK], [แมนเชสเตอร์ 10% ASK],
|
||||
),
|
||||
caption: [การเทียบความเร็วและวิธีการสื่อสารที่ใช้],
|
||||
)
|
||||
|
||||
#i NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล หากอุปกรณ์ที่ใช้งานอยู่ถ่ายโอนข้อมูลที่ความเร็ว 106 กิโลบิต/วินาที จะใช้การเข้ารหัสแบบมิลเลอร์ที่ปรับเปลี่ยนแล้วพร้อมการมอดูเลต 100 เปอร์เซ็นต์ในกรณีอื่นๆทั้งหมดจะใช้การเข้ารหัสแบบแมนเชสเตอร์โดยมีอัตราการมอดูเลต 10 เปอร์เซ็นต์
|
||||
@@ -50,4 +53,4 @@
|
||||
/ เครื่องอ่าน/เขียน NFC: ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้
|
||||
/ NFC เพียร์ทูเพียร์: ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ
|
||||
|
||||
แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์) และเป็นแบบอ่านอย่างเดียวในการใช้งานปกติ แต่อาจเขียนซ้ำได้ การใช้งานรวมถึงการจัดเก็บข้อมูลส่วนบุคคลที่ปลอดภัย (เช่นข้อมูล บัตร เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ) แท็ก NFC สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์) และเป็นแบบอ่านอย่างเดียวในการใช้งานปกติ แต่อาจเขียนซ้ำได้ การใช้งานรวมถึงการจัดเก็บข้อมูลส่วนบุคคลที่ปลอดภัย (เช่นข้อมูล บัตร เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)\ แท็ก NFC สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
|
||||
+9
-9
@@ -5,7 +5,7 @@
|
||||
|
||||
= เซ็นเซอร์อินฟราเรดแบบพาสซีฟ (PIR sensor)
|
||||
|
||||
#i เซ็นเซอร์อินฟราเรดแบบพาสซีฟ (PIR sensor) คือ เซ็นเซอร์อิเล็กทรอนิกส์ที่วัด แสง อินฟราเรด (IR) ที่แผ่ออกมาจากวัตถุในระยะการมองเห็น เซ็นเซอร์ชนิดนี้มักใช้ในเครื่องตรวจจับความเคลื่อนไหว แบบ PIR เซ็นเซอร์ PIR มักใช้ในสัญญาณเตือนภัยและระบบไฟส่องสว่างอัตโนมัติ
|
||||
#i เซ็นเซอร์อินฟราเรดแบบพาสซีฟ (PIR sensor) คือ เซ็นเซอร์อิเล็กทรอนิกส์ที่วัดแสงอินฟราเรด (IR) ที่แผ่ออกมาจากวัตถุในระยะการมองเห็น เซ็นเซอร์ชนิดนี้มักใช้ในเครื่องตรวจจับความเคลื่อนไหว แบบ PIR เซ็นเซอร์ PIR มักใช้ในสัญญาณเตือนภัยและระบบไฟส่องสว่างอัตโนมัติ
|
||||
|
||||
#afigure(
|
||||
image("PIR/Front-Fresnel_type.jpg", height: image-height),
|
||||
@@ -14,11 +14,11 @@
|
||||
caption: [เครื่องตรวจจับการเคลื่อนไหวแบบ PIR ทั่วไปสำหรับที่พักอาศัย/เชิงพาณิชย์],
|
||||
)
|
||||
|
||||
#i เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว ดังนั้น จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR" หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสเซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว ดังนั้น จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR" หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" คำว่าพาสซีฟหมายถึงข้อเท็จจริงที่ว่าอุปกรณ์ PIR ไม่ได้แผ่พลังงานเพื่อจุดประสงค์ในการตรวจจับ แต่ทำงานโดยการตรวจจับรังสีอินฟราเรด (ความร้อนจากการแผ่รังสี) ที่แผ่ออกมาจากหรือสะท้อนจากวัตถุ เท่านั้นซีฟ" คำว่าพาสซีฟหมายถึงข้อเท็จจริงที่ว่าอุปกรณ์ PIR ไม่ได้แผ่พลังงานเพื่อจุดประสงค์ในการตรวจจับ แต่ทำงานโดยการตรวจจับรังสีอินฟราเรด (ความร้อนจากการแผ่รังสี) ที่แผ่ออกมาจากหรือสะท้อนจากวัตถุ เท่านั้น
|
||||
#i เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว ดังนั้น จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR" หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว ดังนั้น จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR" หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" คำว่าพาสซีฟหมายถึงข้อเท็จจริงที่ว่าอุปกรณ์ PIR ไม่ได้แผ่พลังงานเพื่อจุดประสงค์ในการตรวจจับ แต่ทำงานโดยการตรวจจับรังสีอินฟราเรด (ความร้อนจากการแผ่รังสี) ที่แผ่ออกมาจากหรือสะท้อนจากวัตถุ เท่านั้นซีฟ" คำว่าพาสซีฟหมายถึงข้อเท็จจริงที่ว่าอุปกรณ์ PIR ไม่ได้แผ่พลังงานเพื่อจุดประสงค์ในการตรวจจับ แต่ทำงานโดยการตรวจจับรังสีอินฟราเรด (ความร้อนจากการแผ่รังสี) ที่แผ่ออกมาจากหรือสะท้อนจากวัตถุ เท่านั้น
|
||||
|
||||
== หลักการทำงาน
|
||||
|
||||
#i วัตถุทุกชนิดที่มีอุณหภูมิสูงกว่าศูนย์องศาสัมบูรณ์จะปล่อย พลังงาน ความร้อน ออก มาในรูปของรังสีแม่เหล็กไฟฟ้า โดยปกติแล้วรังสีนี้มองไม่เห็นด้วยตาเปล่าเนื่องจากแผ่รังสีในช่วงความยาวคลื่นอินฟราเรด แต่อุปกรณ์อิเล็กทรอนิกส์ที่ออกแบบมาเพื่อจุดประสงค์นี้ สามารถตรวจจับได้
|
||||
#i วัตถุทุกชนิดที่มีอุณหภูมิสูงกว่าศูนย์องศาสัมบูรณ์จะปล่อยพลังงานความร้อนออกมาในรูปของรังสีแม่เหล็กไฟฟ้า โดยปกติแล้วรังสีนี้มองไม่เห็นด้วยตาเปล่าเนื่องจากแผ่รังสีในช่วงความยาวคลื่นอินฟราเรด แต่อุปกรณ์อิเล็กทรอนิกส์ที่ออกแบบมาเพื่อจุดประสงค์นี้ สามารถตรวจจับได้
|
||||
|
||||
== เครื่องตรวจจับการเคลื่อนไหวแบบ PIR
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
== การปฏิบัติจริง
|
||||
|
||||
#i เมื่อเซ็นเซอร์ PIR ถูกกำหนดค่าในโหมดดิฟเฟอเรนเชียล เซ็นเซอร์จะสามารถใช้งานได้เฉพาะในฐานะอุปกรณ์ตรวจจับการเคลื่อนไหว ในโหมดนี้ เมื่อตรวจจับการเคลื่อนไหวภายใน "แนวสายตา" ของเซ็นเซอร์ พัลส์เสริมคู่หนึ่งจะถูกประมวลผลที่ขาเอาต์พุตของเซ็นเซอร์ เพื่อนำสัญญาณเอาต์พุตนี้ไปใช้งานจริงในการกระตุ้นโหลด เช่น รีเลย์หรือเครื่องบันทึกข้อมูลหรือสัญญาณเตือนสัญญาณดิฟเฟอเรนเชียลจะถูกแก้ไขโดยใช้วงจรเรียงกระแสแบบบริดจ์และป้อนเข้าสู่วงจรขับรีเลย์แบบทรานซิสเตอร์ หน้าสัมผัสของรีเลย์นี้จะปิดและเปิดเพื่อตอบสนองต่อสัญญาณจาก PIR โดยกระตุ้นโหลดที่เชื่อมต่ออยู่ผ่านหน้าสัมผัสของมัน รับรู้ถึงการตรวจจับบุคคลภายในพื้นที่จำกัดที่กำหนดไว้ล่วงหน้า
|
||||
#i เมื่อเซ็นเซอร์ PIR ถูกกำหนดค่าในโหมดดิฟเฟอเรนเชียล เซ็นเซอร์จะสามารถใช้งานได้เฉพาะในฐานะอุปกรณ์ตรวจจับการเคลื่อนไหว ในโหมดนี้ เมื่อตรวจจับการเคลื่อนไหวภายใน "แนวสายตา" ของเซ็นเซอร์ พัลส์เสริมคู่หนึ่งจะถูกประมวลผลที่ขาเอาต์พุตของเซ็นเซอร์ เพื่อนำสัญญาณเอาต์พุตนี้ไปใช้งานจริงในการกระตุ้นโหลด เช่น รีเลย์หรือเครื่องบันทึกข้อมูลหรือสัญญาณเตือนสัญญาณดิฟเฟอเรน-เชียลจะถูกแก้ไขโดยใช้วงจรเรียงกระแสแบบบริดจ์และป้อนเข้าสู่วงจรขับรีเลย์แบบทรานซิสเตอร์ หน้าสัมผัสของรีเลย์นี้จะปิดและเปิดเพื่อตอบสนองต่อสัญญาณจาก PIR โดยกระตุ้นโหลดที่เชื่อมต่ออยู่ผ่านหน้าสัมผัสของมัน รับรู้ถึงการตรวจจับบุคคลภายในพื้นที่จำกัดที่กำหนดไว้ล่วงหน้า
|
||||
|
||||
== การออกแบบผลิตภัณฑ์
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
caption: [การออกแบบเซ็นเซอร์ตรวจจับการเคลื่อนไหว PIR],
|
||||
)
|
||||
|
||||
#i โดยทั่วไปเซ็นเซอร์ PIR จะติดตั้งอยู่บนแผงวงจรพิมพ์ซึ่งมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการตีความสัญญาณจากตัวเซ็นเซอร์เอง โดยทั่วไปแล้วชุดประกอบทั้งหมดจะบรรจุอยู่ภายในตัวเรือน ซึ่งติดตั้งในตำแหน่งที่เซ็นเซอร์สามารถครอบคลุมพื้นที่ที่ต้องการตรวจสอบได้ ตัวเรือนมักจะมี "หน้าต่าง" พลาสติกที่พลังงานอินฟราเรดสามารถผ่านเข้ามาได้ แม้ว่ามักจะโปร่งแสงต่อแสงที่มองเห็น แต่พลังงานอินฟราเรดสามารถผ่านเข้ามายังเซ็นเซอร์ได้ผ่านหน้าต่าง เนื่องจากพลาสติกที่ใช้นั้นโปร่งใสต่อรังสีอินฟราเรด หน้าต่างพลาสติกช่วยลดโอกาสที่วัตถุแปลกปลอม (ฝุ่น แมลง ฝน ฯลฯ) จะบดบังมุมมองของเซ็นเซอร์ ทำให้กลไกเสียหาย และ/หรือทำให้เกิดสัญญาณเตือนที่ผิดพลาดหน้าต่างนี้สามารถใช้เป็นตัวกรองเพื่อจำกัดความยาวคลื่นให้อยู่ที่ 8-14 ไมโครเมตร ซึ่งใกล้เคียงกับรังสีอินฟราเรดที่มนุษย์ปล่อยออกมามากที่สุด นอกจากนี้ยังสามารถใช้เป็นกลไกโฟกัสได้อีกด้วย (ดูด้านล่าง)
|
||||
#i โดยทั่วไปเซ็นเซอร์ PIR จะติดตั้งอยู่บนแผงวงจรพิมพ์ซึ่งมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการตีความสัญญาณจากตัวเซ็นเซอร์เอง โดยทั่วไปแล้วชุดประกอบทั้งหมดจะบรรจุอยู่ภายในตัวเรือน ซึ่งติดตั้งในตำแหน่งที่เซ็นเซอร์สามารถครอบคลุมพื้นที่ที่ต้องการตรวจสอบได้ ตัวเรือนมักจะมี "หน้าต่าง" พลาสติกที่พลังงานอินฟราเรดสามารถผ่านเข้ามาได้ แม้ว่ามักจะโปร่งแสงต่อแสงที่มองเห็น แต่พลังงานอินฟราเรดสามารถผ่านเข้ามายังเซ็นเซอร์ได้ผ่านหน้าต่าง เนื่องจากพลาสติกที่ใช้นั้นโปร่งใสต่อรังสีอินฟราเรด หน้าต่างพลาสติกช่วยลดโอกาสที่วัตถุแปลกปลอม (ฝุ่น แมลง ฝน ฯลฯ) จะบดบังมุมมองของเซ็นเซอร์ ทำให้กลไกเสียหาย และอาจทำให้เกิดสัญญาณเตือนที่ผิดพลาด หน้าต่างนี้สามารถใช้เป็นตัวกรองเพื่อจำกัดความยาวคลื่นให้อยู่ที่ 8-14 ไมโครเมตร ซึ่งใกล้เคียงกับรังสีอินฟราเรดที่มนุษย์ปล่อยออกมามากที่สุด นอกจากนี้ยังสามารถใช้เป็นกลไกโฟกัสได้อีกด้วย (ดูด้านล่าง)
|
||||
|
||||
== การโฟกัส
|
||||
|
||||
@@ -156,15 +156,15 @@
|
||||
caption: [เครื่องตรวจจับความเคลื่อนไหวที่มีรูปแบบลำแสงซ้อนทับ ความยาวของลำแสงเป็นตัวชี้วัดความไวของเครื่องตรวจจับในทิศทางนั้น],
|
||||
)
|
||||
|
||||
#i จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม (โซน) เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใดๆ และภายใต้มุมอื่นๆ PIR จะได้รับพลังงานอินฟราเรดในปริมาณที่เข้มข้น การแยกนี้ช่วยให้เครื่องตรวจจับความเคลื่อนไหวสามารถแยกแยะระหว่างแสงสว่างที่กว้างและวัตถุที่กำลังเคลื่อนที่ได้
|
||||
#i จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม (โซน)\ เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใด ๆ และภายใต้มุมอื่น ๆ PIR จะได้รับพลังงานอินฟราเรดในปริมาณที่เข้มข้น การแยกนี้ช่วยให้เครื่องตรวจจับความเคลื่อนไหวสามารถแยกแยะระหว่างแสงสว่างที่กว้างและวัตถุที่กำลังเคลื่อนที่ได้
|
||||
|
||||
#i เมื่อบุคคลเดินจากมุมหนึ่ง (ลำแสง) ไปยังอีกมุมหนึ่ง เครื่องตรวจจับจะมองเห็นบุคคลที่กำลังเคลื่อนไหวเป็นระยะ ๆ เท่านั้น ส่งผลให้สัญญาณเซ็นเซอร์เปลี่ยนแปลงอย่างรวดเร็ว ซึ่งระบบอิเล็กทรอนิกส์จะใช้เพื่อส่งสัญญาณเตือนภัยหรือเปิดไฟ ระบบอิเล็กทรอนิกส์จะไม่สนใจสัญญาณที่เปลี่ยนแปลงช้า ๆ
|
||||
|
||||
#i จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และ/หรือกระจก ผู้ผลิตพยายามอย่างเต็มที่เพื่อสร้างรูปแบบลำแสงความไวที่เหมาะสมที่สุดสำหรับการใช้งานแต่ละประเภท
|
||||
#i จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และกระจก ผู้ผลิตพยายามอย่างเต็มที่เพื่อสร้างรูปแบบลำแสงความไวที่เหมาะสมที่สุดสำหรับการใช้งานแต่ละประเภท
|
||||
|
||||
== การใช้งานระบบไฟอัตโนมัติ
|
||||
|
||||
#i เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR มักจะควบคุมรีเลย์ในตัวที่สามารถสลับแรงดันไฟฟ้าหลักได้ ซึ่งหมายความว่า PIR สามารถตั้งค่าให้เปิดไฟที่เชื่อมต่อกับ PIR เมื่อตรวจพบการเคลื่อนไหวได้ วิธีนี้มักใช้ในสถานการณ์กลางแจ้ง ทั้งเพื่อป้องกันอาชญากร (ไฟรักษาความปลอดภัย) หรือเพื่อการใช้งานจริง เช่น การเปิดไฟประตูหน้าบ้านเพื่อให้คุณหากุญแจเจอในความมืด การใช้งานเพิ่มเติมสามารถทำได้ในห้องน้ำสาธารณะ ห้องเตรียมอาหารแบบวอล์กอิน ทางเดิน หรือบริเวณใดก็ตามที่สามารถควบคุมไฟอัตโนมัติได้ วิธีนี้ช่วยประหยัดพลังงานได้ เพราะไฟจะเปิดเฉพาะเมื่อจำเป็นเท่านั้น และผู้ใช้ไม่จำเป็นต้องปิดไฟเมื่อออกจากพื้นที่
|
||||
#i เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR มักจะควบคุมรีเลย์ในตัวที่สามารถสลับแรงดันไฟฟ้าหลักได้ ซึ่งหมายความว่า PIR สามารถตั้งค่าให้เปิดไฟที่เชื่อมต่อกับ PIR เมื่อตรวจพบการเคลื่อนไหวได้ วิธีนี้มักใช้ในสถานการณ์กลางแจ้ง ทั้งเพื่อป้องกันอาชญากร (ไฟรักษาความปลอดภัย) หรือเพื่อการใช้งานจริง เช่น การเปิดไฟประตูหน้าบ้านเพื่อให้คุณหากุญแจเจอในความมืด\ การใช้งานเพิ่มเติมสามารถทำได้ในห้องน้ำสาธารณะ ห้องเตรียมอาหารแบบวอล์กอิน ทางเดิน หรือบริเวณใดก็ตามที่สามารถควบคุมไฟอัตโนมัติได้ วิธีนี้ช่วยประหยัดพลังงานได้ เพราะไฟจะเปิดเฉพาะเมื่อจำเป็นเท่านั้น และผู้ใช้ไม่จำเป็นต้องปิดไฟเมื่อออกจากพื้นที่
|
||||
|
||||
== แอปพลิเคชั่นด้านความปลอดภัย
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
|
||||
#i พวกเขาแนะนำให้ติดตั้ง PIR ในลักษณะที่ PIR ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้ แม้ว่าความยาวคลื่นของรังสีอินฟราเรดที่ชิปมีความไวต่อแสงจะทะลุผ่านกระจกได้ไม่ดีนัก แต่แหล่งกำเนิดแสงอินฟราเรดที่แรง (เช่น จากไฟหน้ารถยนต์หรือแสงแดด) อาจทำให้เซ็นเซอร์รับภาพเกินพิกัดและทำให้เกิดสัญญาณเตือนภัยผิดพลาดได้ บุคคลที่เคลื่อนไหวอยู่อีกฝั่งของกระจกจะไม่ถูก PID "มองเห็น" ซึ่งอาจเป็นผลดีสำหรับหน้าต่างที่หันหน้าไปทางทางเท้าสาธารณะ หรือเป็นผลเสียสำหรับหน้าต่างในฉากกั้นภายใน
|
||||
|
||||
#i ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVACจะเป่าลมร้อนหรือเย็นลงบนพื้นผิวพลาสติกที่ปิดหน้าต่างของตัวบ้าน แม้ว่าอากาศจะมีค่าการแผ่รังสี ต่ำมาก (ปล่อยพลังงานอินฟราเรดในปริมาณน้อยมาก) แต่ลมที่พัดผ่านฝาครอบหน้าต่างพลาสติกอาจทำให้อุณหภูมิของพลาสติกเปลี่ยนแปลงจนทำให้เกิดสัญญาณเตือนที่ผิดพลาดได้
|
||||
#i ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVAC จะเป่าลมร้อนหรือเย็นลงบนพื้นผิวพลาสติกที่ปิดหน้าต่างของตัวบ้าน แม้ว่าอากาศจะมีค่าการแผ่รังสี ต่ำมาก (ปล่อยพลังงานอินฟราเรดในปริมาณน้อยมาก) แต่ลมที่พัดผ่านฝาครอบหน้าต่างพลาสติกอาจทำให้อุณหภูมิของพลาสติกเปลี่ยนแปลงจนทำให้เกิดสัญญาณเตือนที่ผิดพลาดได้
|
||||
|
||||
#i เซ็นเซอร์มักได้รับการออกแบบมาให้ "เพิกเฉย" สัตว์เลี้ยงในบ้าน เช่น สุนัขหรือแมว โดยการตั้งค่าความไวให้สูงขึ้น หรือทำให้แน่ใจว่าพื้นห้องจะไม่อยู่ในโฟกัส
|
||||
|
||||
|
||||
+3
-3
@@ -28,9 +28,9 @@
|
||||
|
||||
#i การดำเนินการนี้จะสิ้นสุดการจับมือและเริ่มการเชื่อมต่อที่ปลอดภัยซึ่งจะถูกเข้ารหัสและถอดรหัสด้วยคีย์เซสชันจนกว่าการเชื่อมต่อจะสิ้นสุดลงหากขั้นตอนใดขั้นตอนหนึ่งข้างต้นล้มเหลวการจับมือ TLS จะล้มเหลวและการเชื่อมต่อจะไม่ถูกสร้างขึ้น
|
||||
|
||||
#i TLS และ SSL ไม่สามารถจัดวางได้อย่างลงตัวในเลเยอร์ใดเลเยอร์หนึ่งของแบบจำลอง OSI หรือแบบจำลอง TCP/IP TLS ทำงาน "บนโปรโตคอลการขนส่งที่เชื่อถือได้ (เช่น TCP)"ซึ่งหมายความว่ามันอยู่เหนือเลเยอร์การขนส่งมันทำหน้าที่เข้ารหัสให้กับเลเยอร์ที่สูงกว่า ซึ่งโดยปกติแล้วเป็นหน้าที่ของเลเยอร์การนำเสนออย่างไรก็ตาม โดยทั่วไปแอปพลิเคชันจะใช้ TLS เหมือนกับเป็นเลเยอร์การขนส่งแม้ว่าแอปพลิเคชันที่ใช้ TLS จะต้องควบคุมการเริ่มต้นการจับมือ TLS และการจัดการใบรับรองการตรวจสอบสิทธิ์ที่แลกเปลี่ยนกัน
|
||||
#i TLS และ SSL ไม่สามารถจัดวางได้อย่างลงตัวในเลเยอร์ใดเลเยอร์หนึ่งของแบบจำลอง OSI หรือแบบจำลอง TCP/IP TLS ทำงาน "บนโปรโตคอลการขนส่งที่เชื่อถือได้ (เช่น TCP)" ซึ่งหมายความว่ามันอยู่เหนือเลเยอร์การขนส่งมันทำหน้าที่เข้ารหัสให้กับเลเยอร์ที่สูงกว่า ซึ่งโดยปกติแล้วเป็นหน้าที่ของเลเยอร์การนำเสนออย่างไรก็ตาม โดยทั่วไปแอปพลิเคชันจะใช้ TLS เหมือนกับเป็นเลเยอร์การขนส่งแม้ว่าแอปพลิเคชันที่ใช้ TLS จะต้องควบคุมการเริ่มต้นการจับมือ TLS และการจัดการใบรับรองการตรวจสอบสิทธิ์ที่แลกเปลี่ยนกัน
|
||||
|
||||
#i เมื่อได้รับการรักษาความปลอดภัยโดย TLS การเชื่อมต่อระหว่างไคลเอนต์ (เช่น เว็บเบราว์เซอร์) และเซิร์ฟเวอร์ (เช่น wikipedia.org) จะมีคุณสมบัติทั้งหมดดังต่อไปนี้
|
||||
#i เมื่อได้รับการรักษาความปลอดภัยโดย TLS การเชื่อมต่อระหว่างไคลเอนต์ (เช่น เว็บเบราว์เซอร์)\ และเซิร์ฟเวอร์ (เช่น wikipedia.org) จะมีคุณสมบัติทั้งหมดดังต่อไปนี้
|
||||
|
||||
- การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้ อัลกอริทึมคีย์แบบสมมาตรในการเข้ารหัสข้อมูลที่ส่ง คีย์สำหรับการเข้ารหัสแบบสมมาตรนี้จะถูกสร้างขึ้นอย่างเฉพาะเจาะจงสำหรับแต่ละการเชื่อมต่อ และอิงจากความลับร่วมที่เจรจากันไว้เมื่อเริ่มต้นเซสชัน เซิร์ฟเวอร์และไคลเอ็นต์จะเจรจารายละเอียดเกี่ยวกับอัลกอริทึมการเข้ารหัสและคีย์การเข้ารหัสที่จะใช้ก่อนที่จะส่งข้อมูลไบต์แรก (ดูด้านล่าง) การเจรจาความลับร่วมนั้นทั้งปลอดภัย (ความลับที่เจรจากันไว้จะไม่สามารถเข้าถึงได้โดยผู้ดักฟังและไม่สามารถได้รับ แม้แต่โดยผู้โจมตีที่วางตัวเองอยู่ตรงกลางการเชื่อมต่อ) และเชื่อถือได้ (ไม่มีผู้โจมตีคนใดสามารถแก้ไขการสื่อสารระหว่างการเจรจาโดยไม่ถูกตรวจพบ)
|
||||
- การยืนยันตัวตนของฝ่ายที่สื่อสารสามารถยืนยันได้โดยใช้การเข้ารหัสด้วยคีย์สาธารณะการยืนยันตัวตนนี้จำเป็นสำหรับเซิร์ฟเวอร์และเป็นทางเลือกสำหรับไคลเอนต์
|
||||
@@ -41,7 +41,7 @@
|
||||
#i มีการพยายามบ่อนทำลายแง่มุมด้านความปลอดภัยในการสื่อสารที่ TLS มุ่งหวังจะมอบให้ และโปรโตคอลนี้ได้รับการแก้ไขหลายครั้งเพื่อจัดการกับภัยคุกคามด้านความปลอดภัยเหล่านี้ นักพัฒนาเว็บเบราว์เซอร์ได้ปรับปรุงผลิตภัณฑ์ของตนซ้ำแล้วซ้ำเล่าเพื่อป้องกันจุดอ่อนด้านความปลอดภัยที่อาจเกิดขึ้นหลังจากค้นพบจุดอ่อนเหล่านี้ (ดูประวัติการสนับสนุน TLS/SSL ของเว็บเบราว์เซอร์)
|
||||
ความปลอดภัยของเลเยอร์การขนส่งดาต้าแกรม
|
||||
|
||||
#i Datagram Transport Layer Security หรือเรียกย่อๆ ว่า DTLS เป็นโปรโตคอลการสื่อสาร ที่เกี่ยวข้องซึ่งให้ความปลอดภัยแก่ แอปพลิเคชันที่ใช้ Datagram โดยอนุญาตให้แอปพลิเคชันสื่อสารในลักษณะที่ออกแบบมาเพื่อป้องกันการดักฟัง การปลอมแปลงหรือการปลอมแปลงข้อความโปรโตคอล DTLS ใช้ โปรโตคอล Transport Layer Security (TLS) ที่เน้น การสตรีมและมีจุดประสงค์เพื่อให้การรับประกันความปลอดภัยที่คล้ายคลึงกัน อย่างไรก็ตาม โปรโตคอลนี้แตกต่างจาก TLS ตรงที่สามารถใช้งานร่วมกับโปรโตคอลที่เน้น Datagram ส่วนใหญ่ ได้แก่User Datagram Protocol (UDP), Datagram Congestion Control Protocol (DCCP), Control And Provisioning of Wireless Access Points (CAPWAP), Stream Control Transmission Protocol (SCTP) encapsulation และSecure Real-time Transport Protocol (SRTP)
|
||||
#i Datagram Transport Layer Security หรือเรียกย่อๆ ว่า DTLS เป็นโปรโตคอลการสื่อสาร ที่เกี่ยวข้องซึ่งให้ความปลอดภัยแก่ แอปพลิเคชันที่ใช้ Datagram โดยอนุญาตให้แอปพลิเคชันสื่อสารในลักษณะที่ออกแบบมาเพื่อป้องกันการดักฟัง การปลอมแปลงหรือการปลอมแปลงข้อความโปรโตคอล DTLS ใช้ โปรโตคอล Transport Layer Security (TLS) ที่เน้น การสตรีมและมีจุดประสงค์เพื่อให้การรับประกันความปลอดภัยที่คล้ายคลึงกัน อย่างไรก็ตาม โปรโตคอลนี้แตกต่างจาก TLS ตรงที่สามารถใช้งานร่วมกับโปรโตคอลที่เน้น Datagram ส่วนใหญ่ ได้แก่ User Datagram Protocol (UDP), Datagram Congestion Control Protocol (DCCP), Control And Provisioning of Wireless Access Points (CAPWAP), Stream Control Transmission Protocol (SCTP) encapsulation และ Secure Real-time Transport Protocol (SRTP)
|
||||
|
||||
#i เนื่องจากเดตาแกรมของโปรโตคอล DTLS รักษาความหมายของการขนส่งพื้นฐานไว้ แอปพลิเคชันจึงไม่ประสบปัญหาความล่าช้าที่เกี่ยวข้องกับโปรโตคอลสตรีม อย่างไรก็ตาม แอปพลิเคชันต้องจัดการกับการเรียงลำดับแพ็กเก็ตใหม่ การสูญหายของเดตาแกรม และข้อมูลที่มีขนาดใหญ่กว่าขนาดของแพ็กเก็ตเครือข่าย เดตาแกรม เนื่องจาก DTLS ใช้ UDP หรือ SCTP แทน TCP จึงหลีกเลี่ยงปัญหา TCP ล่มเมื่อนำไปใช้สร้างอุโมงค์ VPN
|
||||
|
||||
|
||||
+1
-1
@@ -56,7 +56,7 @@
|
||||
- `.p7s` -- ลายเซ็นดิจิทัล PKCS\#7 อาจมีไฟล์หรือข้อความที่ลงนามต้นฉบับ ใช้ใน S/MIME สำหรับการลงนามในอีเมลกำหนดไว้ใน RFC 2311
|
||||
- `.p7m` -- PKCS\#7 (SignedData, EnvelopedData) ข้อความ เช่น ไฟล์ที่เข้ารหัส ("enveloped") ข้อความ หรือจดหมายอีเมล MIME กำหนดไว้ใน RFC 2311
|
||||
- `.p7c` -- โครงสร้าง SignedData แบบ "certs-only" ของ PKCS\#7 ที่เสื่อมลง โดยไม่มีข้อมูลใดๆ ให้ลงนาม กำหนดไว้ใน RFC 2311
|
||||
- `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลและ/หรือ CRL (ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย `-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย Java แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem` รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง
|
||||
- `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลหรือ CRL (ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย `-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย Java แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem` รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง
|
||||
- `.p12`, `.pfx`, `.pkcs12` -- PKCS\#12 อาจมีใบรับรอง (สาธารณะ) และคีย์ส่วนตัว (ป้องกันด้วยรหัสผ่าน) ในไฟล์เดียว `.pfx` - _Personal Information eXchange_ PFX ซึ่งเป็นรุ่นก่อนของ PKCS\#12 (โดยปกติจะมีข้อมูลในรูปแบบ PKCS\#12 เช่น ไฟล์ PFX ที่สร้างใน IIS)
|
||||
- `.crl` -- รายการเพิกถอนใบรับรอง (CRL) หน่วยงานที่ออกใบรับรองจะจัดทำรายการเหล่านี้ขึ้นเพื่อใช้ในการเพิกถอนใบรับรองก่อนหมดอายุ
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#import "PageTemplate.typ": *
|
||||
#show: chapter-page
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
|
||||
#heading([#linebreak()วิธีการดำเนินโครงงาน])
|
||||
#set heading(numbering: "1.1")
|
||||
|
||||
#i ในการดำเนินการศึกษาครั้งนี้ คณะผู้จัดทำโครงงานได้ศึกษาข้อมูลเบื้องต้นในการสร้างเครื่องยืนยันตัวตนด้วย NFC และได้ดำเนินการตามขั้นตอนนี้
|
||||
|
||||
== ศึกษาข้อมูลเบื้องต้น
|
||||
|
||||
== อุปกรณ์/เครื่องมือที่ใช้ในการสร้าง
|
||||
|
||||
== การออกแบบ
|
||||
|
||||
== การสร้าง
|
||||
|
||||
== การทดสอบประสิทธิภาพ
|
||||
@@ -0,0 +1,7 @@
|
||||
#import "PageTemplate.typ": *
|
||||
#show: chapter-page
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
|
||||
#heading([#linebreak()ผลการทดสอบ])
|
||||
#set heading(numbering: "1.1")
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#import "PageTemplate.typ": *
|
||||
#show: chapter-page
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
|
||||
#heading([#linebreak()สรุปผล อภิปรายผลและข้อเสนอแนะ])
|
||||
#counter(heading).update((5, 0))
|
||||
#set heading(numbering: "1.1")
|
||||
|
||||
== สรุปผลโครงงาน
|
||||
|
||||
== อภิปรายผล
|
||||
|
||||
== ข้อเสนอแนะ
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
= ประวัติย่อผู้จัดทำ
|
||||
|
||||
#place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in))
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[ชื่อ], [นางสาวประภากร ศรีวรสาร],
|
||||
[เกิด], [วันที่ 2 ตุลาคม พ.ศ.255x],
|
||||
[ที่อยู่],
|
||||
[
|
||||
บ้านเลขที่ ก หมู่ที่ ข ตำบล ค\
|
||||
อำเภอ ง จังหวัด หนองคาย
|
||||
],
|
||||
)
|
||||
|
||||
*ประวัติการศึกษา*
|
||||
|
||||
#grid(
|
||||
columns: 3,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[พ.ศ.25xx], [ป.6], [โรงเรียน x],
|
||||
[พ.ศ.25xx], [ม.3], [โรงเรียน y],
|
||||
[พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย],
|
||||
)
|
||||
|
||||
#v(1in)
|
||||
|
||||
#place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in))
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[ชื่อ], [นางสาวพีรดา แสงแป้],
|
||||
[เกิด], [วันที่ 8 ธันวาคม พ.ศ.255x],
|
||||
[ที่อยู่],
|
||||
[
|
||||
บ้านเลขที่ ก หมู่ที่ ข ตำบล ค\
|
||||
อำเภอ ง จังหวัด หนองคาย
|
||||
],
|
||||
)
|
||||
|
||||
*ประวัติการศึกษา*
|
||||
|
||||
#grid(
|
||||
columns: 3,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[พ.ศ.25xx], [ป.6], [โรงเรียน x],
|
||||
[พ.ศ.25xx], [ม.3], [โรงเรียน y],
|
||||
[พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย],
|
||||
)
|
||||
|
||||
#v(1in)
|
||||
|
||||
#place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in))
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[ชื่อ], [นายศตคุณ อุตมะ],
|
||||
[เกิด], [วันที่ 25 กุมภาพันธ์ พ.ศ.2552],
|
||||
[ที่อยู่],
|
||||
[
|
||||
บ้านเลขที่ 91/1 หมู่ที่ 1 ตำบล บ้านหม้อ\
|
||||
อำเภอ ศรีเชียงใหม่ จังหวัด หนองคาย
|
||||
],
|
||||
)
|
||||
|
||||
*ประวัติการศึกษา*
|
||||
|
||||
#grid(
|
||||
columns: 3,
|
||||
row-gutter: 1em,
|
||||
column-gutter: 2em,
|
||||
[พ.ศ.2564], [ป.6], [โรงเรียนหัสดีศึกษา],
|
||||
[พ.ศ.2567], [ม.3], [โรงเรียนหัสดีศึกษา],
|
||||
[พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย],
|
||||
)
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
#let thai-numbering(n) = {
|
||||
let chars = ("ก", "ข")
|
||||
let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช")
|
||||
if n <= chars.len() {
|
||||
chars.at(n - 1)
|
||||
} else {
|
||||
@@ -46,7 +46,7 @@
|
||||
set par(
|
||||
justify: true,
|
||||
justification-limits: (
|
||||
tracking: (min: 0pt, max: 1pt),
|
||||
tracking: (min: -1pt, max: 3pt),
|
||||
),
|
||||
leading: 1em,
|
||||
)
|
||||
|
||||
@@ -158,6 +158,16 @@ wkBuzzer:
|
||||
date: 2025-12-10
|
||||
value: https://en.wikipedia.org/w/index.php?title=Buzzer&oldid=1321902450
|
||||
|
||||
wkNFC:
|
||||
type: Web
|
||||
title: Near-field communication
|
||||
date: 2025-11-5
|
||||
language: en
|
||||
publisher: มูลนิธิวิกิมีเดีย (ภายใต้ CC BY-SA 4.0)
|
||||
url:
|
||||
date: 2025-12-10
|
||||
value: https://en.wikipedia.org/w/index.php?title=Near-field_communication&oldid=1320616102
|
||||
|
||||
androidJdkVersion:
|
||||
type: Web
|
||||
title: Java versions in Android builds
|
||||
|
||||
@@ -13,6 +13,11 @@
|
||||
|
||||
#counter(page).update(1)
|
||||
#show: page-theme
|
||||
#include "Abstract.typ"
|
||||
#pagebreak()
|
||||
#include "Acknowledgements.typ"
|
||||
#pagebreak()
|
||||
|
||||
#show outline: set heading(outlined: true)
|
||||
#show outline.entry: it => {
|
||||
show linebreak: [ ]
|
||||
@@ -25,12 +30,17 @@
|
||||
]),
|
||||
)
|
||||
}
|
||||
#outline(depth: 2)
|
||||
|
||||
#outline(depth: 2, indent: 3.75em)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#import "@preview/i-figured:0.2.4"
|
||||
|
||||
#i-figured.outline(target-kind: table, title: [สารบัญตาราง])
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#i-figured.outline(
|
||||
title: [สารบัญภาพ],
|
||||
)
|
||||
@@ -38,7 +48,9 @@
|
||||
#include "Chapter1.typ"
|
||||
|
||||
#include "Chapter2/Chapter2.typ"
|
||||
#include "ภาคผนวก/ภาคผนวก.typ"
|
||||
#include "Chapter3.typ"
|
||||
#include "Chapter4.typ"
|
||||
#include "Chapter5.typ"
|
||||
|
||||
#bibliography("References.yaml", title: "บรรณานุกรม", full: true, style: "chicago-author-date")
|
||||
|
||||
@@ -63,3 +75,6 @@
|
||||
}
|
||||
|
||||
#image-credits()
|
||||
|
||||
#include "ภาคผนวก/ภาคผนวก.typ"
|
||||
#include "History.typ"
|
||||
|
||||
Reference in New Issue
Block a user