วันอังคารที่ 10 มกราคม พ.ศ. 2560

การดู Log การใช้งานการโทรใน Cisco Call Manager

สำหรับผู้ที่ดูแล Cisco CM อยู่ หลายๆท่านน่าจะเจอปัญหาว่า หัวหน้าต้องการดู Report การโทรของ User แต่ละองค์อนงค์นาง ผมก็เป็น 1 ในนั้น และผมก็ เฮ้ย ดูงัยวะ

การดู Logs ใน Cisco CM นั้น สามารถ เข้าได้จาก

link เข้าไป http://IP call manager/ccmadmin/showHome.do แล้วเปลี่ยนจาก /ccmadmin/showHome.do เป็น /car เช่น http://IP call manager/car
แล้วใช้ User เดิมที่เข้า CM ปกติ เข้า


 
ต่อจากนั้น ให้เข้าไปที่ CDR >> Search >> By UserPhone Number/SIP URL
 
จะพบกับหน้าค้นหา
หมายเลข 1 ใส่เบอร์ที่เราต้องการค้นหา Logs เมื่อเลือกเสร็จแล้วให้กด Add Phone Number/ SIP URL ในหมายเลข 2
ในหมายเลข 3 ให้ใส่วันและเวลาที่ต้องการค้นดู Logs การใช้งาน
 
 
 
เสร็จแล้ว กดปุ่ม OK แล้วจะพบกับ Logs ที่เราต้องการ หากต้องการดู รายละเอียดให้ กด View เพื่อดูรายละเอียดเพิ่มเติม
 
 



วันจันทร์ที่ 9 มกราคม พ.ศ. 2560

การเข้าเครื่องคอมพิวเตอร์เมื่อลืมรหัสผ่าน หรือ ต้องการ Hack เครื่องคอมพิวเตอร์คนอื่น windows os

ก็ว่าอยู่จะเขียนดีมั้ย เพราะวิธีการนี้เป็นการ Hack เข้าเครื่องคอมพิวเตอร์ที่มีรหัสผ่าน หรือเมื่อเราจำรหัสผ่านไม่ได้

อุปกรณ์ที่ต้องเตรียม

1. แผ่น Windows หรือ USB ที่มี windows อยู่

2. เครื่องที่เราจะทำการเข้าไป

3. มือ

วิธีการทำ

1. ใส่แผ่นเข้าเครื่อง หรือเสียบ USB ที่เราเตรียมไว้ แล้ว Boot windows os จากแผ่น

2. เมื่อ Boot เสร็จแล้ว จะเข้าสู่หน้าติดตั้ง Windows ให้กด SHIFT+F10 จะเข้าสู่หน้า CMD และเมื่อเข้าสู่หน้า CMD แล้ว ให้พิมคำสั่ง

"move d:\windows\system32\utilman.exe d:\windows\system32\utilman.exe.bak" แล้วกด Enter

แล้วพิมพ์คำสั่ง

"copy d:\windows\system32\cmd.exe d:\windows\system32\utilman.exe" แล้วกด Enter


******Drive d: อาจจะเปลี่ยนแปลงไปตาม ที่เครื่องคอมพิวเตอร์อ่านแผ่นได้ Drive ใหน ถ้ามันขึ้น Error บอกว่าไม่พบพาท ให้ลองเปลี่ยน Drive ดูครับ******
หากไม่สามารถกด \ ได้เพราะ Default ภาษานั้น ให้ทำการกด Ctrl+Alt+\

3. หลังจากที่ ทำการ Move แล้วก็ Coppy เสร็จแล้ว ให้ทำการ ถอด USB หรือ แผ่น Windows ออก แล้ว Reboot เครื่องด้วยคำสั่ง wpeutil reboot

4. เมื่อเครื่อง Reboot เสร็จ จะเข้ามาอยู่ที่หน้า Login ให้กด Icon Util Manager บนหน้า Login แล้วจะพบกับ หน้าต่าง CMD

5. สร้าง User ใหม่ โดยพิมคำสั่ง net user Username /add โดยที่ Username ก็คือ User name ที่เราทำการสร้างขึ้นใหม่ เช่น net user Tom /add เป็นต้น

6. ทำการ Set ให้ User ที่เราสร้างใหม่มีสิทธิ์เป็น Admin ด้วยคำสั่ง
"net localgroup administrators Username /add " เช่น net localgroup administrators Tom /add

7. ทำการปิดหน้าต่าง CMD แล้วกลับไปที่หน้า Login แล้ว Login โดยใช้ User ที่เราสร้างขึ้น


ขอโทษที่ไม่มีภาพนะครับเพราะว่า ขี้เกียจแคป 5555555+

วันอาทิตย์ที่ 7 มิถุนายน พ.ศ. 2558

Control brushless motor By Arduino uno

Get!

1. Board Arduino Uno



2. Brushless Motor


3. ESC (Electronic Speed Control)


Start 

Step 1 set it follow this picture 


From ESC. The ESC cable signal wire (Yellow) set some signal pin in Ardiuno , I'll select pin 12 and anode (Black) cable connect to GND pin


Step 2 programming for controler to the motor 

If you select signal pin 12  !

1. Include Servo.h  for use servo mortor and blushless motor 

#include <Servo.h>

2. Create some variable for the servo motor .

Servo serv1;//mortor left  

3. In setup() method 

void setup() 
{
}

Set pin 12 for sent signal to ESC and set 0 value .
serv1.write(map(VALUE,Lower Bound,Upper Bound,0,180));

Lower bound and Upper bound = rank for control speed motor. 
VALUE is value off speed.

 serv1.attach(12);//pin 12 control
 serv1.write(map(0,0,100,0,180));

Delay 3 sec for ESC preparing.

  /////////////////////////////////delay for setup3 sec //////////////////////////
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
////////////////////////////////////end set 3 sec///////////////////////////////

}

4. In loop() method 

brushless motor run!

void loop() 
{

serv1.write(map(30,0,100,0,180));

}

5. All program 

#include <Servo.h>
Servo serv1;
void setup() 
{
  serv1.attach(12);//pin 12 control
  serv1.write(map(0,0,100,0,180));
  /////////////////////////////////delay setup3 sec //////////////////////////
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
digitalWrite(13,HIGH);delay(1000);digitalWrite(13,LOW);delay(1000);
////////////////////////////////////end set 3 sec///////////////////////////////
}
void loop() 
{
serv1.write(map(20,0,100,0,180));
}

..................................................................................................................................................................

And finally Upload  code to board 







วันอังคารที่ 27 พฤษภาคม พ.ศ. 2557

RTOS

ว่าแล้ววันนี้ก็มีเวลาเขียนเรื่องที่อยากเขียนสักที เพราะหลังจากที่แก้เล่มโปรเจคอยู่หลายรอบจนไม่มีเวลามาเขียนบลอกให้อ่านกันนี่มันช่างขัดใจโจ๋ ซะจริงๆ

RTOS = Real Time Operating System หรือถ้าแปลเป็นไทยก็จะแปลว่า ระบบปฏิบัติการแบบเวลาจริง นั่นเอง ซึ่ง RTOS จะมีข้อแตกต่างกับพวกระบบปฏิบัติการ พวก Windows หรือ Linux ตรงที่ RTOS จะมีปัจจัยที่สำคัญคือ เวลา ซึ่งจะส่งผลโดยตรงต่อประสิทธิภาพของระบบ เช่นหาก RTOS ไม่สามารถทำงานได้ตรงตามเวลาที่กำหนดจะเกิดความเสียหายขึ้นกับระบบ  โดยทั่วไปแล้ว RTOS จะอยู่ในรูปแบบระบบปฏิบัติการของ พวก Embedded System หรือ ระบบฝังตัวนั้่นเอง โดย RTOS ส่วนใหญ่จะถูกสร้างขึ้นมาเพื่อใช้งานเฉพาะด้านเป็นส่วนใหญ่ และจะอยู่ติดทางฝั่ง Hardware


โดย RTOS ที่ถูกสร้างมาส่วนใหญ่จะถูกสร้างมาให้ควบคุม Hardware เช่น ระบบปฏิบัติการที่ใช้ในการอ่านแผ่น Cd, DVD, Flash drive, หรือระบบจัดสรรค์หน่วยความจำในเครื่องคอมพิวเตอร์ เป็นต้น

RTOS จะแบ่งออกเป็นกลุ่มใหญ่ๆได้ดังนี้ 
     1) Hard real-time คือ หากเกินเวลาที่กำหนด จะทำให้ระบบเกิดความเสียหายได้ และยอมรับไม่ได้
     2) Firm real-time คือ หากเกินเวลาที่กำหนด อาจจะทำใให้ระบบเกิดความเสียหายได้ และอาจจะยอมรับ ไม่ได้
     3) Soft real-time คือ หากเกินเวลาที่กำหนด อาจจะทำให้ระบบเสียหายได้ แต่อาจจะยอมรับได้



วันอาทิตย์ที่ 13 เมษายน พ.ศ. 2557

Config Syslog-ng Sent Logs to Database Mysql Base on ubuntu การคอนฟิก Syslog-ng ลง database mysql บนระบบปฎิบัติการ Ubuntu

เนื่องจากมีปัญหามากมายในการ คอนฟิก เพื่อเก็บ Logs ลงบน Database โดยใช้เจ้าตัว Syslog-ng  ซึ่งส่วนตัวผมนั้น อ่านทั้งเว็ปที่เป็นภาษาไทย และเว็ปที่เป็นภาษาประกิด แล้วเกิดความฉงน งงงวยมากให้การ Config ให้อีเจ้า Log เนียะ มันลง Database ให้ได้ วันนี้ผมก็จะมาเขียน แบบ Step by Step เลยนะครับ บอกเลยว่าได้แน่นอน 100%

1.ทำการลง mysql database ก่อนนะครับ ตามลิ้งนี้ 

2.ทำการลง Syslog-ng ด้วยคำสั่ง sudo apt-get install syslog-ng 
รอจนมันลงเสร็จนะครับ

3.ทำการ restart syslog-ng ด้วยคำสั่ง  /etc/init.d/syslog-ng restart








4.start mysql service ด้วยคำสั่ง chkconfig --level 2345 mysqld on; service mysqld start


5.ทำการ test service ของ mysql ด้วยคำสั่ง mysql -u username -p แล้ว Enter แล้ว ใส่ password












แล้วพิมพ์ คำสั่ง exit เพื่อออกจาก mysql

6.สร้างฐานข้อมูลที่เราจะรับค่าเข้ามา
โดยจะมีข้อมูลประมาณนี้นะครับ 
  1. CREATE TABLE `logs` (
  2. `host` varchar(32) DEFAULT NULL,
  3. `facility` varchar(10) DEFAULT NULL,
  4. `priority` varchar(10) DEFAULT NULL,
  5. `level` varchar(10) DEFAULT NULL,
  6. `tag` varchar(10) DEFAULT NULL,
  7. `datetime` datetime DEFAULT NULL,
  8. `program` varchar(15) DEFAULT NULL,
  9. `msg` text,
  10. `seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  11. PRIMARY KEY (`seq`),
  12. KEY `host` (`host`),
  13. KEY `program` (`program`),
  14. KEY `datetime` (`datetime`),
  15. KEY `priority` (`priority`),
  16. KEY `facility` (`facility`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


7.สร้าง pipe 


โดยเราจะเช็ค pipe ว่ามีแล้วหรือยังด้วยคำสั่ง ls -alh /tmp/mysql.syslog-ng.pipe
หากยังไม่มี ให้สร้าง pipe ขึ้นมาด้วยคำสั่ง mkfifo /tmp/mysql.syslog-ng.pipe

8.ทำการ config file syslog-ng.conf โดยเข้าไปที่ /etc/syslog-ng 






เมื่อเข้าไปแล้ว ใช้คำสั่ง vi
ทำการเพิ่มโคตเข้าไปยังส่วนท้ายของ file ดังนี้ โดยการเขียนไฟล์ด้วย vi จะต้องกด s เพื่อทำการเขียนหรือแก้ใขไฟล์ 
ทำการเพิ่ม เข้าไปยังส่วนท้ายของ file 
source src {
    unix-dgram("/var/run/log");
    unix-dgram("/var/run/lobpriv" perm (0600));
    udp(
        ip(0.0.0.0) port(514)
    );
    tcp(
        ip(0.0.0.0) port(514)
    );
    internal();
    #file("/dev/klog");     
};

source net {
    udp();
};



destination d_mysql {
       pipe("/tmp/mysql.syslog-ng.pipe"
                     template("INSERT INTO logs
                    (host, facility, priority, level, tag, datetime,program, msg)
                     VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG',
                     '$YEAR-$MONTH-$DAY  $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n") template-escape(yes));
};



log { source(s_src); destination(d_mysql); };
#log { source(src); destination(d_mysql); };
log { source(net); destination(d_mysql); };


เช็คว่า filter f_dbg {level(debug);}; ถูก คอมเม้นไว้หรือไม่ หากถูกคอมเม้นด้วยเครื่องหมาย # ข้างหน้าอยู่ให้ปลดออก 

9. สร้าง  bash script สำหรับ pipe ของ  syslog-ng กับ mysql


10.ทำการเพิ่มคำสั่งลงไปใน file syslogng-mysql-pipe.sh

#!/bin/sh
#
# File: syslogng-mysql-pipe.sh
#
# Take input from a FIFO and run execute it as a query for
# a mysql database.
#
# IMPORTANT NOTE:  This could potentially be a huge security hole.
# You should change permissions on the FIFO accordingly.
#
# this script is taken from http://arttechnologyevolution.blogspot.com/2014/04/config-syslog-ng-sent-logs-to-database.html
#

if [ -e /tmp/mysql.syslog-ng.pipe ]; then
        while [ -e /tmp/mysql.syslog-ng.pipe ]
                do
                        mysql -uYourUsername --password=YourPassword YourDatabase < /tmp/mysql.syslog-ng.pipe
        done
else
        mkfifo /tmp/mysql.syslog-ng.pipe
fi

ในส่วนของ YourUsername ให้ใส่ Username ของในการเข้า Database เรา 
YourPassword คือพาสเวิดที่เข้า Database
YourDatabase คือ Database ที่เราสร้างขึ้น 

11.ทำการรันสคริป ด้วยคำสั่ง 
/etc/syslog-ng/syslogng-mysql-pipe.sh &

12.แล้วทำการ Restart Syslog-ng ด้วยคำสั่ง 
/etc/init.d/syslog-ng restart

13.ทำการเช็คข้อมูล Log ใน Database ว่ามารึยัง


หรือจะเข้าไปดูผ่าน PHPMyadmin ก็ได้นะครับ
 การ Config Syslog-ng ลง Database ก็มีแต่เพียงเท่านี้ หากทำตามกระผมแล้วมีปัญหาก็คอมเม้น ได้นะครับ เพราะผมเข้ามาดูบ่อยอยู่ครับ 
บทความต่อไปจะเป็นการ ทำ central logs database นะครับ (ขอเวลาศึกษาแปบ)









วันศุกร์ที่ 21 มีนาคม พ.ศ. 2557

การตั้งค่าให้ PHPMyAdmin ให้สามารถรับการเชื่อมต่อฐานข้อมูลจากภายนอกได้ (จาก IP หรือ Host อื่น)

ในบทความนี้เราจะพูดถึงการเชื่อมต่อฐานข้อมูล ที่เป็นฐานข้อมูลบน Server แบบที่ไม่ใช่การเรียกใช้ฐานข้อมูลใน เครื่องเดียวกัน หรือ Local host แต่จะเป็นการตั้งค่าให้สามารถรับการเชื่อมต่อฐานข้อมูลจาก Server หรือเครื่องคอมพิวเตอร์อื่นได้ โดยในทีนี้เราจะทำการตั้งค่า ใน PHPMyAdmin กันนะครับ
โดย ปกติแล้วหากเราไม่ตั้งค่าเหล่านี้นะครับ เราจะเชื่อมต่อได้เพียง Local Host อย่างเดียวเท่านั้นครับ แต่ถ้าคุณเช่า Server ของคนอื่นเค้าน่าจะมีการ Set มาให้คุณแล้ว แต่ในที่นี้เราจะมาดูในกรณีที่เค้าไม่ Set มาให้เรานะครับ หรือเราต้องมา Set เอง นั่นละครับ

1. ให้ไปที่ Privileges ครับ แล้วจะเจอหน้าตาของโปรแกรมดังรูป แล้วทำการ click ที่ Add a new User ครับ


2. เมื่อ click ที่ Add a new User จะปรากฎ หน้าต่างดังรูปข้างล่างครับ 
โดย  
    2.1 เราจะตั้ง Username ที่เราจะเรียกใช้จากภายนอก  
    2.2 host เราจะใส่ host ที่เราจะอนุญาติให้เชื่อมต่อได้นะครับ
    2.3 ใส่ Pass Word ที่เรา จะใช้เชื่อมต่อกับฐานข้อมูลนี้ครับ

เลื่อนลงมาต่อครับ ยังไม่เสร็จ

    2.4 ในส่วนของ Database For User ก็เลือกเอานะครับ แต่ของผมขอเป็น null แล้วกันนะครับ
    2.5 global Privileges ก็เลือกว่า Database หรือ User นี้จะทำอะไรได้บ้างนะครับ เลือกเอา


    2.6 Resource Limits เราจะทำการ Set Max ของ ครั้ง ของการ Query , Update , Connection , จำนวน User ที่ Connect เข้าใช้ ต่อ ชม.
    2.7 แล้วกด Create User ก็เป็นอันเสร็จสิ้น





***********ในกรณีที่ยังเชื่อมต่อกะฐานข้อมูลยังไม่ได้อีกให้ไป เช็ค ที่ file my.cnf **************
หาก หาไฟล์ไม่เจอให้ใช้คำสั่ง นี้ก็ได้นะครับ find / -name my.cnf แล้วเปิดไฟล์และทำการแก้ใขครับโดย ถ้าหาก
bind-address = 127.0.0.1 เปิดอยู่ ให้ลบ ออกไปหรือ ทำการใส่ # ไปข้างหน้า เพื่อเป็นการ Comment มันออกไป เพื่อไม่ให้ใช้งาน นะครับ 

แล้วทำการ Restart server ไป 1 ที เพื่อให้ระบบต่างๆ ทำงานใหม่ด้วยคำสั่ง 
reboot นะครับ รอสัก 30 วินาที แล้วก็ล็อกอินเข้าไปใหม่หลังจาก Server Restart เสร็จแล้ว 
เพื่อความมั่นใจนะครับเลยให้ Restart Server เลยอิอิอิอิอิอิอิอิ 

เท่านี้้เราก็สามารถเชื่อมต่อฐานข้อมูลจากที่อื่น เครื่องอื่น นอกจาก local host ได้แล้วนะครับ



วันพฤหัสบดีที่ 30 มกราคม พ.ศ. 2557

SDLC VS อริยสัจ 4

SDLC คืออะไร Systems Development Life Cycle แปลเป็นภาษาไทยตรงๆตัวก็ วงจรชีวิตการพัฒนาระบบ (แปลตรงตัวมากอิอิอิอิอิ)



อะทีนี้เรามาดูแต่ละตัวว่ามันคืออะไรกันบ้างนะครับ

ว่ากันด้วย SDLC 

1. Initial Investigation คือ การเริ่มคิดว่าเราจะทำอะไรจะสร้างอะไรขึ้นมา หรือเลือกหัวข้อที่จะทำนั่นเอง
2. System Analysis    คือ การวิเคราะห์ระบบของเราว่ามันเป็นยังงัย มีข้อดีตรงใหน ถ้าทำแล้วจะมีผลยังงัย เช่นสร้างเขื่อนแม่วงศ์ จะผลกระทบต่อสัตว์ป่ามั้ย ต่อชุมชนมั้ย อย่างรัย นั่นคือสิ่งที่ต้องวิเคราะห์ในจุดนี้
3. System Design      คือ หลังจากที่เราวิเคราะห์ผลดีและผลเสียของระบบแล้ว เราเห็นว่ามันมีข้อดีมากว่าข้อเสีย แล้วเราคิดเห็นว่าควรจะสร้างมัน ในขั้นตอนนี้เราก็จะออกแบบว่า ระบบของเราจะต้องใช้อะไรบ้างมีอะไรบ้าง และจะสร้างแบบใหน อย่างเช่น การสร้างถนนชนบท ถนนนี้จะต้อง ใช้งบเท่าใหร่ ใช้คอนกรีดเกรดใหนถึงจะกอบโกยกินกันได้ถ้วนหน้า เป็นต้น
4. Systems Development & Implementation คือ ใน 2 ขั้นตอนนี้ผมขอรวมไว้ด้วยกันเลยนะครับ มันคือขั้นตอนการสร้างและลงมือทำนั่นเอง
5. Operation & Maintenance คือเมื่อเราสร้างระบบเสร็จแล้วเราก็จะมีการมาซ่อมแซมระบบที่เราสร้างในขั้นตอนนี้เราอาจจะรวมการทดสอบระบบเข้าไปด้วยก็ได้นะครับ

ในขั้นตอนทั้งหลายเหล่านี้ทุกขั้นตอนสามารถย้อนกลับไปขั้นตอนก่อนหน้าได้ เช่นเมื่อเรา ถึงขั้นตอนการสร้างระบบแล้ว ในการสร้างมันมีปัญหา ตัวอย่างเช่นถนนชนบทของเราเกิดการแตกร้าวหลังจากเริ้มสร้างได้แค่ 2 เมตร เราก็ต้องกลับไปดูในส่วนการออกแบบว่าการออกแบบของเรามีปัญหาหาตรงใหน ใช้คอนกรีตเกรดต่ำเกินไปหรือไม่เป็นต้น


SDLC VS อริยสัจ 4

SDLC อยู่กับเราทุกวันทุกเวลาทุกสถานที่ครับ ไม่ว่าเราจะไปตลาด เราจะกินข้าว เราจะตด เราจะอาบน้ำ คือมันอยู่กับเราทุกที่ จนเราชินและมองไม่เห็นว่ามันมีอยู่ และตามเราเหมือนเงาตามตัว อย่างไรอย่างนั้น ทำไมผมถึงบอกว่ามันอยู่กับเราทุกที่ทุกเวลาแล้วเราไม่รู้สึกว่ามันมีอยู่ ในสมองของคนเรามีการคิดอย่างเป็นระบบอยู่แล้วครับ แต่เราเห็นว่ามันไม่จำเป็นที่จะต้องสนใจอะไรมันเลย ในทางพุทธศาสนาเรามี SDLC ในส่วนของเราเมื่อนานมาแล้วที่เราเรียกว่า "อริยสัจ 4" หรือความจริงอันประเสริฐ 4 ประการนั่นเอง แต่เราเน้นไปในทางการดับทุกข์ ซึ่ง

อริยสัจ 4 นั้นประกอบไปด้วย 

ทุกข์ >> Initial Investigation คือการรู้ว่าทุกของเราคืออะไร
สมุทัย >>System Analysis คือเราต้องรู้ว่าทุกของเราเกิดจากอะไร
นิโรธ >> System Design คือการออกแบบการดับทุกว่าเราจะดับทุกมันด้วยอะไรวิธีการใหน
มรรค >> Systems Development & Implementation คือการทำให้ทุกข์หมดไปนั่นเอง

อริยสัจ 4 กำเนิดมาเมื่อ 2500 กว่าปีก่อน 
SDLC เกิดขึ้นเมื่อไม่กี่ 10 ปี มานี้

(ตัวเลขอาจจะไม่แน่ชัดนะครับเพราะผมเขียนเมื่อ 31 มกราคม 2557 เวลาอาจะเปลี่ยนไปเรื่อยแต่ได้คร่าวๆประมาณนี้นะครับ)



ขอบคุณรูปภาพจากเว็ปไซต์ http://exonous.typepad.com/mis/2005/02/systems_develop.html
http://www.guitarthai.com/webboard/question.asp?QID=354994

วันอาทิตย์ที่ 19 มกราคม พ.ศ. 2557

ควบคุมการเปิดปิดไฟ ด้วยหน้า GUI ผ่าน Serial Port ด้วยภาษาC#

วันนี้ผมนอนไม่หลับเพราะนอนมาหลายชั่วโมงหลังจากไปแข่ง NSC มาผมเลยนอนจนพอละ เลยอยากเขียน blog ก็เลยตื่นตอน "ตี 3" วันนี้ผมจะเขียนเรื่องการเปิดปิดไฟด้วย หน้า User Interface ที่เขียนด้วยภาษา C#
โดยบทความนี้ผมเขียนกัน board Arduino UNO และ Visual c# นะครับ

 1.เริ่มแรกให้ สร้างโปรเจคขึ้นมาใหม่

2. ลาก Serial Port จาก Tool box มาวางไว้บน Form ที่เราสร้างไว้



หากสำเร็จจะมีคำว่า Serial Port อยู่ข้างล่างดังรูป


3. ลากปุ่มที่จะต้องใช้ในการเปิดปิดไฟออกมาวางบน Form


4. ลาก Combo box และปุ่มมาวางเพื่อใช้ในการเลือก Port เผื่อในกรณีที่คอมพิวเตอร์เรามีหลาย Port 


5. เรียกใช้งาน System.IO.Ports


6.เมื่อโหลด Form นี้ขึ้นมาให้ทำ เอา Port Name มาใส่ใน Combo box


7.ใส่ CheckForIllegalCrossThreadCall = false; ข้างบนใน class Form 1

8.เมื่อทำการรันโปรแกรมจะเห็น Port ที่มีอยู่ ของผมมีแค่ port เดียวเลยไม่ต้องเลือก
แต่ผมเขียนไว้เผื่อในกรณีที่คนอื่นเค้าเข้ามาอ่านแล้วเค้ามีหลาย port กันนะครับ



9.เปลี่ยนชื่อปุ่มให้เรียบร้อยแล้ว double click เข้าไปเพิ่มโคดตังนี้


หากมีการคลิกที่ปุ่ม Selectport จะทำการเลือก port จาก combobox แล้วทำการเปิด port นั้น


10.คลิกเข้าไปเพิ่ม Code ในส่วนของปุ่ม ON 

หากมีการคลิกปุ่มนี้ให้มีการส่งค่า 1 ไปยัง bord


ในปุ่ม OFF ก็เขียนเช่นเดียวกัน แต่เปลี่ยนค่า โดยผมให้ค่าที่ส่งไปเป็น 2 ในกรณีปิดไฟ


ทางฝั่งหน้า GUI ก็เสร็จแต่เพียงเท่านี้

11.ในส่วนทางฝั่งโปรแกรมฝังตัวจะอธิบายโคดดังนี้


เมื่อเขียนเสร็จก็ทำการ Upload เข้าไปใน board ได้เลยครับ แล้วลองรัน ดู
********ในกรณีที่ใครมีแค่ port เดียวก็เสียวได้ ก็ไม่ต้องสร้าง combo box เพื่อเลือก port นะครับ สั่งเปิด port ในตอนโหลด form ไปเลยนะครับ*******

 Code เต็มทางฝั่ง GUI นะครับ


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//เช็ค thread call
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //รับข้อมูล port name ใส่ Combo Box
            String[] stportname = SerialPort.GetPortNames();
            foreach (String n in stportname)
            {
                comboBox1.Items.Add(n);
            }
            comboBox1.SelectedIndex = 0;

        }

        private void button1_Click(object sender, EventArgs e)
        {

            serialPort1.Write("1");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //จะเลือก port และเปิด port
            serialPort1.PortName = comboBox1.SelectedItem + "";
            serialPort1.Open();
        }

อีตรง  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) ไม่ต้องมีก็ได้นะครับ ผมเผลอกดเข้ามาเฉยๆ อิอิอิอิ
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Write("2");
        }
    }
}


Code เต็มทางฝั่ง Board นะครับ 





void setup() {     
Serial.begin(9600);
  pinMode(13, OUTPUT);    //ให้ pin 13 เป็น output  
}

// the loop routine runs over and over again forever:
void loop() {
  if(Serial.available()>0)
  /*ตองตรวจสอบว่ามีข้อมูลในbufferหรือไม่ถ้ามีจึงจะสามารถใช้Serial.read() ได้*/
    {
      int n = Serial.read();//อ่านค่าออกมา
      switch(n)
      {
        case '1':digitalWrite(13,HIGH);break;//ไฟเปิด
        case '2':digitalWrite(13,LOW);break;//ไฟปิด
      }
    }
}

กรุณาอ่านด้วยนะครับ Copy มากๆมันไม่ดีเดียว program error แล้วหาไม่เจอนะครับ 
กล้องผมถ่ายตอนกลางคืนมันกากมากบ่องตงไดแค่นี้หละอิอิอิอิ



วันเสาร์ที่ 28 ธันวาคม พ.ศ. 2556

การเขียน ภาษา c# เพื่ออ่านค่าที่ส่งมาจาก serial port บนคอมพิวเตอร์เรา

บทความนี้ผมก็หาวิธีการเขียนโปรแกรมรับค่ามาจาก board microcontroller ของ Arduino รุ่น UNO อยู่หลายวัน เพราะไม่เคยเขียนภาษา c# มาก่อน (ถามว่าไม่ถนัด c# แล้วเขียนทำไม ตอบได้เลยว่า อยากเขียนมีไรปะ อิอิอิอิ) จริงๆแล้วไม่จำเป็นต้องเป็นบอร์ดของ Aduino ก็ได้ เพราะในที่นี้เราจะรับค่าที่ส่งเข้า Serial port ของคอมพิวเตอร์แล้วมาแสดงผล บนหน้าจอเท่านั้นเอง ก็เริ่มจาก เปิดโปรแกรม Microsoft Visual Basic 2013 ขึ้นมา โดยไปที่ File >> New Project เพื่อสร้าง Project ใหม่ขึ้นมา


แล้วก็เลือกที่ Visual c# >> Window Form Application แล้วก็ทำการเปลี่ยนชื่อ project เราได้ตามสบาย เลยครับ แล้วกด ok ไปซะ 


เมื่อเสร็จจากข้างบนแล้วเราจะได้หน้า Form เปล่าๆ มา 1 หน้า


แล้วก็แต่งหน้า Form ได้ตามสบาย โดยของผมจะมีดังนี้นะครับ TextBox , Button , ComboBox  ดังรูป
โดย TextBox เอาไว้แสดงค่าที่ส่งเข้ามา button เอาไว้กดเริ่มการทำงาน ComboBox เอาไว้ ค้นหา Port 


ทำการ Double Click ที่ตัวฟอร์มแล้วจะปรากฎหน้า Code (คลิกให้หมด ทั้งปุ่มทั้ง อะไรที่อยู่ในหน้า form) จะได้ Code มา 

เมื่อเสร็จแล้วก็ ให้ไปที่ Toolbox แล้วหาคำว่า Serial Port แล้วลากลงมาไว้ใน Form ของเรา

เมื่อลากได้สำเร็จจะเจอ คำว่า Serial Port อยู่ข้าล่าง Form เรา แล้วมันจะตามด้วยเลขอะไรก็ช่างหัวมันนะครับไม่ต้องไปสนใจเพราะมันเป็นชื่อ 

ต่อไป คลิกที่คำว่า serial port ที่อยู่ข้างล่างทีนึง แล้วไปที่ Properties คลิกที่ Event(ที่เป็นรูปสายฟ้า) >>DataRecived แล้ว Double Click มันออกมา จะได้โคดออกมาโดยอัตโนมือ 



แล้วก็เขียน Code ดังนี้ อันใหนไม่มีก็เพิ่มเอานะครับ แล้วก็ลอง Run ดู
Code Programe

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//เช็ค thread call
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //รับข้อมูล port name ใส่ Combo Box
           String [] stportname = SerialPort.GetPortNames();
            foreach(String n in stportname){
                comboBox1.Items.Add(n);
            }
            comboBox1.SelectedIndex = 0;
        }
        int i = 0;
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //ทำงานเมื่อมีข้อมูลเข้ามาจาก port
            textBox1.AppendText(serialPort1.ReadLine());//อ่านข้อมูลออกมาแล้วใส่ Text Box
            textBox1.AppendText("\n");//เลื่อนบรรทัดใหม่
            Console.WriteLine(i++);
        }

        private void button1_Click(object sender, EventArgs e)
        {   //จะเลือก port และเปิด port
            serialPort1.PortName=comboBox1.SelectedItem+"";
            serialPort1.Open();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

เสริมนะครับ 
Code โปรแกรมทางฝั่ง บอร์ด Arduino ที่ผมลอง test ส่งค่าเข้ามา ก็หน้าตาประมาณนี้นะครับ


ของผมเมื่อจัดแต่งหน้าแล้ว Run ก็จะได้ประมาณนี้ครับ


ก็การเขียน c# เพื่ออ่านค่า ขั้นเริ่มต้น ก็มีเพียงเท่านี้ครับ ใครจะเอาประยุกต์รับค่าออกมาแล้วคำนวน อะไรก็ตามสบายเลยครับ

Copy Code ไปแปะเลยมันไม่ดีนะครับเพราะจะทำให้ไม่ข้าใจ พยายามเขียนด้วยตัวเองจะดีที่สุดครับ
เพิ่มเติมนะครับ

*********** ในกรณีที่ set ความเร็วในการส่งข้อมูลไม่ตรงกัน มันจะไม่ได้ข้อมูลที่เราต้องการนะครับ ในฝั่ง โปรแกรมฝังตัว ถ้าเรา set ตรง serial.begin(9600); เป็น 9600 มันจะเป็นค่า default ของตัวโปรแกรมฝั่งที่เราจะอ่านครับ แต่ถ้า set เป็นความเร็วอื่นเช่น serial.begin(115200); เราจะต้องแทรก  serialPort1.BaudRate = ความเร็วในการส่ง; เช่น serialPort1.BaudRate = 115200; นะครับโดยต้อง ใส่ก่อนบรรทัดที่จะเปิด port เช่น        serialPort1.BaudRate = 115200;       serialPort1.Open();