Raspberry Pi2 - ServerController

Page 1

Raspberry Pi 2    247

 

    ดวยความสามารถของบอรด Raspberry Pi 2 ทีรองรั ่ บการเชื่อมตอเครือขายไดสะดวก เหมือน กับคอมพิวเตอรเครื่องหนึ่ง ดังนั้นจึงมีการนํา Raspberry Pi 2 มาใชในการควบคุมหรือติดตออุปกรณ อินพุตเอาตพุตผานเครือขายอยางกวางขวาง ทั้งในแบบเครือขายภายในองคกร และผานเครือขายอิน เทอรเน็ต หากแตการนําเสนอขั้นตอนการพัฒนาบอรด Raspberry Pi 2 เพื่อใชประโยชนในลักษณะ กลับเปนไปอยางจํากัด ดังนันในบทนี ้ จึ้ งเปนการนําเสนอตัวอยางขันตอนการพั ้ ฒนาและใชงานบอรด Raspberry Pi 2 ในการติดตอกับอุปกรณอินพุตเอาตพุตผานเครือขายขอมูล โดยในการอธิบายนั้นจะ มีการยกตัวอยาง ประกอบกับโคดทั้งภาษา HTML (Hyper Text Markup Language) และ Python เพื่อ นําไปสูการสร  างแอปพลิเคชัน่ Simple I/O Web Server ตังแต ้ ตัวอยางการควบคุมอุปกรณเอาตพุตผาน เครื อขาย และการรับคาจากอุปกรณอินพุตรวมถึงผานขอมูลจากตัวตรวจจับเพื่อนํามาแสดงผลบน เครือขาย โดยบอรด Raspberry Pi 2 จะทําหนาทีเป ่ นเว็บเซิรฟเวอรหลัก เนือหาในบทนี ้ จะมี ้ รายละเอียดอยูมากพอสมควร  รวมถึงในขันตอนการทดลองปฏิ ้ บัติการดวย จะมีการยกตัวอยางเพื่อใหเห็นถึงที่มาที่ไปของสวนประกอบตางๆ ที่จะนําไปสูการสรางแอปพลิชัน่ เว็บเซิรฟเวอรควบคุมอุปกรณอินพุตเอาตพุตจนสําเร็จ จึงขอใหผูสนใจโปรดอ  านและติดตามทําความ เขาใจตามลําดับหัวขอ ตามขั้นตอน โดยสรุปหัวขอตางๆ ที่สําคัญของบทนี้ไดดังนี้ 12.1 กลไกการทํางานของเว็บเซิรฟเวอรในการควบคุมอุปกรณอินพุตเอาตพุต 12.2 กลไกการทํางานระหวางเว็บไคลเอ็นตและเว็บเซิรฟเวอร 12.3 เตรียมอุปกรณเพื่อการพัฒนา Raspberry PI 2 สําหรับงานควบคุมผานเครือขาย 12.4 การทําใหบอรด Raspberry Pi 2 เปนเว็บเซิรฟเวอร - จะไดเรียนรูขั้นตอนการทําให บอรด Raspberry Pi 2 ทํางานเปนเว็บเซิรฟเวอรได จะตองมีการติดตังซอฟต ้ แวรเพิ่มเติม ทั้ง Apache HTTP Server และ PHP 12.5 มารูจักกับโครงสรางของภาษา HTML - เมื่อตองการทําเว็บเซิรฟเวอร สิงหนึ ่ ่งที่ตอง ทําใหไดคือ การเขียนเว็บเพจอยางงายดวยภาษา HTML การทําความรูจักกับโครงสรางของภาษานี้ จึงเปนสิ่งจําเปน


248Raspberry Pi 2   

12.6 การสรางเว็บเพจบนบอรด Raspberry Pi 2 - ตอยอดความรูจากหัวขอ 12.4 มาเขียน โปรแกรมเพื่อสรางเว็บเพจของตัวเว็บเซิรฟเวอรซึ่งรันบนบอรด Raspberry Pi 2 12.7 การใชงาน PHP - เปนอีกหนึงภาษาคอมพิ ่ วเตอรทีนิ่ ยมใชมากในการสรางเว็บเพจและ ทําเว็บเซิรฟเวอร 12.8 สรางเว็บเพจดวย PHP - จากการเรียนรูในหั  วขอ 12.6 นําขอมูลและตัวอยางโปรแกรม ตางๆ มาสรางเว็บเพจดวยภาษา PHP 12.9 คําสังพื ่ นฐานในการควบคุ ้ มขาพอรต GPIO แบบคอมมานดไลน - ในหัวขอนีนํ้ าเสนอ การเขียนโปรแกรมสั้นๆ ในแบบคอมมานดไลนเพื่อติดตอและควบคุมขา GPIO ไดรับการนําไปใช เมื่อตองการสั่งงาน GPIO จากเว็บไคลเอ็นตผานเซิรฟเวอร 12.10 การรับสงขอมูลระหวางเว็บเพจ 12.11 การสั่งใหสคริปต Python ทํางานดวย PHP 12.12 การทดลองควบคุมอุปกรณเอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML 12.13 การทดลองติดตออุปกรณอินพุตเอาตพุตอยางงายผานเว็บบราวเซอรทํางานรวมกับ ไฟลสคริปต Python

12.1 กลไกการทํางานของเว็บเซิรฟเวอร ในการควบคุมอุปกรณอินพุตเอาตพุต เมือนํ ่ าบอรด Raspberry Pi 2 มาทําหนาทีเป ่ นเว็บเซิรฟเวอร การทํางานจะแบงออกเปน 2 สวนคือ 1. สวนของการแสดงผลหนาเว็บ ใชการสรางหนาเว็บหรือเว็บเพจ (web page) ดวยโปรแกรม ภาษา HTML 2. สวนของโปรแกรมที่ติดตอกับอุปกรณอินพุตเอาตพุตของบอรด Raspberry Pi 2 ซึ่ง ตองทํางานควบคูกันกับเว็บเพจ การทํางานของบอรด Raspberry Pi 2 ที่ตองกระทําควบคูกับเว็บเพจ ในทีนี่ ขอนํ ้ าเสนอ 2 แบบ ประกอบดวย 1. กําหนดใหโปรแกรมสวนทีติ่ ดตอกับอุปกรณอินพุตเอาตพุตแทรกอยูภายในส  วนทีใช ่ แส ดงเว็บเพจ หากเขียนเว็บเพจดวย PHP ก็จะแทรกโปรแกรมสวนทีติ่ ดตอกับอุปกรณอินพุตเอาตพุตเขา ไปดวย รูปแบบนี้ใชไดดีกับการทํางานเพียงรอบเดียวจบ ใชเวลานอยในการทํางาน เพราะเว็บเพจจะ ไมเปลี่ยนแปลง จนกวาจะกระทําทุกคําสั่งจนเสร็จ จะแสดงการทํางานในลักษณะนี้ในตัวอยางการ ทดลองควบคุมอุปกรณ ผานเว็บบราวเซอรโดยใช PHP และ HTML (หัวขอ 12.12 ในบทนี้)


Raspberry Pi 2    249

2. กําหนดใหใชขอมูลรวมกันระหวางโปรแกรมที่ ติดตอกับอุปกรณอินพุตเอาตพุตกับ โปรแกรมทีใช ่ แสดงเว็บเพจ เชน กําหนดใหโปรแกรมในสวนทีติ่ ดตอกับอุปกรณอินพุตเอาตพุตทํางาน ตลอดเวลา โดยมีการนําขอมูลบางสวนทีโปรแกรมของการแสดงเว็ ่ บเพจก็ใชงานอยูด วยมาประกอบเพือ่ ใหการทํางานสมบูรณ ขอมูลทีใช ่ รวมกันอาจอยูในรู  ปของไฟลเอกสารหรือฐานขอมูลก็ได ดวยวิธีการนี้ จะยืดหยุนกว  าแบบแรก เพราะการทํางานของโปรแกรมทังสองแยกออกจากกั ้ นไดอยางชัดเจน มีเพียง การใชงานขอมูลบางสวนรวมกันเทานัน้ ถึงแมวาโปรแกรมของการติดตอกับอุปกรณอินพุตเอาตพุตอาจ มีการประมวลผลทีซั่ บซอนและใชเวลานาน โปรแกรมของการแสดงเว็บเพจก็ยังคงทํางานไปไดอยางตอ เนือง ่ เพราะใชขอมูลจากไฟลเอกสารหรือฐานขอมูลทีมี่ อยูในป  จจุบัน เพียงแตขอมูลทีนํ่ ามาแสดงผลนัน้ อาจยังไมไดรับการปรับปรุงจากการทํางานลาสุดของโปรแกรมทีใช ่ ติดตออุปกรณอินพุตเอาตพุต (เพราะ อาจยังประมวลผลไมเสร็จ) การทํางานในลักษณะนีอธิ ้ บายใหเขาใจไดเพิมขึ ่ นด ้ วยตัวอยางการทดลอง ควบคุมอุปกรณผานเว็บบราวเซอรรวมกับไฟลสคริปต Python ในหัวขอ 12.13 ของบทนี้

รูปที่12-1 ไดอะแกรมแสดงกลไกการทํางานรวมกันของเว็บไคลเอนต (ปกติคือ คอมพิวเตอรของผูใช  งาน) และเว็บเซิรฟเวอร โดยทํางานผานเว็บบราวเซอรเพือแจ ่ งรองขอเว็บเพจ และรับขอมูลกลับมาในรูปแบบ HTML เพือนํ ่ ามาแสดงเว็บเพจอยางสมบูรณทีเว็ ่ บไคลเอนต


250Raspberry Pi 2   

12.2 กลไกการทํางานระหวางเว็บไคลเอนตและเว็บเซิรฟเวอร แสดงดวยไดอะแกรมในรูปที่ 12-1 เริ่มตนเมือเว็ ่ บไคลเอนต (web client) ซึ่งก็คือ คอมพิวเตอร ของผูใชงานทําการรองขอเว็บเพจ (Request Web Page) มายังเว็บเซิรฟเวอร (web server) จากนั้น เว็บเซิรฟเวอรจะสงขอมูลเว็บเพจที่รองขอมายังเว็บไคลเอนต ในรูปแบบ HTML แลวแสดงผลดวย เว็บบราวเซอรที่ติดตังอยู ้ ในเว็บไคลเอนต เนื่องจากเว็บเพจที่ถูกสรางดวยภาษา HTML เปนภาษาที่ใชแสดงหนาตาเว็บเพจตามที่ตอง การแตจะไมชวยใหเว็บเพจนันปรั ้ บเปลียนหน ่ าตาไดเอง การสรางเว็บเพจทีสามารถปรั ่ บเปลียนได ่ นัน้ ทําไดหลายวิธี หนึงในนั ่ นก็ ้ คือ การฝงสคริปตหรือชุดคําสังที ่ ทํ่ างานทางฝงเซิ  รฟเวอร (server-side script)ไวในเว็บเพจ สคริปตตัวหนึงที ่ นิ่ ยมใชกันมาจากคือ PHP engine (PHP: Professional Home Page) เปน สคริปตที่ทํางานรวมกับภาษา HTML เพือช ่ วยใหเว็บเพจเปลียนหน ่ าเว็บไดเองหรือเรียกอีกอยางหนึง่ คือ ทําใหเว็บเพจมี “ความฉลาด” ขึ้น

12.3 การเตรียมอุปกรณเพื่อการพัฒนา Raspberry PI 2 สําหรับงานควบคุมผานเครือขาย เพือให ่ การเรียนรูเพื  อพั ่ ฒนาบอรดคอมพิวเตอรอยาง Raspberry Pi 2 สําหรับการสรางระบบควบ คุมผานเครือขาย การจัดเตรียมเครืองมื ่ อและอุปกรณเปนสิงที ่ ต่ องดําเนินการไปพรอมกัน อันประกอบดวย 1. บอรด Raspberry Pi 2 2. USB WiFi ดองเกิล (มีใหในชุด Raspberry Pi 2 Tech Kit แลว) 3. เราเตอรแบบไรสาย (Wireless router) หรือแบบปกติก็ได (หากใชแบบปกติ ไมตองใช USB WiFi ดองเกิลตามไดอะแกรมในรูปที่ 12-3) พรอมแหลงจายไฟ 4. สาย LAN เพื่อเชือมต ่ อบอรด Raspberry Pi 2 เขากับเราเตอร (กรณีไมใชแบบไรสาย ตามไดอะแกรมในรูปที่ 12-3) 5. อะแดปเตอร +5V ที่จายกระแสไฟฟาได 2A เปนอยางนอย สําหรับบอรด Raspberry Pi 2 (มีใหในชุด Raspberry Pi 2 Tech Kit แลว) 6. คอมพิวเตอรที่เชื่อมตอเขากับระบบเครือขาย 7. เครือขายอินเทอรเน็ต (ในกรณีตองการเชือมต ่ อกับเครือขายภายนอก) แนวทางการเชีอมต ่ ออุปกรณทังหมด ้ เพือการเรี ่ ยนรูและทดลองพั  ฒนาระบบควบคุมผานเครือ ขายของบอรด Raspberry Pi 2 แสดงในรูปที่ 12-2


Raspberry Pi 2    251

รูปที่ 12-2 ไดอะแกรมการเชือมต ่ ออุปกรณเพือพั ่ ฒนาระบบควบคุมผานเครือขายโดยใชบอรด Raspberry Pi 2 ในแบบตอสาย LAN

รูปที่ 12-3 ไดอะแกรมการเชือมต ่ ออุปกรณเพือพั ่ ฒนาระบบควบคุมผานเครือขายโดยใชบอรด Raspberry Pi 2 ในแบบไรสายผาน WiFi


252Raspberry Pi 2   

12.4 การทําใหบอรด Raspberry Pi 2 เปนเว็บเซิรฟเวอร การกําหนดให Raspberry Pi 2 ทําหนาทีเป ่ นเว็บเซิรฟเวอร ลําดับแรกตองติดตังโปรแกรมสํ ้ าหรับ การทํางานเปนเว็บเซิรฟเวอรกอน เนืองจากระบบปฏิ ่ บัติการหลักของ Raspberry Pi 2 เปน Linux ดังนัน้ โปรแกรมเว็บเซิรฟเวอรทีแนะนํ ่ าใหติดตังคื ้ อ Apache HTTP Server โปรแกรมนีมี้ หนาทีบริ ่ การขอมูล และติดตังกลไก ้ PHP แกเว็บไคลเอนต (คอมพิวเตอรยอยในเครือขาย) ทีทํ่ าการรองขอเขามา

12.4.1 ขันตอนการติ ้ ดตัง้ Apache HTTP Server (1) เชือมต ่ อ Raspberry Pi 2 เขากับเครือขายอินเทอรเน็ต (ดูไดอะแกรมจากรูปที่ 12-2 หรือ 123 หรือจากบทที่ 2) (2) เขาสูคอมมานด  พรอมต แลวพิมพคําสังเพื ่ ่อติดตังโปรแกรม ้ Apache HTTP Server sudo apt-get install apache2 –y

(3) เมือทํ ่ าการติดตังเสร็ ้ จเรียบรอยแลว ทําการเปดเว็บบราวเซอร (อาทิ Chromium หรือ Midori) ที่ชองคนหา ใหพิมพ Localhost หรือพิมพแอดเดรส 127.0.0.1 หรือ IP แอดเดรสของบอรด Raspberry Pi 2 เชน 192.168.1.36 จะแสดงขอความทีขึ่ นต ้ นวา It works! ดังรูป แสดงวา Apache ทํางานไดปกติ (การคนหาหมายเลข IP แอดเดรสของ Raspberry Pi 2 ทีต่ อในเครือขาย อาจใชโปรแกรม Advance IP Scanner ชวย ดูรายละเอียดไดจากกรอบแยกในบทนี)้


Raspberry Pi 2    253

(4) เมือติ ่ ดตังเสร็ ้ จแลว บน Raspberry Pi 2 จะมีไดเร็กตอรีหรื ่ อโฟลเดอรทีชื่ อว ่ า www ถูกสราง ขึนมาในไดเร็ ้ กตอรี่ var เปนทีเก็ ่ บไฟลสําหรับทําเปนเว็บเพจหรือหนาเว็บ เมือเป ่ ดเขาไปในไดเร็กตอรี่ /var/www จะมีไฟล index.html อยูขางใน ดังรูป

(5) ถาตองการตั้งคาเพื่อกําหนดระดับของการเขาถึงหรือ permission ใหกับไดเร็กตอรี่ /var/ www เพื่อใหการสงไฟลระหวางคอมพิวเตอรทําไดสะดวกและงายตอการพัฒนา ใหพิมพคําสั่งบน Raspberry Pi 2 ดังนี้ sudo chmod 0777 -R /var/

ตัวเลข 777 เปนการตังค ้ าใหผูใช  งานในทุกระดับการเขาถึงสามารถอาน, เขียน และ สังให ่ ทํางาน (Read-Write-Execute) ไดทุกไฟลและโฟลเดอร (หรือไดเร็กตอรี่)

12.4.2 ติตตั้ง PHP (1) เชือมต ่ อ Raspberry Pi 2 เขากับเครือขายอินเทอรเน็ต (ดูไดอะแกรมจากรูปที่ 12-2 หรือ 123 หรือจากบทที่ 2) (2) เขาสูหน  าตางเทอรมินอล แลวพิมพคําสังเพื ่ ่อติดตัง้ PHP sudo apt-get install php5 libapache2-mod-php5 –y


254Raspberry Pi 2   

      การคนหาหมายเลข IP แอดเดรสของอุปกรณในเครือขาย จะตองทราบขอบเขตของจํานวน IP แอดเดรส กอนจึงจะคนหาหมายเลข IP แอดเดรสนั้นได ดังนั้นอุปกรณที่ตองการทราบหมายเลข IP แอดเดรสจะตองอยู ใน LAN หรือเครือขายเดียวกัน ในการทดลองเพือเรี ่ ยนรูการใช  งานบอรด Raspberry Pi 2 ในการควบคุมอุปกรณ ผานเครือขายในบทนี้ จะตองมีการตรวจสอบหมายเลข IP แอดเดรสของบอรด Raspberry Pi 2 ที่เชื่อมตอใน เครือขาย ดังนันจึ ้ งตองมีการเชือมต ่ ออุปกรณตามแนวทางในรูปที่ 12-2 หรือ 12-3 เสียกอน จากนันใช ้ คอมพิวเตอร ที่ทําหนาทีเป ่ นเว็บไคลเอนตในการติดตังซอฟต ้ แวร Advanced IP Scanner เพื่อใชคนหาหมายเลข IP แอดเด รสของบอรด Raspberry Pi 2 ตอไป

ติดตังโปรแกรม ้ ซอฟตแวรนีรองรั ้ บการสแกน HTTP, HTTPS, FTP และสแกนเครือขายเพือทราบข ่ อมูลเพิมเติ ่ มเกียวกั ่ บ อุปกรณทีเชื ่ อมต ่ อกัน ไดแก ชือของคอมพิ ่ วเตอรหรืออุปกรณ และ MAC แอดเดรส ดาวนโหลดโปรแกรมไดที่ http:/ /www.advanced-ip-scanner.com/th/ จากนันทํ ้ าการติดตังโปรแกรมลงในคอมพิ ้ วเตอร (ทีทํ่ าหนาทีเป ่ นเว็บไคล เอนตจากรูปที่ 12-2 หรือ 12-3) ใหเรียบรอย

การใชงาน (1) เมือติ ่ ดตังโปรแกรมเสร็ ้ จแลว จะมีไอคอนของซอฟตแวร ดับเบิลคลิกเพือเป ่ ดโปรแกรม

(2) หนาตางหลักของโปรแกรมแสดงขึนมา ้ มีรายละเอียดดังรูป


Raspberry Pi 2    255

(3) วิธีการหาขอบเขต IP แอดเดรส ดวยซอฟตแวร Advanced IP Scanner เริมต ่ นดวยการเปด Control Panel > Network and Internet > Network and Sharing Center จากนั้นคลิกที่ Ethernet หากการตอ อุปกรณใชสาย LAN ตอระหวางคอมพิวเตอร เราเตอร และ Raspberry Pi 2 เพือให ่ อยูในวง  LAN เดียวกัน

(4) แตถาหากบอรด Raspberry Pi 2 ตอกับเครือขายในแบบไรสายผาน Wi-Fi จะตองคลิกที่ WiFi แทน (5) จากนั้นจะปรากฏหนาตาง Ethernet Status ที่แสดงสถานะของ Ethernet ใหคลิกที่ Details..


256Raspberry Pi 2   

(6) จะปรากฏหนาตางแสดงรายละเอียดของการเชื่อมตอ Network ดังรูป

ขอมูลที่สําคัญสําหรับการหาขอบเขต IP แอดเดรสคือ IPv4 Address และ IPv4 Subnet Mask โดยที่ IPv4 Address คือ หมายเลข IP แอดเดรสของคอมพิวเตอรที่ไดรับหมายเลข IP แอดเดรสจาก เราเตอร IPv4 Subnet Mask คือ จํานวนหมายเลข IP แอดเดรสของอุปกรณทีอยู ่ ในวง  LAN เดียวกัน นําขอมูลนี้มาคํานวณขนาดของ IP แอดเดรส ดังนี้ (6.1) คํานวนหาหมายเลขเริมต ่ นของ IP แอดเดรสหรือ Network IP IP แอดเดรส มีขอมูล 4 ชุด ชุดละ 8 บิต คันด ่ วยจุด . การกระทําทางดานลอจิกจะตองกระทําให ตรงชุดดวย IPv4 Address = 192.168.137.1 เมื่อแปลงเปนเลขฐานสองจะได 11000000.10101000.10001001.00000001 IPv4 Subnet Mask=255.255.255.0 แปลงเปนเลขฐานสองจะได 11111111.11111111.11111111.00000000 นํา IPv4 Address แอนด (AND) กับ IPv4 Subnet Mask จะได 11000000.10101000.10001001.00000000 แปลงเปนเลขฐานสิบจะได 192.168.137.0 จึงได Network IP มีคาเทากับ 192.168.137.0 หรือเรียกอีกอยางคือ คาเริ่มตนของ IP แอด เดรสของวง LAN นี้


Raspberry Pi 2    257

(6.2) คํานวนหาหมายเลขสินสุ ้ ดของ IP แอดเดรส หรือ Broadcast IP วิธีที่งายที่สุดคือ เมื่อทราบแลววา ในแตละชุดขอมูลมีขนาด 8 บิต คือมีคา 0 ถึง 255 ให พิจารณาจาก Subnet Mask กอน จะเห็นไดวาชุดที่ 4 ของ Subnet Mask เปนเลข 0 นอกนั้นมีคาเปนหมาย เลข 255 ทั้ง 3 ชุด ดังนั้นหมายเลข Subnet Mask คือ 255.255.255.0 ถึง 255.255.255.255 มีหมายเลขที่ เปนไปไดคือ 256 จํานวน (0 ถึง 255) สงผลใหหมายเลข IP แอดเดรสทีอยู ่ ในวง  LAN นีเริ้ มจาก ่ Network IP นั่นคือ 192.168.137.0 ไปถึง 192.168.137.255 (7) เมื่อทราบขอบเขตที่ตองการหาหมายเลข IP แอดเดรสแลว ใหนําหมายเลขนั้นใสในชองแรกของ โปรแกรม Advance IP Scanner ดังรูป จากนั้นคลิกที่ปุม SCAN เพือเริ ่ มการค ่ นหา

(8) เมือค ่ นหาเสร็จแลว จะแสดง IP แอดเดรสของอุปกรณทุกตัวที่ตออยูในวง  LAN เดียวกันดังรูป

จะไดหมายเลข IP แอดเดรสของบอรด Raspberry Pi 2 ที่ตอภายในเครือขาย โดยอาจดูจากชื่อ หรือชือผู ่ ผลิ  ตก็ได จากนันนํ ้ าหมายเลข IP แอดเดรสไปใชงานตอไป


258Raspberry Pi 2   

(3) เมือติ ่ ดตังเสร็ ้ จเรียบรอยแลว ลําดับตอไปเปนการทดสอบการทํางาน PHP บน Raspberry Pi (4) เปดโฟลเดอรหรือไดเร็กตอรีที่ มี่ ชือว ่ า www โดยจะอยูที ่ /var/www ภายในมีไฟล index.html ใหเปลี่ยนนามสกุลเปน .php ดังรูป (ขั้นตอนนี้จะทําไดก็ตอเมื่อทําการตังค ้ า Permission จากขั้นตอน ที่ผานมาเปนที่เรียบรอยแลว หรือใชคําสังแบบคอมมานด ่ ไลนบน Raspberry Pi 2 ศึกษาไดจาก http:/ /doc.inex.co.th/r-pi-web-server-installation/)

(5) เมื่อเปลี่ยนนามสกุลไฟลเสร็จแลว ลบสคริปตที่อยูในไฟลนี้ใหหมด แลวเพิ่ม <?php phpinfo(); ?> ดังรูป จากนั้นบันทึกไฟล

(6) ทดสอบการทํางานของ PHP โดยเปดเว็บบราวเซอร เขาไปที่ IP แอดเดรสของ Raspberry Pi 2 เชน 192.168.1.36 จะเห็นเว็บเพจแสดงดังรูป แสดงวา PHP ทํางานไดปกติ


Raspberry Pi 2    259



  

sudo apt-get install php5 libapache2-mod-php5 -y

    sudo apt-get install apache2 -y

 <?php phpinfo(); ?>

 

    

    



   

 

sudo chmod 0777 -R /var/

รูปที่ 12-4 ผังงานแสดงขันตอนการเตรี ้ ยมการให Raspberry Pi 2 ทํางานเปนเว็บเซิรฟเวอร


260Raspberry Pi 2   

12.5 รูจักกับโครงสรางภาษา HTML 12.5.1 ขอมูลเบื้องตน โครงสรางหลักของ HTML เริ่มดวย ชุดคําสังที ่ ่ใชแยกเปน 2 สวนคือ

<html>

และจบดวย </html> เสมอ ดังรูปที่ 12-5

1. head คําสังที ่ ่อยูในสวนนี้ใชบรรยายรายละเอียดเกี่ยวกับเว็บเพจหรือหนาเว็บ 2. body คําสังที ่ ่อยูในส  วนนี้ใชในการจัดรูปแบบตัวอักษร จัดหนา ใสรูปภาพ ซึงตั ่ วอักษร ในสวนนี้จะแสดงที่เว็บบราวเซอรโดยตรง สวนตัวอยางของโปรแกรมภาษา HTML เพื่อแสดงเว็บเพจแสดงไวในโปรแกรมที่ 12-1 <html> <head>

head

</head> <body>

body

</body> </html>

รูปที่ 12-5 โครงสรางของโปรแกรมภาษา HTML


Raspberry Pi 2    261

<html> <head> <title>Homepage Title</title> </head> <body> Value: <input type=”text” mame “fname”> <button type=”button”>Click Me!</button><br> <input type=”submit” value=”Submit”> <table style=”width:50%”> <tr> <td>Number</td> <td>Value1</td> <td>Value2</td> </tr> <tr> <td>1</td> <td>data1</td> <td>data2</td> </tr> <tr> <td>2</td> <td>data3</td> <td>data4</td> </tr> </table> </body> </html>

คําอธิบายชุดคําสัง่ <title>Homepage Title</title> คําสังที ่ ่ใชระบุบชื่อ web page <input

type=”text” name=”fname”> คําสังที ่ ่ใชแสดง Textbox เพื่อรับขอมูลจาก คียบอรด

<button type=”button”>Click Me!</button>

คําสังที ่ ่ใชแสดงปุม

่ ใช ่ ขึนบรรทั ้ ดใหม <br> คําสังที ่ ม <input type=”submit” value=”Submit”> คําสังแสดงปุ <table style=”width:50%”>……</table>

คําสังแสดงตารางที ่ ่มีความกวาง 50% ของหนาจอ

<tr>…..</tr> คําสังแสดงข ่ อมูลใน 1 แถว <td>….</td>

คําสังแสดงข ่ อมูลใน 1 สดมภ

โปรแกรมที่ 12-1 ตัวอยางโปรแกรมของโฮมเพจ ทีเขี ่ ยนขึนด ้ วยภาษา HTML


262Raspberry Pi 2   

12.5.2 การทดสอบโปรแกรมภาษา HTML บนคอมพิวเตอร เพื่อใหเกิดความเขาใจในโปรแกรมภาษา HTML มากขึน้ ใหทดสอบตามขันตอนต ้ อไปนี้ (1) เปดโปรแกรม Notepad จากนั้นพิมพคําสั่ง HTML จากโปรแกรมที่ 12-1 ดังรูปที่ 12-6

รูปที่ 12-6 ตัวอยางโปรแกรมภาษา HTML ทีพิ่ มพลงในโปรแกรม Notepad (2) บันทึกไฟลชือ่ Web.html เลือกบันทึกแบบ All File (*.*) และเขารหัสแบบ UTF-8 ดังรูป ที่ 12-7 แลวกดปุม Save

รูปที่ 12-7 บันทึกไฟลภาษา HTML


Raspberry Pi 2    263

(3) เปดไฟล Web.html ดวยเว็บบราวเซอร อาทิ Google Chrome หรือ Mozila Firefox จะไดผล ดังรูปที่ 12-8

รูปที่ 12-8 ตัวอยางเว็บเพจทีเขี ่ ยนขึนจากโปรแกรมที ้ ่ 12-1 หมายเลข 1 เปนผลของสวนคําสังที ่ เป ่ น head หมายเลข 2 เปนผลของสวนคําสังที ่ เป ่ น body


264Raspberry Pi 2   

12.6 การสรางเว็บเพจบนบอรด Raspberry Pi 2 จากหัวขอ 12.5 เปนการแนะนําใหทดลองสรางไฟล HTML บนคอมพิวเตอรทัวไป ่ ในหัวขอนี้ เปลียนมาเป ่ นการสรางไฟล HTML บนบอรด Raspberry Pi 2 บาง โดยตังชื ้ อไฟล ่ HTML วา Web.html มีขันตอนดั ้ งนี้ (1) เปดโปรแกรม Geany จากนันเลื ้ อกสรางไฟลใหม โดยคลิกเลือก File > New(with_Template) > file.html (2) เมื่อสรางไฟลขึ้นมาแลว เพิ่มชุดคําสังเข ่ าไป ตามรูปที่ 12-9

รูปที่ 12-9 สรางไฟล HTML บน Geany ทีติ่ ดตังบนบอร ้ ด Raspberry Pi 2 หมายเลข 1 คําสังในส ่ วน head หมายเลข 2 คําสังในส ่ วน body


Raspberry Pi 2    265

(3) บันทึกไฟลที่สรางขึ้นมา โดยการกด Ctrl และ s แลวตั้งชือว ่ า Web.html เก็บไวที่ var/www/ ดังรูปที่ 12-10

รูปที่ 12-10 บันทึกไฟล HTML บน Geany ทีติ่ ดตังบนบอร ้ ด Raspberry Pi 2


266Raspberry Pi 2   

(4) จากนันไปที ้ คอมพิ ่ วเตอรทีทํ่ าหนาทีเป ่ นเว็บไคลเอ็นต ใหพิมพ IP แอดเดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี)้ ตามดวยชือไฟล ่ ทีสร ่ าง เชน 192.168.137.243/Web.html จะไดผลดัง รูปที่ 12-11 หมายเหตุ : การหา IP แอดเดรสของ Raspberry Pi 2 อาจใชโปรแกรมคนหาหรือใช คําสั่ง ifconfig บน Raspberry Pi 2 เพื่อตรวจสอบก็ได

รูปที่ 12-11 เว็บเพจทีสร ่ างขึนและเก็ ้ บไวในบอรด Raspberry Pi 2 หมายเลข 1 คําสังในส ่ วน head หมายเลข 2 คําสังในส ่ วน body


Raspberry Pi 2    267

12.7 การใชงาน PHP PHP คือภาษาคอมพิวเตอรในลักษณะเซิรฟเวอร-ไซด สคริปต (server-side script) ภาษา PHP ใชสําหรับจัดทําเว็บไซต และแสดงผลออกมาในรูปแบบ HTML เปนสวนประกอบภายในเว็บเพจ โดยคําสั่งจะปรากฏระหวาง <?php...?> หรือ <?...?> ตัวอยางที่ 12-1 <?php echo echo echo echo ?>

"Hello, "."<br>"; "World!"; "<br> "."Hello, "; "Inex!";

ผลลัพธ Hello, World! Hello,Inex!

อธิบายคําสั่ง ่ ใช ่ แสดงขอความ การตอขอความจะใชจุด . สวนการขึนบรรทั ้ ดใหมใชรหัส echo เปนคําสังที ่ องการขึนบรรทั ้ ดใหมดังตัวอยางที่ 12-1 <br> รวมกับขอความทีต


268Raspberry Pi 2   

12.8 สรางเว็บเพจดวย PHP จากการเรียนรูในหั  วขอ 12.7 นําขอมูลและตัวอยางโปรแกรมตางๆ มาสรางเว็บเพจดวยภาษา PHP บนบอรด Raspberry Pi 2 โดยยังคงมีการเชือมต ่ ออุปกรณเขากับเครือขายตามรูปที่ 12-2 หรือ 12-3 (1) สรางไฟล PHP ดวยการเปดโปรแกรม Geany เลือกที่ File > New (with_Template) > file.php เมือสร ่ างไฟลขึนมา ้ (2) ลบขอความเดิมออกใหหมด แลวเพิ่มชุดคําสังเข ่ าไปดังรูปที่ 12-12

รูปที่ 12-12 หนาตางของโปรแกรม Geany ทีแสดงโค ่ ดสําหรับสรางไฟล PHP (3) บันทึกไฟล โดยการกด Ctrl และ s ตังชื ้ อเป ่ น Hello.php เก็บไวที่ var/www/ ดังรูปที่ 12-13

รูปที่ 12-13 บันทึกไฟล PHP เพือสร ่ างเว็บเพจบนบอรด Raspberry Pi 2


Raspberry Pi 2    269

(4) จากนันไปที ้ คอมพิ ่ วเตอรทีทํ่ าหนาทีเป ่ นเว็บไคลเอ็นต ใหพิมพ IP แอดเดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี)้ ตามดวยชือไฟล ่ ทีสร ่ าง เชน 192.168.137.243/Hello.php จะไดผลลัพธ ดังรูปที่ 12-14

รูปที่ 12-14 เว็บเพจทีสร ่ างขึนบนบอร ้ ด Raspberry Pi 2 ดวยไฟล PHP

12.9 คําสังพื ่ ้นฐานในการควบคุมขาพอรต GPIO แบบคอมมานดไลน ในหัวขอนีนํ้ าเสนอการเขียนโปรแกรมสันๆ ้ แบบคอมมานดไลน (คําสังเรี ่ ยงบรรทัด) เพือติ ่ ดตอ และควบคุมขา GPIO ของ Raspberry Pi 2 เพื่อนําไปใชเมื่อตองการสั่งงานขาพอรต GPIO จากเว็บ ไคลเอ็นตผานเซิรฟเวอร รูปแบบคําสั่ง gpio -g mode "pin" "mode" gpio -g write "pin" "state" gpio -g read "pin"

โดยที่ ่ เหมือนกันกับการเขียน Python -g คือ ใชระบุหมายเลขGPIO ตามแบบ BCM_GPIO ทีใช pin คือ ตําแหนงขาบน Raspberry Pi mode คือ กําหนดลักษณะการทํางานของขา input, output state คือ บอกสถานะการทํางานของขามี 1 และ 0


270Raspberry Pi 2   

รูปที่ 12-15 การจัดขาพอรต GPIO ของบอรด Raspberry Pi 2 ตัวอยางที่ 12-2 gpio -g mode 16 output gpio -g write 16 1 gpio -g read 16 gpio -g write 16 0

: กําหนดใหขาพอรต 16 เปนเอาตพุต : กําหนดสถานะลอจิกของขาพอรต 16 เปน “1” : อานคาจากขาพอรต 16 :กําหนดสถานะลอจิกของขาพอรต 16 เปน “0”

ทําการทดลองตามขั้นตอนตอไปนี้ (1) ตอวงจรตามรูปที่ 12-16 กําหนดใหบอรด Raspberry Pi 2 เขาสูคอมมานด  พรอมต (2) เขียนโปรแกรมทดสอบดังนี้ gpio -g mode 16 output gpio -g write 16 1 gpio -g read 16

จะไดผลลัพธกลับมาเปน “1” และ LED ทีต่ อกับขาพอรต 16 จะติดสวางตังแต ้ กระทํา คําสัง่ gpio

-g write 16 1


Raspberry Pi 2    271

รูปที่ 12-16 วงจรสําหรับการทดลองควบคุมขาพอรต GPIO ดวยการเขียนโปรแกรมแบบคอมมานดไลน (4) เขียนโปรแกรมตอไปนี้ตอเนื่องจากขอ (2) gpio -g write 16 0 gpio -g read 16

จะไดผลลัพธกลับมาเปน “0” และ LED ทีต่ อกับขาพอรต 16 จะดับลง ตังแต ้ กระทําคําสัง่ gpio -g write 16 0

สวนที่หนาจอของ Raspberry Pi 2 จะแสดงผลดังรูปที่ 12-17 จะใชรูปแบบคําสังในลั ่ กษณะนี้ในการควบคุมการทํางานของขาพอรต GPIO บน Raspberry Pi ผานเว็บบราวเซอรโดยใชคําสัง่ system และ exec บนภาษา PHP ในลําดับตอไป

รูปที่ 12-17 แสดงการทํางานของบอรด Raspberry Pi 2 เมือเขี ่ ยนโปรแกรมแบบคอมมานดไลนเพือควบคุ ่ ม การทํางานของขาพอรต GPIO


272Raspberry Pi 2   

12.10 การรับสงขอมูลระหวางเว็บเพจ การรับสงขอมูลระหวางเว็บเพจจะใชเมธอด (method) Get, Post, Put และ Delete สมมติวา มีแบบฟอรมใหผูใช  งานปอนคา จากนันส ้ งมายังเว็บเซิรฟเวอร แลวใชสคริปต PHP เปนตัวจัดการเก็บ ขอมูลลงในฐานขอมูลหรือเปนไฟลสําหรับดูภายหลัง เมธอดที่นิยมใชจะมี 2 ตัวคือ Get และ Post

12.10.1 รูปแบบการใชเมธอด Get การใชเมธอด Get ในการรับขอมูลจะเห็นขอมูลที่สง โดยทําการทดสอบไดงายๆ ตัวอยางที่ 12-3 <?php if(isset($_GET["f_name"])&isset($_GET["l_name"])){ echo "first name=".$_GET["f_name"]; echo "<br>"."last name=".$_GET["l_name"]; } ?>

อธิบายคําสั่ง $_GET["var

name"] เปนตัวแปรชนิดหนึ่งที่ใชอานคาเมื่อใชเมธอด Get

isset(var name) เปนคําสังตรวจสอบว ่ า ตัวแปรนั้นมีคาหรือไม

หลักการทํางาน ตรวจสอบวามีการสงขอมูลทั้งสองตัวมาหรือไม ถามีใหแสดงขอความที่สงเขามา การทดสอบบน Raspberry Pi 2 (1) ยังคงเชือมต ่ อบอรด Raspberry Pi 2 และอุปกรณตางๆ เขากับเครือขายตามรูปที่ 12-2 หรือ 12-3 (2) สรางไฟล PHP โดยพิมพคําสังดั ่ งตัวอยาง ตังชื ้ ่อไฟลเปน Test_get.php เก็บไวที่ var/ www/ (3) จากนันไปที ้ ่คอมพิวเตอรที่ทําหนาทีเป ่ นเว็บไคลเอ็นต เปดเว็บบราวเซอรใหพิมพ IP แอด เดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี้) ตามดวยชื่อไฟลที่สรางและคาตางๆ เชน http://192.168.137.243/Test_get.php/?f_name=INEX&l_name=inex ดังรูปที่ 12-18


Raspberry Pi 2    273

รูปที่ 12-18 แสดงการทํางานของไฟล Test_get.php บนบอรด Raspberry Pi 2 ผานทางเว็บบราวเซอร จากการปอน 192.168.137.243/Test_get.php/?f_name=INEX&l_name =inex เปนการระบุคาเพื่อใชเมธอด Get ในการรับคา โดยเริ่มจาก /?f_name=INEX&l_name ่ ง =inex จะเห็นไดวา ที่โคด f_name=INEX นั้น f_name เปนตัวระบุบคา สวน INEX เปนคาทีส เขาไป ดังนั้นที่โคด $_GET["f_name"] จึงเปนการอานคาจาก f_name การสงคาทีใช ่ เมธอด Get มากกวาหนึ่งตัวจะใชเครื่องหมาย & เปนตัวคั่น

12.10.2 การใชเมธอด Get ควบคุมขาพอรต GPIO ของบอรด Raspberry Pi 2 ในหัวขอนี้เปนการนําเสนอตัวอยางการใชเมธอด Get เพื่อควบคุมการทํางานของขาพอรต GPIO ของบอรด Raspberry Pi 2 ผานเว็บบราวเซอร (1) ยังคงเชือมต ่ อบอรด Raspberry Pi 2 และอุปกรณตางๆ เขากับเครือขายตามรูปที่ 12-2 หรือ 12-3 (2) ใชวงจรในรูปที่ 12-16 ในการทดลอง (3) ทําการสรางไฟล PHP โดยใชโคดในโปรแกรมที่ 12-2


274Raspberry Pi 2   

<? if(isset($_GET["st_GPIO16"])) { system("gpio -g mode 16 out"); system("gpio -g write 16 ".$_GET["st_GPIO16"]); exec("gpio -g read 16",$st_LED1); echo("LED1=".$st_LED1[0]."<br>"); } if(isset($_GET["st_GPIO26"])) { system("gpio -g mode 26 out"); system("gpio -g write 26 ".$_GET["st_GPIO26"]); exec("gpio -g read 26",$st_LED2); echo("LED2=".$st_LED2[0]); } ?>

อธิบายคําสัง่ เปนคําสังที ่ ใช ่ ตรวจสอบการทํางานของคําสังที ่ ต่ องการใหดําเนินการ ใชกับคําสังที ่ ไม ่ ตองการ ผลลัพธ ขอดีคือ รูสถานะว  า คําสังที ่ ต่ องการทํางานไดหรือไม ถาดําเนินการสําเร็จ จะสงคาหมายเลข 0 กลับมา system

่ าหรับสังการให ่ คําสังที ่ ่ตองการทํางาน ใชกับคําสังที ่ ่ตองการผลลัพธมากกวา 1 คา exec เปนคําสังสํ โดยผลลัพธจะอยูในรู  ปแบบอะเรย ดังนันเมื ้ อใช ่ งานจะตองกําหนดขนาดของอะเรยดวย แมวาจะมีผลลัพธเพียง คาเดียวก็ตาม การทํางานของโปรแกรม มีลําดับดังนี้ (1) ตรวจสอบวามีขอมูลสงมาหรือไม (2) กําหนดการทํางานของขาพอรต GPIO16 ใหเปนเอาตพุต (3) กําหนดสถานะลอจิกของขาพอรต GPIO16 ตามขอมูลที่รับขามา (4) อานคาสถานะลอจิกของขาพอรต GPIO16 ณ ปจจุบัน (5) แสดงผล

โปรแกรมที่ 12-2 ไฟล Control_LED.php ทีใช ่ ควบคุมการทํางานของขาพอรต GPIO 16 และ 26 ของบอรด Raspberry Pi 2 ผานเว็บบราวเซอร


Raspberry Pi 2    275

(4) บันทึกเปนไฟลชือ่ Control_LED.php เก็บไวที่ var/www/ (5) จากนั้นไปที่คอมพิวเตอรที่ทําหนาทีเป ่ นเว็บไคลเอ็นต เปดเว็บบราวเซอรใหพิมพ IP แอดเดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี้) ตามดวยชือไฟล ่ ที่สรางและคาตางๆ เชน 192.168.137.243/Control_LED.php/?st_GPIO16=0&st_GPIO26=1 ดังรูปที่ 12-19 สังเกต การทํางานของ LED (6) ทดลองเปลี่ยนคาของ st_GPIO16 และ st_GPIO26 ไมใหเหมือนเดิม แลวสังเกต การทํางานของ LED

รูปที่ 12-19 แสดงการทํางานของไฟล Control_LED.php บนบอรด Raspberry Pi 2 ผานทางเว็บบราวเซอร


276Raspberry Pi 2   

12.11 การสั่งใหสคริปตของโปรแกรมภาษา Python ทํางานดวย PHP 12.11.1 กําหนดสิทธิให ์ แก PHP มีขั้นตอนดังนี้ (1) เริ่มดวยการใหสิทธิ์ PHP เพื่อสังให ่ สคริปตของโปรแกรมภาษา Python ทํางานได โดย เปด LXTerminal แลวพิมพคําสัง่ sudo nano /etc/sudoers เพื่อเขาไปเพิ่มสิทธิผู์ ใช  ดังรูป ที่ 12-20 แลวกด Enter

รูปที่ 12-20 (2) พิมพ

www-data ALL=(ALL) NOPASSWD: ALL ไวทายสุดของไฟล ดังรูปที่ 12-21

รูปที่ 12-21 (3) จากนั้นใหกด Ctrl และ x แลวกดคีย y เพื่อบันทึกไฟล ตามดวยการกด Enter จะเห็น ไดวา มีการกําหนดใหกลุม www-data เปนกลุมผูใชงานในระบบเทียบเทากับกลุมผูใชงานในระบบ ที่ชือว ่ า pi และ www-data เปนชือกลุ ่ มผูใช  งานในสวนของเว็บดวย


Raspberry Pi 2    277

12.11.2 ตัวอยางการทดสอบรันสคริปต Python ดวย PHP ในตัวอยางนี้เปนการอานคาจากโมดูลวัดความชืนและอุ ้ ณหภูมิ DHT11 ดวย Raspberry Pi 2 โดยสรางโปรแกรมภาษา Python ที่จะให PHP สั่งใหทํางาน โปรแกรมที่สรางขึ้นนั้นตองไมเปน โปรแกรมที่ทํางานแบบวนซํ้า เพราะจะทําใหเว็บเพจตองรอไปเรื่อยๆ จนกวาจะหมดเวลา (1) ตอวงจรดังรูปที่ 12-22 (2) เปดโปรแกรม Geany เพื่อเขียนโปรแกรมตามโปรแกรมที่ 12-3 (3) บันทึกไฟลเก็บไวที่ var/www/ โดยตังชื ้ ่อไฟลวา Read_DHT11.py Raspberry Pi 2 GPIO SDA1 -I2C SCL1 -I2C

+3.3V 1 GPIO2 3 GPIO3 5

2 +5V 4 +5V 6 GND

GPIO4 7 GND 9

8 GPIO14 TxD -UART0 10 GPIO15 RxD -UART0

GPIO17 11 GPIO27 13

12 GPIO18 PCM-CLOCK 14 GND

GPIO22 +3.3V MOSI -SPI0 GPIO10 MISO -SPI0 GPIO9

15 17 19 21

SCLK-SPI0 GPIO11 23 GND 25

16 18 20 22

GPIO23 GPIO24 GND GPIO25

24 GPIO8 26 GPIO7

ID_SDA 27 GPIO5 29

28 ID_SCL 30 GND

GPIO6 31 GPIO13 33

32 GPIO12 34 GND

GPIO19 35 GPIO26 37

36 GPIO16 38 GPIO20

GND 39

40 GPIO21

CE0 -SPI0 CE1-SPI0

ZX-DHT11 Humidity/Temperature sensor module +3.3V

Vcc

GND

GND

GPIO4

DATA

รูปที่ 12-22 วงจรเชื่อมตอ DHT11 โมดูลวัดความชืนสั ้ มพัทธและอุณหภูมิของบอรด Raspberry Pi 2 ผานพอรต GPIO เพืออ ่ านคาดวยโปรแกรมภาษา Python ซึงได ่ รับการสังการมาจาก ่ PHP


278Raspberry Pi 2   

import time import Adafruit_DHT Sensor = Adafruit_DHT.DHT11 GPIO = 4 humidity,temperature = Adafruit_DHT.read_retry(Sensor,GPIO) if humidity is not None and temperature is not None: print(temperature) print(humidity) else: print('Failed to get reading. Try again!')

การทํางานโปรแกรม อานคาจากโมดูล DHT11 แลวเก็บไวในตัวแปร humidity และ temperature จากนั้นทําการ ตรวจสอบวามีคาหรือไม ถามีใหแสดงผลอุณหภูมิกับความชืนในอากาศ ้ ถาไมมี ใหแสดงขอความวา Failed to get reading. Try again!

โปรแกรมที่ 12-3 ไฟล Read_DHT11.py เปนโปรแกรมภาษา Python สําหรับอานคาโมดูลวัดความชืน้ สัมพัทธและอุณหภูมิ DHT11 ดวยบอรด Raspberry Pi 2 ภายใตการควบคุมจาก PHP <? exec("sudo python3 /var/www/Read_DHT11.py",$DHT11); echo("Temp=".$DHT11[0]."*C”) ; echo("<br>Humidity=".$DHT11[1]."%") ; ?>

อธิบายคําสัง่ สังให ่ ไฟลที่ชื่อวา Read_DHT11.py ที่ถูกเก็บไวใน var/www/ ทํางานดวย Python3 แลวเก็บผลลัพทจากทํางานไวที่ในตัวทีชื่ ่อ วา $DHT11 echo(“Temp=”.$DHT11[0].”*C”) แสดงขอความโดยนําคาจากตัวแปร $DHT11 ชองแรก มาแสดงโดยถูกระบุบเปนคาอุณหภูมิ จากตัวอยาง Python เมือมี ่ คาจะทําการแสดงผลอุณหภูมิกอนแลวตาม ดวยคาความชื้น ดังนั้นคาในตัวแปร $DHT11[0] จึงเปน คาอุณหภูมิและ $DHT11[1] เปนคาความชื้น ตามลําดับ exec(“sudo python3 /var/www/Read_DHT11.py”,$DHT11);

โปรแกรมที่ 12-4 ไฟล Test_DHT11.php โปรแกรมภาษา PHP เพือควบคุ ่ มการทํางานของสคริปตโปรแกรม ภาษา Python ไฟล Test_DHT11.py (โปรแกรมที่ 12-3)


Raspberry Pi 2    279

(4) เขียนโปรแกรมภาษา PHP ตามโปรแกรมที่ 12-4 เก็บไวที่ var/www/ แลวตั้งชื่อวา Test_DHT11.php (5) ทําการทดสอบโดยไปที่คอมพิวเตอรที่ทําหนาทีเป ่ นเว็บไคลเอ็นต เปดเว็บบราวเซอร ใหพิมพ IP แอดเดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี้) ตามดวยชือไฟล ่ ที่สรางและ คาตางๆ เชน 192.168.137.243/Test_DHT11.php จะไดผลการทํางานดังรูปที่ 12-23

รูปที่ 12-23 หนาตางเว็บบราวเซอรแสดงเว็บเพจของการแสดงคาความชืนสั ้ มพัทธและอุณหภูมิทีพั่ ฒนา จากโปรแกรมภาษา PHP โดยอานขอมูลจากบอรด Raspberry Pi 2 ซึ่งเขียนโปรแกรมภาษา Python ในการติดตอกับตัวตรวจจับผานทางขาพอรต GPIO


280Raspberry Pi 2   

12.12 การทดลองควบคุมอุปกรณเอาตพุตอยางงาย ผานเว็บบราวเซอรโดยใช PHP และ HTML ถึงแมวาดวยคุณสมบัติของ PHP ที่ชวยใหการเปลี่ยนขอความและการตรวจสอบนั้นงาย ทวา การสรางเว็บเพจที่ใหผูใช  งานไดงายนั้น ยังตองอาศัยการพัฒนาโปรแกรมดวยภาษา HTML เพื่อให ผูพั ฒนาสามารถสรางปุมกดหรือเพิ่มชองกรอกขอความไดงายขึ้น ในหัวขอนี้นําเสนอตัวอยางการทดลองสรางสคริปตที่พัฒนาดวยภาษา PHP เพื่อสั่งงานโดย ตรงกับขาพอรต GPIO ของบอรด Raspberry Pi 2

12.12.1 ภาพรวมและขันตอนการทํ ้ างาน แสดงดวยไดอะแกรมในรูปที่ 12-24 สรุปเปนขั้นตอนไดดังนี้ (1) เว็บไคลเอนต (คอมพิวเตอร) รองขอเว็บเพจทีชื่ อว ่ า Control.php ผานทางเว็บบราวเซอร (Internet Explorer หรือ Google Chrome หรือ Mozila Firefox) มายังเว็บเซิรฟเวอร (บอรด Raspberry Pi 2) (2) ไฟลสคริปต Control.php จะทํางาน เพือสั ่ งให ่ พอรต GPIO ทํางานตามทีกํ่ าหนด (3) LED ที่ตอไวกับขาพอรต GPIO ของ Raspberry Pi 2 ทํางานตามขอมูลที่สงมา (4) เมือไฟล ่ สคริปต Control.php ทํางานเสร็จแลว จะสงเฉพาะเว็บเพจ HTML กลับไปยัง เว็บไคลเอนต

รูปที่12-24 ไดอะแกรมการทํางานของระบบควบคุมอุปกรณเอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML


Raspberry Pi 2    281

+

a b c d e

f g h

i

j

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

19

21

1

20

30

29

28

27

26

25

24

22

j

21

i

23

f g h

22

b c d e

A

23 24 25 26 27 28 29 30

+

K

K

GND GND +3.3V +5V SDA1 SCL1 GPIO4 TxD0 RxD0 GPIO17 GPIO18 GPIO27 GPIO22 GPIO23 GPIO24 GPIO10 GPIO9 GPIO25 GPIO11 GPIO8 GPIO7 GPIO5 GPIO6 GPIO12 GPIO13 GPIO19 GPIO16 GPIO26 GPIO20 GPIO21 GND +3.3V ID_SDA ID_SCL GND

1k

Rpi-I/O40

รูปที่ 12-25 วงจรทดลองทีต่ อเขากับพอรต GPIO ของบอรด Raspberry Pi 2 เพื่อแสดงผลการทํางาน ของระบบควบคุมอุปกรณเอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML


282Raspberry Pi 2   

12.12.2 ขันตอนการทดลอง ้ (1) ตอวงจรตามรูปที่ 12-25 ใหกับพอรต GPIO ของ บอรด Raspberry Pi 2 (2) สรางไฟลสคริปตดวยภาษา PHP โดยเปดโปรแกรม Geany เลือกไปที่ File > New(with_Template) > file.php พิมพคําสัง่ PHP ดังโปรแกรมที่ 12-4 สคริปตนีเป ้ นการรับสงขอมูลผานเว็บ เพจ โดยใชเมธอด Post ในการรับสงขอมูลระหวางเว็บเพจ สังเกตไดจากคําสัง่ <form method="post ่ นตัวกําหนดวา form นันใช ้ เมธอดใดในการรับสงขอมูล "> ซึงเป <?php system("gpio -g mode 16 out"); system("gpio -g mode 26 out"); exec ("gpio -g read 16", $st_LED1); exec ("gpio -g read 26", $st_LED2); $st_post=0; if (isset($_POST['LED1'])) { $st_post=1; if ($st_LED1[0]==0){system(“gpio -g write 16 1”);} else{system("gpio -g write 16 0");} } if (isset($_POST['LED2'])) { $st_post=1; if ($st_LED2[0]==0){system(“gpio -g write 26 1”);} else{system("gpio -g write 26 0");} } exec ("gpio -g read 16", $st_LED1); exec ("gpio -g read 26", $st_LED2); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml” xml:lang="en" lang="en"> <head> <title>Control</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content="Geany 1.22" /> </head> <body> LED1=GPIO16<br> LED2=GPIO26<br> <form method="post">

โปรแกรมที่ 12-4 ไฟล Control.php สคริปตภาษา PHP สําหรับติดตังลงในเว็ ้ บเซิรฟเวอร (บอรด Raspberry Pi 2) เพือรั ่ บขอมูลสําหรับควบคุมอุปกรณเอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML (มีตอ)


Raspberry Pi 2    283

<table style="width:50%;"> <tbody> <tr> <td>Cilck LED </td> <td>LED Stetus </td> </tr> <tr> <td> <button name="LED1"> <?php if ($st_LED1[0]==0){echo "LED1 On";} else{echo "LED1 Off";} ?> </button> </td> <td> <?php if ($st_LED1[0]==0){echo "LED1 OFF";} else{echo "LED1 ON";} ?> </td> </tr> <tr> <td> <button name=”LED2"> <?php if ($st_LED2[0]==0){echo "LED2 On";} else{echo "LED2 Off";} ?> </button> </td> <td> <?php if ($st_LED2[0]==0){echo "LED2 OFF";} else{echo "LED2 ON";} ?> </td> </tr> </tbody> </table> </form> </body> <?php if ($st_post==1){echo"<script>window.location='Control.php'</script>";} ?> </html>

โปรแกรมที่ 12-4 ไฟล Control.php สคริปตภาษา PHP สําหรับติดตังลงในเว็ ้ บเซิรฟเวอร (บอรด Raspberry Pi 2) เพือรั ่ บขอมูลสําหรับควบคุมอุปกรณเอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML (จบ)


284Raspberry Pi 2   

(3) บันทึกไฟลชือ่ Control.php เก็บไวที่ /var/www/ (4) จากนันทํ ้ าการทดสอบการทํางานของสคริปต โดยไปทีคอมพิ ่ วเตอรทีทํ่ าหนาทีเป ่ นเว็บ ไคลเอ็นต เปดเว็บบราวเซอรใหพิมพ IP แอดเดรสของ Raspberry Pi 2 (ไดมาจากหัวขอกอนหนานี้) ตามดวยชือไฟล ่ ที่สรางและคาตางๆ เชน 192.168.137.243/Control.php จะไดผลการทํางาน เปนหนาเว็บ (เว็บเพจ) ดังรูปที่ 12-26 (5) คลิกปุม LED1 on สถานะ LED1 จาก OFF จะเปลี่ยนเปน ON ทําให LED ที่ตอกับ ขาพอรต GPIO16 ติดสวาง และปุม LED1 จะเปลี่ยนเปน LED1 off หากคลิกปุมเดิมอีกครั้ง LED ที่ติดอยูจะดับลง

รูปที่ 12-26 เว็บบราวเซอรแสดงเว็บเพจสําหรับควบคุมการทํางานของอุปกรณเอาตพุตผานโดยใช PHP และ HTML


Raspberry Pi 2    285

12.13 การทดลองติดตออุปกรณอินพุตเอาตพุตผานเว็บบราวเซอร ทํางานรวมกับไฟลสคริปต Python อยางงาย การติดตอเพื่อควบคุมอุปกรณผานเครือขายของบอรด Raspberry Pi 2 นอกจากการใชไฟล สคริปตที่พัฒนาขึ้นดวยภาษา PHP ทํางานรวมกับ HTML แลว ยังมีอีกแนวทางหนึ่งที่ขอนําเสนอใน หัวขอนี้ นั่นคือ การใชไฟลสคริปตที่พัฒนาดวยภาษา Python ทํางานรวมกับเว็บบราวเซอรและไฟล สคริปตที่พัฒนาดวยภาษา PHP เพื่อติดตอกับอุปกรณอินพุตเอาตพุตที่ตอกับพอรต GPIO ของบอรด Raspberry Pi 2 ซึ่งไดรับการกําหนดใหทํางานเปนเว็บเซิรฟเวอร

12.13.1 ภาพรวมและขันตอนการทํ ้ างาน ในรูปที่ 12-27 แสดงไดอะแกรมการทํางานในภาพรวมของการติดตออุปกรณอินพุตเอาตพุต ผานเว็บบราวเซอรซึ่งทํางานรวมกับไฟลสคริปต Python สรุปขั้นตอนการทํางานไดดังนี้

รูปที่ 12-27 ไดอะแกรมการทํางานของระบบควบคุมผานเครือขายทีใช ่ บอรด Rasperry Pi 2 เปนเว็บ เซิรฟเวอร โดยมีการเชือมต ่ อกับอุปกรณอินพุตเอาตพุตทีต่ องการอานคาและสังการผ ่ านพอรต GPIO


286Raspberry Pi 2   

(1) การทํางานของไฟลสคริปต PHP (1.1) เว็บไคลเอ็นต (คอมพิวเตอร) รองขอเว็บเพจที่ชือว ่ า MonitorSet.php ผานทางเว็บ บราวเซอรไปยังเว็บเซิรฟเวอร (บอรด Raspberry Pi 2) (1.2) ไฟลสคริปต MonitorSet.php ทํางาน (1.3) อานไฟล BH1750.txt เพื่อนําคามาแสดงผล (1.4) บันทึกคาลงบนไฟล set.txt ในกรณีที่ตองการตั้งคาใหม (1.5) เมือไฟล ่ สคริปต MonitorSet.php ทํางานเสร็จแลว จะสงเฉพาะเว็บเพจ HTML กลับ ไปยังเว็บไคลเอนต (2) การทํางานของไฟลสคริปต Python (2.1) ทําการเอ็กซิคิวตหรือสั่งใหไฟลสคริปตที่ชือว ่ า LightLoggerWebData.py ทํางาน (2.2) อานไฟล set.txt เพื่อกําหนดการแจงเตือน (2.3) อานคาจากตัวตรวจจับและวัดคาความเขมของแสงในหนวยลักซ (lux) (2.4) บันทึกคาทีได ่ จากตัวตรวจจับแสงลงในไฟล BH1750.txt (2.5) สงสัญญาณออกขา GPIO18 เพื่อแจงเตือน ในตัวอยางการทดลองที่จะไดเรียนรูไปพรอมกันนี้ ใชไฟล set.txt เปนตัวกลางในการติดตอ สื่อสารระหวาง สคริปตที่ใชแสดงเปนหนาเว็บ กับสคริปต Python ที่ควบคุมอุปกรณ

12.13.2 ขันตอนการทดลอง ้ (1) ตอวงจรตามรูปที่ 12-28 โดยตอกับบอรด Raspberry Pi 2 ผานทางพอรต GPIO วงจรทดลอง ทีต่ อเขากับพอรต GPIO ของบอรด Raspberry Pi 2 เพือแสดงผลการทํ ่ างานของระบบควบคุมอุปกรณ เอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ HTML (2) ทีบอร ่ ด Rasberry Pi 2 ทําการเปดโปรแกรม Geany เพือนํ ่ าไปสรางสคริปตไฟล Python แลว ตังชื ้ อว ่ า LightLoggerWebData.py (3) ทําการบันทึกไฟล (4) ลําดับตอไปสรางเท็กซไฟล (ไฟล .txt) กําหนดใหมีชือว ่ า set.txt สําหรับรับขอมูลเฉพาะ คาตัวเลขเขามา บันทึกไวในไดเร็กตอรี่ /var/www/


Raspberry Pi 2    287

รูปที่ 12-28 วงจรทดลองทีต่ อเขากับพอรต GPIO ของบอรด Raspberry Pi 2 เพือติ ่ ดตอกับอุปกรณอินพุต เอาตพุตอยางงายผานเว็บบราวเซอรโดยใช PHP และ Python (6) สรางไฟลสคริปต PHP เพื่อแสดงหนาเว็บเพจ (6.1) เปดโปรแกรม Geany สรางไฟลสคริปต PHP โดยไปที่ File>>New(with_Template)>>file.php แลวตั้งชื่อวา MonitorSet.php (6.2) เพิ่มสคริปต PHP และ javascript ดังโปรแกรมที่ 12-6


288Raspberry Pi 2   

import RPi.GPIO as GPIO import time import smbus import datetime GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) blink = GPIO.PWM(18,500) st=0 blink.start(0) bus = smbus.SMBus(1) #(512MB) addr = 0x23 # i2c adress dataset=50 while True: try: f=open('/var/www/set.txt','r') dataset=float(f.read()) except: pass date=datetime.datetime.now() microsec=date.microsecond if microsec > 700000: blink.ChangeDutyCycle(st) else: blink.ChangeDutyCycle(0) data = bus.read_i2c_block_data(addr,0x11) lum=(data[1] + (data[0]<<8) / 1.2) with open("/var/www/BH1750.txt", "w") as text_file: text_file.write("DateTime: %s<br>Luminosity: %.2f lx<br>" % (date,lum,)) if lum<dataset: st=50 else: st=0 time.sleep(0.2)

โปรแกรมที่ 12-5 ไฟล LightLoggerWebData.py เปนโปรแกรมภาษา Python สําหรับติดตอกับบอรด Raspberry Pi 2 ผานทางพอรต GPIO เพื่ออานคาแสงกลับไปแสดงผลและรับขอมูลเพื่อนําไปขับเสียง ออกลําโพงเปยโซ


Raspberry Pi 2    289

<?php if ((isset($_POST[‘textbox’]))&($_POST[‘textbox’]!="")) { $fp=fopen(‘set.txt’,’w’); fwrite($fp,$_POST[‘textbox’]); fclose($fp); } $frp=fopen(‘set.txt’,’r’); $rdata=fgets($frp); fclose($frp); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>MonitorSet</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content=”Geany 1.22" /> <script language="JavaScript" type="text/javascript"> var rFile; function Call() { if(rFile.readyState == 4) //

ตรวจสอบวา จบการทํางานหรือไม

{ if(rFile.status==200)

//

ตรวจสอบวา เชือมต ่ อกับเซิรฟเวอรไดหรือไม

{

นําคาทีส่ งกลับมา เก็บไวในตัวแปร ตรวจสอบวา มีขอความหรือไม

var allText = rFile.responseText; // if(allText!="")

//

{ document.getElementById("myDiv").innerHTML = allText; //

แสดงขอความทีได ่

} setTimeout("readTextFile()",500); //

ออโตรีเฟรชทุกๆ 0.5 วินาที

} } }

โปรแกรมที่ 12-6 ไฟล MonitorSet.php เปนไฟลสคริปต PHP สําหรับสรางเว็บเพจของเว็บเซิรฟเวอร (บอรด Raspberry Pi 2) เพือแสดงค ่ าและสังการอุ ่ ปกรณอินพุตเอาตพุตผานเว็บบราวเซอร (มีตอ)


290Raspberry Pi 2   

function readTextFile() { rFile = new XMLHttpRequest(); // สราง object rFile.open("GET","BH1750.txt",true); //

เปดการติดตอไฟล

BH1750.txt

XMLHttpRequest

กับเว็บเซิรฟเวอร

rFile.onreadystatechange = Call; //

เรียกใชฟงกชัน่

เมือมี ่ การเปลียนแปลงสถานะการทํ ่ างาน // ทําการสงขอมูล

Call

rFile.send(null); }; </script> </head>

<body onload="readTextFile()"> <form method="post"> <div id="myDiv"></div> <? echo "Set Alarm = ".$rdata." lx <br>"?> <tr> Set Alarm: <td><input type="text" name="textbox" ></td> <td><button name="OK">OK</button></td> </tr> </form> </body> </html>

การทํางานของโปรแกรม ในกรณีเมือกดปุ ่ ม OK รับคาจาก Textbox ดวยตัวแปร $_POST[‘textbox’] จะทําการตรวจสอบวา มีคาหรือไม ถามีจะบันทึกลงในไฟล set.txt จากนันอ ้ านคาจากไฟล set.txt เก็บไวในตัวแปร $rdata เพือนํ ่ าไป แสดงผล สวนสคริปต javascript ทําหนาที่อานขอมูลทุกๆ 0.5 วินาทีจากไฟล HB1750.txt มาแสดงผลอยาง ตอเนื่อง โดยไมตองรีเฟรชหนาเว็บเอง หรือเรียกอีกอยางคือออโตรีเฟรช (auto refresh) และยังทํางานอืนได ่ โดยไมตองรอ เรียกกระบวนการทํางานแบบนี้วา AJAX (Asynchronous JavaScript and XML) สําหรับไฟล HB1750.txt จะถูกสรางขึนเมื ้ อสั ่ ่งใหสคริปต LightLoggerWebData.py ทํางาน

โปรแกรมที่ 12-6 ไฟล MonitorSet.php เปนไฟลสคริปต PHP สําหรับสรางเว็บเพจของเว็บเซิรฟเวอร (บอรด Raspberry Pi 2) เพือแสดงค ่ าและสังการอุ ่ ปกรณอินพุตเอาตพุตผานเว็บบราวเซอร (จบ)


Raspberry Pi 2    291

รูปที่ 12-29 เว็บบราวเซอรแสดงเว็บเพจสําหรับอานคาและกําหนดการทํางานของอุปกรณอินพุตเอาตพุต ผานพอรต GPIO ของบอรด Raspberry Pi 2 ซึงทํ ่ าหนาทีเป ่ นเว็บเซิรฟเวอรโดยใช PHP และไฟลสคริปต ทีพั่ ฒนาจากโปรแกรมภาษา Python

12.13.33 การทดสอบ (1) เริ่มตนดวยการเอ็กซิคิวตไฟลสคริปตที่ชือ่ LightLoggerWebData.py กอน (2) ไปทีคอมพิ ่ วเตอรทีทํ่ าหนาทีเป ่ นเว็บไคลเอ็นต เปดเว็บบราวเซอรใหพิมพ IP แอดเดรสของ Raspberry Pi 2 ตามดวยชือไฟล ่ ทีสร ่ างและคาตางๆ เชน 192.168.137.243/MonitorSet.php จะแสดงเว็บเพจดังรูปที่ 12-29 จากการทดสอบพบวา ใช Google Chrome จะทํางานไดสมบูรณทีสุ่ ด (3) ใชมือบังแสงที่ตกกระทบโมดูลตรวจจับแสง BH1750 เพื่อทําใหวัดคาความเขมแสง ไดนอยกวา 50 จะทําใหบอรด Raspberry Pi 2 ขับสัญญาณเสียงเตือนใหดังขึ้นผานลําโพงเปยโซ (4) ผูทดลองสามารถตั  งค ้ าแจงเตือนใหมได โดยกรอกคาลงในชอง SetAlarm แลวกดปุม OK คาทีกํ่ าหนดใหมจะถูกเก็บไวในไฟล sex.txt ในไดเร็กตอรี่ /var/www ทังหมดที ้ นํ่ าเสนอในบทนีเป ้ นตัวอยางการพัฒนาระบบควบคุมผานเครือขายอยางงายกับบอรด Raspberry Pi 2 ซึงกํ ่ าหนดใหทําหนาทีเป ่ นเว็บเซิรฟเวอรมีการติดตอกับอุปกรณอินพุตเอาตพุตผานพอรต GPIO หากการควบคุมอุปกรณไมซับซอนมากนัก การใชไฟลสคริปต PHP ทํางานรวมกับ HTML จะเปน ทางเลือกทีใช ่ ได เมือมี ่ ความตองการติดตออุปกรณอินพุตเอาตพุตทีซั่ บซอนขึน้ การพัฒนาโปรแกรมดวย Python จะตอบสนองไดดีกวา เมือผู ่ พั ฒนามีความเขาใจในการทํางานโดยรวมของระบบแลว ก็สามารถ ตอยอดเพือพั ่ ฒนาเว็บเพจของเว็บเซิรฟเวอรใหมีหนาตาทีสวยงามขึ ่ นได ้ หากแตตองมีความเขาใจในขอ จํากัดดานทรัพยากรของบอรด Raspberry Pi 2 ดวย เพือป ่ องกันไมใหการทํางานโดยรวมชาเกินไป



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.