โปรเจกต์ วิธีใช้งาน 4-digit 7-segment โดยไม่ใช้ library!
ใน tutorial นี้ ผมจะแสดงวิธีการใช้งาน 4-digit 7-segment โดยไม่จำเป็นต้องใช้ library ใดๆ!
ใน tutorial นี้ ผมจะแสดงวิธีการใช้งาน 4-digit 7-segment โดยไม่จำเป็นต้องใช้ library ใดๆ!
seven-segment display เป็นรูปแบบของ display device อิเล็กทรอนิกส์สำหรับแสดง decimal numerals (เลขฐานสิบ) ซึ่งเป็นทางเลือกที่ซับซ้อนน้อยกว่า dot matrix displays
seven-segment display ถูกใช้อย่างแพร่หลายใน digital clocks, electronic meters, เครื่องคิดเลขพื้นฐาน และอุปกรณ์อิเล็กทรอนิกส์อื่นๆ ที่แสดงข้อมูลเป็นตัวเลข
ความแตกต่างคือจำนวนของหลัก (digits) บนหน้าจอแสดงผล


1 digit seven-segment display มีทั้งหมด 10 pins แบ่งเป็น 7 pins สำหรับ segments, 1 pin สำหรับจุด (dot) และ 2 pins สำหรับแหล่งจ่ายไฟ (ไม่ว่าจะเป็น GND หรือ Vcc ขึ้นอยู่กับชนิดของหน้าจอ)
ในทางกลับกัน หน้าจอแบบ 4-digit ไม่ได้มี 40 pins แต่มีเพียง 12 pins เท่านั้น: โดยเป็น 7 segments, 1 จุด (dot) และ 4 digit selection pins สำหรับเลือกหลักที่จะให้ทำงานเพื่อแสดงตัวอักษรที่ส่งมาจาก Arduino ผ่าน 7+1 segment pins
7-segment ถูกจัดวางได้สองแบบ: คือแบบที่ cathode ของทุก segment มารวมกันที่ pin เดียว (GND) เรียกว่า common cathode หรือแบบที่ anode ทั้งหมดมารวมกันที่ pin เดียว (Vcc) เรียกว่า common anode ในทำนองเดียวกัน 7-segment แบบ 4-digit ก็จะมีทั้งแบบ common cathode หรือ common anode ดังนั้นเราจึงมี common pins 4 pins สำหรับทั้ง 4 หลัก
แล้ว มันทำงานอย่างไร?
ในการแสดงตัวอักษรบน 7-segment display คุณต้องเชื่อมต่อ common pin เข้ากับ pin จ่ายไฟที่เหมาะสม (ไม่ว่าจะเป็น GND หรือ Vcc เพื่อเปิดการทำงาน) และตั้งค่า segment pins ที่ต้องการให้อยู่ในสถานะตรงกันข้าม (เช่น Vcc หรือ GND)
ในทำนองเดียวกัน การแสดงชุดตัวอักษรบนหน้าจอ 4 digit เราจะเปิดใช้งานทีละหลักตามลำดับ (sequence) และตั้งค่า 7 segment pins เพื่อแสดงตัวอักษรที่สอดคล้องกัน (เช่น ตั้งค่า digit pin1 ให้เป็นสถานะ active และตั้งค่า digit pins อื่นๆ ทั้งหมดให้เป็น inactive จากนั้นตั้งค่า 7 segment pin เพื่อแสดงตัวอักษรที่ 1 แล้วจึงตั้งค่า digit pin2 ให้ active เพียงหลักเดียวเพื่อแสดงตัวอักษรที่ 2 เป็นต้น) กระบวนการนี้เกิดขึ้นด้วยความเร็วสูงเพื่อให้ดวงตารู้สึกเหมือนว่าทั้งสี่หลักทำงานพร้อมกัน ซึ่งจำเป็นต้องเชื่อมต่อทั้ง 12 pins เข้ากับ Digital pins บน Arduino
ตัวอย่าง (Example):
การแสดงตัวเลข 2021 โดยใช้ Arduino บนหน้าจอแบบ common cathode: ให้ตั้งค่า digit1 เป็น LOW และ digit pins ที่เหลือเป็น HIGH จากนั้นแสดง Char 2 ต่อมาให้ตั้งค่า digit pin2 เป็น LOW และ pins อื่นๆ เป็น HIGH แล้วตั้งค่า 7 segment pins เป็น Char 0 เป็นต้น
ในโปรเจกต์นี้ เราใช้วิธีนี้ในการพิมพ์ตัวอักษรที่สามารถเป็นไปได้ทั้งหมดลงบนหน้าจอ

หน้าจอที่ใช้มี 12 pin เท่านั้น
Resistors ขนาด 330 ohm
/*
Showing numbers, chars and phrases
A
---
F | | B
| G |
---
E | | C
| |
---
D
*/
#define common_cathode 0
#define common_anode 1
bool mode = common_anode;// my display is common anode
#define pinA 2
#define pinB 3
#define pinC 4
#define pinD 5
#define pinE 7
#define pinF 12
#define pinG 8
#define pinDP 13
#define D1 6
#define D2 9
#define D3 10
#define D4 11
#include "array.h"
#include "functions.h"
void setup() {
// initialize the digital pins as outputs.
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinDP, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
printDisplay("2021",1000);// use this function to print a string (has numbers, characters or phrases) when the length of string is 4 or less than 4, the second variable is the time for printing on display
Reset();// use this function to reset the display
delay(1000);
printDisplay("all usable characters [[ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j l n o p q r s t u y - _ . [ ] ? ]]",300);// when the length of string is more than 4, the second variable is custom speed for movement
delay(1000);
printDigit('y',D1);//print any char on any digit
delay(1000);
}
#define common_cathode 0
#define common_anode 1
การกำหนด (Define) สำหรับประเภทของหน้าจอ
bool mode = common_anode;// my display is common anode
ประเภทของหน้าจอ ให้ตั้งค่าตามประเภทหน้าจอที่คุณใช้
#include "array.h"
#include "functions.h"
Include ไฟล์ "array.h" และ "functions.h" ( ดาวน์โหลดไฟล์เหล่านี้ได้จากส่วน Code ของโปรเจกต์นี้ โดยไฟล์เหล่านี้ควรอยู่ในโฟลเดอร์เดียวกันกับ Code หลัก)
#define pinA 2
#define pinB 3
#define pinC 4
#define pinD 5
#define pinE 7
#define pinF 12
#define pinG 8
#define pinDP 13
#define D1 6
#define D2 9
#define D3 10
#define D4 11
กำหนดหมายเลข Pin
void setup() {
// initialize the digital pins as outputs.
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinDP, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
Serial.begin(9600);
}
กำหนด Pin modes และ Serial.begin
ฟังก์ชันเหล่านี้ถูกนิยามไว้ในไฟล์ "functions.h"
ใช้ฟังก์ชันนี้เพื่อพิมพ์ข้อความ String (ที่มีตัวเลข, ตัวอักษร หรือวลี)
อินพุตแรกของฟังก์ชันนี้ (String Phrase) คือข้อความ String ที่คุณต้องการพิมพ์
ถ้าความยาวของ "Phrase" มากกว่า 4 ข้อความจะเลื่อนจากจุดเริ่มต้นไปจนถึงจุดสิ้นสุด
อินพุตที่สองคือ "Delay"
เมื่อความยาวของ "Phrase" เท่ากับ 4 หรือน้อยกว่า 4 ค่า "Delay" คือเวลาในการแสดงผลบนหน้าจอ เช่น:
printDisplay("2021",1000);
เมื่อความยาวของ "Phrase" มากกว่า 4 ค่า "Delay" จะเป็นความเร็วในการเลื่อนที่กำหนดเอง เช่น:
printDisplay("all usable characters [[ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j l n o p q r s t u y - _ . [ ] ? ]]",300);
Reset();
ใช้ฟังก์ชันนี้เพื่อ Reset หน้าจอแสดงผล
ใช้ฟังก์ชันนี้เพื่อพิมพ์ตัวอักษร (ตัวอักษรใดก็ได้ใน Array "Char" ในไฟล์ "array.h") บนหลักใดก็ได้
#define DP 30
const int charsInArray = 37;
byte digits[]{D1,D2,D3,D4};
byte seg[] {pinA,pinB,pinC,pinD,pinE,pinF,pinG,pinDP};
byte Char[37][9] {
{1,1,1,1,1,1,0,0,'0'},//0
{0,1,1,0,0,0,0,0,'1'},//1
{1,1,0,1,1,0,1,0,'2'},//2
{1,1,1,1,0,0,1,0,'3'},//3
{0,1,1,0,0,1,1,0,'4'},//4
{1,0,1,1,0,1,1,0,'5'},//5
{1,0,1,1,1,1,1,0,'6'},//6
{1,1,1,0,0,0,0,0,'7'},//7
{1,1,1,1,1,1,1,0,'8'},//8
{1,1,1,1,0,1,1,0,'9'}, //9
{1,1,1,0,1,1,1,0,'a'},//A/1
{0,0,1,1,1,1,1,0,'b'},//b/2
{0,0,0,1,1,0,1,0,'c'},//C/3
{0,1,1,1,1,0,1,0,'d'},//d/4
{1,0,0,1,1,1,1,0,'e'},//E/5
{1,0,0,0,1,1,1,0,'f'},//F/6
{1,0,1,1,1,1,0,0,'g'},//G/7
{0,1,1,0,1,1,1,0,'h'},//H/8
{0,1,1,0,0,0,0,0,'i'},//I/9
{0,1,1,1,1,0,0,0,'j'},//J/10
{0,0,0,1,1,1,0,0,'l'},//L/11
{0,0,1,0,1,0,1,0,'n'},//n/12
{0,0,1,1,1,0,1,0,'o'},//o/13
{1,1,0,0,1,1,1,0,'p'},//P/14
{1,1,1,0,0,1,1,0,'q'},//q/15
{0,0,0,0,1,0,1,0,'r'},//r/16
{1,0,1,1,0,1,1,0,'s'},//S/17 looks like number 5
{0,0,0,1,1,1,1,0,'t'},//t/18
{0,1,1,1,1,1,0,0,'u'},//U/19
{0,1,1,1,0,1,1,0,'y'},//y/20
{0,0,0,0,0,0,0,1,'.'},//.
{0,0,0,0,0,0,1,0,'-'},//dash/negative
{0,0,0,1,0,0,0,0,'_'},//underscore
{1,0,0,1,1,1,0,0,'['},//[
{1,1,1,1,0,0,0,0,']'},//]
{1,1,0,0,1,0,1,0,'?'},//?
{0,0,0,0,0,0,0,0,' '}//blank
};
const int charsInArray = 37;
นี่คือจำนวนตัวอักษรใน Array "Char" ดังนั้นหากคุณต้องการเพิ่มตัวอักษรใหม่ คุณควรเปลี่ยนตัวแปรนี้ให้เป็นจำนวนตัวอักษรใหม่ใน "Char"
byte digits[]{D1,D2,D3,D4};
Digit pins
byte seg[] {pinA,pinB,pinC,pinD,pinE,pinF,pinG,pinDP};
Segment pins
byte Char[37][9] {
{1,1,1,1,1,1,0,0,'0'},//0
{0,1,1,0,0,0,0,0,'1'},//1
{1,1,0,1,1,0,1,0,'2'},//2
{1,1,1,1,0,0,1,0,'3'},//3
{0,1,1,0,0,1,1,0,'4'},//4
{1,0,1,1,0,1,1,0,'5'},//5
{1,0,1,1,1,1,1,0,'6'},//6
{1,1,1,0,0,0,0,0,'7'},//7
{1,1,1,1,1,1,1,0,'8'},//8
{1,1,1,1,0,1,1,0,'9'}, //9
{1,1,1,0,1,1,1,0,'a'},//A/1
{0,0,1,1,1,1,1,0,'b'},//b/2
{0,0,0,1,1,0,1,0,'c'},//C/3
{0,1,1,1,1,0,1,0,'d'},//d/4
{1,0,0,1,1,1,1,0,'e'},//E/5
{1,0,0,0,1,1,1,0,'f'},//F/6
{1,0,1,1,1,1,0,0,'g'},//G/7
{0,1,1,0,1,1,1,0,'h'},//H/8
{0,1,1,0,0,0,0,0,'i'},//I/9
{0,1,1,1,1,0,0,0,'j'},//J/10
{0,0,0,1,1,1,0,0,'l'},//L/11
{0,0,1,0,1,0,1,0,'n'},//n/12
{0,0,1,1,1,0,1,0,'o'},//o/13
{1,1,0,0,1,1,1,0,'p'},//P/14
{1,1,1,0,0,1,1,0,'q'},//q/15
{0,0,0,0,1,0,1,0,'r'},//r/16
{1,0,1,1,0,1,1,0,'s'},//S/17 looks like number 5
{0,0,0,1,1,1,1,0,'t'},//t/18
{0,1,1,1,1,1,0,0,'u'},//U/19
{0,1,1,1,0,1,1,0,'y'},//y/20
{0,0,0,0,0,0,0,1,'.'},//.
{0,0,0,0,0,0,1,0,'-'},//dash/negative
{0,0,0,1,0,0,0,0,'_'},//underscore
{1,0,0,1,1,1,0,0,'['},//[
{1,1,1,1,0,0,0,0,']'},//]
{1,1,0,0,1,0,1,0,'?'},//?
{0,0,0,0,0,0,0,0,' '}//blank
};
"Char" คือโค้ดสำหรับทุกตัวอักษร (คุณไม่ควรลบค่าใดๆ ทิ้ง)
void Reset()
{ digitalWrite(D1, !mode);
digitalWrite(D2, !mode);
digitalWrite(D3, !mode);
digitalWrite(D4, !mode);
for(byte i = 0 ; i < 8 ; i++){
digitalWrite(seg[i],mode);
}
}
void printDigit(char Chara,int digitPort)
{ Reset();
int character = -1;
digitalWrite(digitPort,mode);
for(int i = 0 ; i < charsInArray ; i++){
if(Chara == Char[i][8]){
character = i;
}
}
if (character == -1){
digitalWrite(pinG,!mode);
}else{
for(int i = 0;i<= 7;i++)
{if(mode == common_anode) digitalWrite(seg[i],!Char[character][i]);
else if(mode == common_cathode) digitalWrite(seg[i],Char[character][i]);
}
}
}
void printDisplay(String Phrase,int Delay)
{
char char1 = Phrase.charAt(0);
char char2 = Phrase.charAt(1);
char char3 = Phrase.charAt(2);
char char4 = Phrase.charAt(3);
//char char5 = Phrase.charAt(4);
char char1Num = 0;
char char2Num = 0;
char char3Num = 0;
char char4Num = 0;
int stringLength = Phrase.length();
if(stringLength < 5){
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
if(1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(0);
if(2 > stringLength) char2 = ' ';
else char2 = Phrase.charAt(1);
if(3 > stringLength) char3 = ' ';
else char3 = Phrase.charAt(2);
if(4 > stringLength) char4 = ' ';
else char4 = Phrase.charAt(3);
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
}else{
for(int t = 0 ; t <= stringLength ; t++){
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
/*Reset();
delay(2);*/
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
if(t + 1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(t);
if((t + 2) > stringLength) char2 = ' ';
else char2 = Phrase.charAt(t + 1);
if((t + 3) > stringLength) char3 = ' ';
else char3 = Phrase.charAt(t + 2);
if((t + 4) > stringLength) char4 = ' ';
else char4 = Phrase.charAt(t + 3);
}
}
}
void Reset()
{ digitalWrite(D1, !mode);
digitalWrite(D2, !mode);
digitalWrite(D3, !mode);
digitalWrite(D4, !mode);
for(byte i = 0 ; i < 8 ; i++){
digitalWrite(seg[i],mode);
}
}
นี่คือฟังก์ชัน reset (ผมไม่แน่ใจนัก แต่หน้าจอของผมจำเป็นต้องสั่งงานตัวเลขให้เปิดเพื่อหยุดการพิมพ์ลงบนนั้น และทำตรงกันข้ามกับ segment pins หากคุณตั้งค่า mode ตามประเภทหน้าจอของคุณแล้วฟังก์ชันทำงานไม่ถูกต้อง ให้ลองลบ '!' ออกจาก 4 ฟังก์ชัน digitalWrite แรก หากยังไม่ได้ผลให้ตรวจสอบส่วน "ปัญหา" ในโปรเจกต์นี้)
void printDigit(char Chara,int digitPort)
{ Reset();
int character = -1;
digitalWrite(digitPort,mode);
for(int i = 0 ; i < charsInArray ; i++){
if(Chara == Char[i][8]){
character = i;
}
}
if (character == -1){
digitalWrite(pinG,!mode);
}else{
for(int i = 0;i<= 7;i++)
{if(mode == common_anode) digitalWrite(seg[i],!Char[character][i]);
else if(mode == common_cathode) digitalWrite(seg[i],Char[character][i]);
}
}
}
พิมพ์ตัวอักษรลงบนหลัก (digit) ที่ต้องการ
for(int i = 0 ; i < charsInArray ; i++){
if(Chara == Char[i][8]){
character = i;
}
}
ค้นหาตัวอักษรที่ป้อนเข้ามา
if (character == -1){
digitalWrite(pinG,!mode);
}
กรณีที่ไม่พบตัวอักษร
else{
for(int i = 0;i<= 7;i++)
{if(mode == common_anode) digitalWrite(seg[i],!Char[character][i]);
else if(mode == common_cathode) digitalWrite(seg[i],Char[character][i]);
}
}
หากพบตัวอักษร ให้พิมพ์โดยใช้โค้ดจาก Array "Char" ในไฟล์ "array.h"
void printDisplay(String Phrase,int Delay)
{
char char1 = Phrase.charAt(0);
char char2 = Phrase.charAt(1);
char char3 = Phrase.charAt(2);
char char4 = Phrase.charAt(3);
//char char5 = Phrase.charAt(4);
char char1Num = 0;
char char2Num = 0;
char char3Num = 0;
char char4Num = 0;
int stringLength = Phrase.length();
if(stringLength < 5){
for(i
delay(2);*/nt ti = 0 ; ti <= (Delay / 8) ; ti++){
if(1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(0);
if(2 > stringLength) char2 = ' ';
else char2 = Phrase.charAt(1);
if(3 > stringLength) char3 = ' ';
else char3 = Phrase.charAt(2);
if(4 > stringLength) char4 = ' ';
else char4 = Phrase.charAt(3);
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
}else{
for(int t = 0 ; t <= stringLength ; t++){
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
if(t + 1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(t);
if((t + 2) > stringLength) char2 = ' ';
else char2 = Phrase.charAt(t + 1);
if((t + 3) > stringLength) char3 = ' ';
else char3 = Phrase.charAt(t + 2);
if((t + 4) > stringLength) char4 = ' ';
else char4 = Phrase.charAt(t + 3);
}
}
}
พิมพ์ข้อความ String
char char1 = Phrase.charAt(0);
char char2 = Phrase.charAt(1);
char char3 = Phrase.charAt(2);
char char4 = Phrase.charAt(3);
ดึงข้อมูลตัวอักษร 4 ตัวแรกของ String
char char1Num = 0;
char char2Num = 0;
char char3Num = 0;
char char4Num = 0;
รับโค้ดของตัวอักษรทั้ง 4 ตัว
int stringLength = Phrase.length();
รับค่าความยาวของ "Phrase"
if(stringLength < 5){
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
if(1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(0);
if(2 > stringLength) char2 = ' ';
else char2 = Phrase.charAt(1);
if(3 > stringLength) char3 = ' ';
else char3 = Phrase.charAt(2);
if(4 > stringLength) char4 = ' ';
else char4 = Phrase.charAt(3);
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
}
ถ้าข้อความ String สั้นกว่า 5 หลัก (เพื่อตรวจสอบว่า String สามารถพอดีกับหน้าจอหรือไม่)
if(1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(0);
if(2 > stringLength) char2 = ' ';
else char2 = Phrase.charAt(1);
if(3 > stringLength) char3 = ' ';
else char3 = Phrase.charAt(2);
if(4 > stringLength) char4 = ' ';
else char4 = Phrase.charAt(3);
ตรวจสอบว่าหลักใดควรจะว่างเปล่า (เพื่อหลีกเลี่ยงอาการรวนหรือ glitches)
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
พิมพ์ String ออกมา
else{
for(int t = 0 ; t <= stringLength ; t++){
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
if(t + 1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(t);
if((t + 2) > stringLength) char2 = ' ';
else char2 = Phrase.charAt(t + 1);
if((t + 3) > stringLength) char3 = ' ';
else char3 = Phrase.charAt(t + 2);
if((t + 4) > stringLength) char4 = ' ';
else char4 = Phrase.charAt(t + 3);
}
}
}
ถ้าข้อความ String มีมากกว่า 4 หลัก (ทำให้ String เลื่อนเพื่อแสดงข้อความทั้งหมด เนื่องจากหน้าจอรองรับได้เพียง 4 หลักเท่านั้น)
for(int ti = 0 ; ti <= (Delay / 8) ; ti++){
printDigit(char1,D1);
delay(2);
printDigit(char2,D2);
delay(2);
printDigit(char3,D3);
delay(2);
printDigit(char4,D4);
delay(2);
}
เลื่อนข้อความ String
if(t + 1 > stringLength) char1 = ' ';
else char1 = Phrase.charAt(t);
if((t + 2) > stringLength) char2 = ' ';
else char2 = Phrase.charAt(t + 1);
if((t + 3) > stringLength) char3 = ' ';
else char3 = Phrase.charAt(t + 2);
if((t + 4) > stringLength) char4 = ' ';
else char4 = Phrase.charAt(t + 3);
เมื่อการเคลื่อนที่สิ้นสุดลง ให้เริ่มทำให้หน้าจอแสดงผลว่างเปล่า
1- หน้าจอแสดงผลเป็นรูปทรงแปลกๆ:
2-หน้าจอว่างเปล่า (ไม่ติด)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย