Raspberry Pi 3 [Temperature & Humidity Data Chart]

จากตอนที่แล้ว เราได้เขียนคำสั่งเพื่อที่จะดึงค่าจากเซนเซอร์แล้ว ครั้งนี้จะเป็นการใช้วิธีดังค่าดังกล่าว มาเก็บไว้เป็นไฟล์ csv จากนั้นนำไปแสดงเป็นกราฟ โดยแสดงผลผ่าน Web Interface ด้วยวิธีดังต่อไปนี้ครับ   สร้างที่เก็บไฟล์ด้วยคำสั่งต่อไปนี้ mkdir –p /home/pi/projects/temp–and–humidity mkdir –p /home/pi/projects/temp–and–humidity/sensor–values cd /home/pi/projects/temp–and–humidity (หากใครไม่ต้องการสร้าง directory เพื่อเก็บข้อมูลตามตัวอย่างนี้ ให้แก้ไฟล์ temp_hud_csv_log.py ด้วยครับ) จากนั้นดาวน์โหลดสคริปด้วยคำสั่งนี้ wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/temp_hud_csv_log.txt mv temp_hud_csv_log.txt temp_hud_csv_log.py (เนื่องจาก sysadmin นี้ไม่รองรับการอัพโหลดไฟล์ .py จึงต้องอัพโหลดเป็น .txt ไปก่อน แล้วค่อยเอามา rename เอาเอง)   ตรวจสอบและติดตั้ง dependencies ด้วยคำสั่งนี้ sudo easy_install apscheduler และรอจนเสร็จ          โดยค่า default สคริปนี้จะถูกเซ็ตให้เป็นเซนเซอร์ AM2302 และใช้ GPIO 4 ซึ่งถ้าหากเราใช้เซนเซอร์และขาคนละขากัน ให้เข้าไปแก้ไฟล์ temp_hud_csv_log.py จากนั้นเริ่มต้นการทำงานด้วยคำสั่ง sudo python temp_hud_csv_log.py รอซัก 2-3 นาที เราจะเห็นว่ามีไฟล์เกิดขึ้นใน sub folder ชื่อ sensor-values   ต่อไปเราจะทำการอ่านค่าใน csv files ไปแสดงผลเป็นกราฟด้วย NVD3 charts for d3.js ใช้งานร่วมกับ node.js JavaScript ซึ่งรวมเว็บเซอร์เวอร์ node.js Express เอาไว้ในตัว (ซึ่ง node.js ได้ถูกติดตั้งเป็น official ใน raspberry pi image os file ซึ่งสามารถเช็คเวอร์ชั่นได้จากคำสั่ง node –version)   ทำการดาวน์โหลด html file ใส่ไว้ในโฟลเดอร์ย่อย public ด้วยคำสั่งต่อไปนี้ mkdir –p /home/pi/projects/temp–and–humidity/public cd /home/pi/projects/temp–and–humidity/public wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/index.txt mv index.txt index.html ท่านสามารถแก้ไขไฟล์ index.html ได้ ไม่ว่าจะเป็น Title, DateTime Format, สีตัวอักษร, สีพื้นหลัง และอื่นๆ ได้เลย   จากนั้นติดตั้ง node.js script ด้วยคำสั่งต่อไปนี้ cd /home/pi/projects/temp–and–humidity wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/nodejs_webserver_soapws.txt mv nodejs_webserver_soapws.txt nodejs_webserver_soapws.js   และทำการติดตั้ง dependencies ของ node.js ด้วยคำสั่งต่อไปนี้ npm install express npm install body–parser npm install csv–parse@1.1.0 npm install glob ** ถ้ามีปัญหาในการเรียก npm เช่น command not found. ให้ติดตั้งด้วยคำสั่ง sudo apt-get install npm ได้เลย **  ** เป็นการติดตั้งใน home folder ของตัวเอง เพราะงั้นไม่ต้องใช้ sudo นำหน้า npm ครับ ** ** csv-parse ผมใช้เป็นเวอร์ชั่น 1.1.0 เนื่องจากเวอร์ชั่นใหม่ ลองคอมไพล์แล้วไม่ผ่าน **   เมื่อเรียบร้อยแล้วลอง start web server service ด้วยคำสั่ง sudo node nodejs–webserver–with–soap–services.js และลองเปิดเว็บด้วย http://[ไอพีของ

Read More »

Raspberry Pi 3 [Temperature & Humidity Sensor]

สวัสดีและขออภัยที่ห่างหายไป เนื่องจากติดภารกิจทั้งงานราษฏร์และงานหลวงครับ   ครั้งนี้จะเป็นการเริ่มต่อเซนเซอร์ภายนอก เซนเซอร์พื้นฐานที่มีในปัจจุบันก็จะเป็นเซนเซอร์เกี่ยวกับสภาพแวดล้อม ไม่ว่าจะเป็น เซนเซอร์อุณหภูมิ, เซนเซอร์ความชื้นในอากาศ, เซนเซอร์ความชื้นในดิน, เซนเซอร์น้ำ (ทำงานเมื่อมีน้ำมาสัมผัสเซนเซอร์ – ใช้ตรวจเช็คฝนตก), เซนเซอร์แสง (สวิตซ์), เซนเซอร์ความเข้มแสง, เซนเซอร์วัด pH, เซนเซอร์ UV, เซนเซอร์วัดฝุ่นละอองในอากาศ, เซนเซอร์วัดความชื้นในดิน, เซนเซอร์วัดแรงสั่นสะเทือน และเซนเซอร์อื่นๆ อีกมากมาย ซึ่งหลักการทำงานนั้นส่วนใหญ่จะเหมือนกันหมด คือการอ่านค่ามาจากเซนเซอร์ และนำค่านั้นมาแปรผลที่เราสามารถอ่านได้ง่าย   บทความนี้จะเริ่มด้วยเซนเซอร์ที่ Basic ที่สุด เพื่อให้ทุกท่านพอจะได้เห็นหลักการทำงานและเป็นแนวทางในการเชื่อมต่อเซนเซอร์อ่นๆ ต่อไปครับ นั่นคือ เซนเซอร์วัดอุณหภูมิและความชื้น AM2302 (DHT22) นั่นเอง โดยจะมี Pinout ดังนี้ (จากซ้ายบน คือขาที่ 1) ขาที่ 1 คือ VCC รองรับ 3.6-6V ขาที่ 2 คือ Data ขาที่ 3 คือ NC (Normal Close) ขาที่ 4 คือ GND เราจะต้องทำการต่อ R (Resistor) ด้วย 4.7KOhm ระหว่างขา Data และ VCC ไว้เพื่อป้องกันการรับ/ส่ง ข้อมูลผิดพลาด ดังรูปนี้ ซึ่งถ้าเกิดเราเอามาต่อกันภายนอก จะทำให้เกิดความไม่สวยงามแยะยุ่งยาก จึงขอแนะนำเป็นอุปกรณ์ที่ Built-In R ลงในบอร์ดเลย ดังตามที่กำลังจะนำเสนอให้ดูนี้ จากนั้นเราทำการต่อสาย ซึ่งผมใช้ Jump Wire ตัวเมียทั้งสองฝั่ง เพื่อสะดวกในการต่อเข้ากับ GPIO ของ Raspberry Pi และเพื่ออนาคตสามารถปรับเปลี่ยนได้ง่าย ** เนื่องจากมีแค่ 3 เส้น จึงไม่ได้เน้นว่ามีแดงต้องเป็น +5V, สีดำต้องเป็น GND แค่เสียบให้ถูกทั้งต้นและปลาย ก็พอแล้วครับ **   จากนั้นทำการเสียบเข้าบอร์ด โดยดูจาก Diagram และผมเลือกต่อเข้าช่อง GPIO 4 (ขาที่ 7 – สายสีแดง ในรูป) ทำการประกอบลง Enclosure (ไม่จำเป็น) เพื่อความเป็นระเบียบเรียบร้อยเท่าที่จะทำได้ จากนั้นทำการต่อสายและ Boot เครื่องครับ   จากนั้นมาในส่วนของโปรแกรมกันครับ เริ่มทำการเขียน Python อย่างง่าย เพื่อที่จะดึงค่าอุณหภูมิและความชื้นมาแสดงบนหน้าจอ ดังนี้ครับ   ทำการอัพเดทระบบด้วยคำสั่ง sudo apt-get update -y   จากนั้นติดตั้ง dependency ที่ต้องใช้ด้วยคำสั่ง sudo apt–get install –y build–essential python–dev git (ถ้าใครติดตั้งมาก่อนในบทความก่อนหน้านี้ ก็ผ่านไปได้เลยครับ) จากนั้นทำการติดตั้ง Library จาก Adafruit (เพื่อที่เราจะได้ไม่ต้องเขียน GPIO Connection เอง ซึ่งยุ่งยาก) ด้วยคำสั่งต่อไปนี้ครับ mkdir –p /home/pi/sources cd /home/pi/sources git clone https://github.com/adafruit/Adafruit_Python_DHT.git cd Adafruit_Python_DHT sudo python setup.py install        รอจนเสร็จเรียบร้อย   จากนั้นทดลองเรียกค่าจากเซนเซอร์ด้วยคำสั่ง sudo /home/pi/sources/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 4 โดย 2302 คือ ชนิดของเซนเซอร์และ 4 คือ GPIO ID (ดูจาก Pinout ของ Raspberry Pi และไม่ใช่เลขขานะครับ) ก็จะได้ค่ามาดังรูป ตามตัวอย่างด้านบนนี้ เป็นการใช้ Python Example

Read More »

GET STRING FROM ENUM

เพื่อนๆนักพัฒนาหลายคนก็คงจะรู้จัก enum กันพอสมควรแล้วนะคะ วันนี้เรามาทำความรู้จักเจ้า Enum กันให้มากขึ้นกว่าเดิมกันดีกว่านะคะ ว่านอกจากเราจะดึงค่า Integer ที่เก็บค่าในตัวแปร หรือ Tostring() เป็นค่าstring ตามชื่อของตัวแปร Enum แล้ว เรายังสามารถ ดึงค่า  String  เป็นประโยคยาวๆได้โดยที่ไม่จำเป็นต้องเหมือนกับชื่อตัวแปรแล้วนะคะ เอาล่ะค่ะ เรามาเริ่มจากการทำความรู้จักเจ้าตัว Enum กันตั้งแต่เริ่มต้นเพื่อระลึกความจำกันก่อนละกันนะคะ ^^ Enumeration จะมีชนิดเป็น integer type ซึ่ง เราสามารถกำหนดกลุ่มของข้อมูลได้ (User-defined) ในการสร้าง enumeration เราจะใช้ keyword คำว่า  enum  ดังนี้ public enum Colors {   White,   Black,   Red,   Green,   Blue } ในตัวอย่างนี้สร้าง enum ที่ชื่อว่า Colors โดยมีสมาชิกอยู่ 5 สมาชิกคือ White,Black,Red,Green,Blue โดยสมาชิกต่างๆของ enum ถ้าเราไม่ได้กำหนดค่าเริ่มต้นจะมีค่าเริ่มต้นจาก 0 ดังนี้ white = 0 Black =1 Red =2 Green=3 Blue=4 ในการเรียกใช้งาน enum Colors  c = Colors.Green; //สร้างตัวแปร c ขึ้นมาเพื่อเรียกใช้สมาชิกที่ชื่อ Green ตัวอย่าง enum   using System; public enum Colors {     White,     Black,     Red,     Green,     Blue } public class TestEnum {     public static void Main()     {         Colors c = Colors.Blue;         Console.WriteLine(c);         Console.ReadLine();     } } ผลลัพธ์จะแสดง Blue จากตัวอย่างนี้ถ้าต้องการให้แสดงเป็น integer type   เราก็เขียนได้ดังนี้ Console.WriteLine((int)c); ผลลัพธ์จะได้ 4 เราสามารถกำหนดค่าให้กับสมาชิกของ  enum ได้ดังนี้   public enum Colors {   Red = 10,   Green =20,   Blue=30 } ตัวอย่าง   using System; public enum Colors {   Red = 10,   Green =20,   Blue=30 } public class TestEnum {     public static void Main()     {         Colors c = Colors.Green;         Console.WriteLine((int)c);         Console.ReadLine();     } } ผลลัพธ์จะได้ 20 นอกจากนี้สามารถเขียนรับค่า value

Read More »

Configuration of TCP/IP with SSL and TLS for Database Connections

สิ่งที่ต้องเตรียม Oracle Database Server ในตัวอย่างนี้ใช้ Oracle database บน Oracle Enterprise Linux 7 Oracle Database Client  ในตัวอย่างใช้ Windows Server 2008 R2 เริ่ม ฝั่ง Server เข้าระบบด้วยบัญชีผู้ใช้ oracle หรือบัญชีที่เป็นเจ้าของ Oracle Database เปิด terminal สร้าง Oracle Wallet ด้วยคำสั่ง mkdir -p /u01/app/oracle/wallet ต่อด้วย orapki wallet create -wallet “/u01/app/oracle/wallet” -pwd WalletPasswd123 -auto_login_local โดย -pwd WalletPasswd123 ตัว WalletPasswd123 คือรหัสผ่านที่ใช้ป้องกันการเข้าถึงข้อมูลต่างๆ ใน wallet กฎการตั้งมีอยู่คือ ยาวอย่างน้อย 8 ตัวอักษร ไม่จำกัดความยาว จำเป็นต้องตั้งให้ตัวเลขผสมตัวอักษร สร้าง Certificate และใส่เข้าไปใน wallet ด้วยคำสั่ง orapki wallet add -wallet “/u01/app/oracle/wallet” -pwd WalletPasswd123 \ -dn “CN=`hostname`” -keysize 1024 -self_signed -validity 3650 ตรวจสอบด้วยคำสั่ง orapki wallet display -wallet “/u01/app/oracle/wallet” -pwd WalletPasswd123 ได้ผลลัพธ์ประมาณ Oracle PKI Tool : Version 12.1.0.2 Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. Requested Certificates: User Certificates: Subject: CN=reis.psu.ac.th Trusted Certificates: Subject: CN=reis.psu.ac.th Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Client ด้วยคำสั่ง orapki wallet export -wallet “/u01/app/oracle/wallet” -pwd WalletPasswd123 \ -dn “CN=`hostname`” -cert /tmp/server-certificate.crt ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง cat /tmp/server-certificate.crt ได้ผลลัพธ์ประมาณว่า —–BEGIN CERTIFICATE—– MIIBoTCCAQoCAQAwDQYJKoZIhvcNAQEEBQAwGTEXMBUGA1UEAxMOcmVpcy5wc3UuYWMudGgwHhcN MTgwMTA5MDcyNTA2WhcNMjgwMTA3MDcyNTA2WjAZMRcwFQYDVQQDEw5yZWlzLnBzdS5hYy50aDCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAj4x2/NviDaTlXuEJt0kZARY5fHiT2SiVX+a18hai I0stoUhKKefjOCgB85iuqjIk0rvcGXI0KXkbenTy2t40A+qGxB04mBhCLKaKeIe67BZKR6Zyw1dd oaesoaWChC01b+IW1X5WWtC53UxpIZQ4Zktj41sLGUnarIr9+9HFwncCAwEAATANBgkqhkiG9w0B AQQFAAOBgQAqSCF2Y8uyM4rSQHUC8MKEl3Ia3NJKnigMOUzDc2fP7grSaoeuQ4NvIntTD+s+IT5Y EpLVND4kSHFTwGRq0Py/ig8ybXZCXfHtvNZh7ZGziL/sYt5/8xYi/tOBKwVanBTUaseKIMovtmd7 UyoOKrX8YBoFsB3UPRLudmFsksXRXw== —–END CERTIFICATE—– ฝั่ง Client เข้าระบบด้วยบัญชีผู้ใช้ administrator เปิด cmd แล้วสร้าง wallet ด้วยคำสั่ง mkdir c:\app\oracle\wallet สร้าง Certificate ด้วยคำสั่ง orapki wallet add -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123 -dn “CN=%computername%” -keysize 1024 -self_signed -validity 3650 โดย WalletPasswd123 คือพาสเวิร์ดที่ใช้ล็อค wallet ไม่จำเป็นต้องเหมือนกับของ Server ตรวจสอบด้วยคำสั่ง orapki wallet display -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123 ได้ผลลัพธ์ประมาณว่า Oracle PKI Tool : Version

Read More »

Raspberry Pi 3 [LCD Text Display with Python]

จากตอนที่แล้ว เราทำการเชื่อมต่อจอ LCD 16×2 และเขียน Basic Python ให้สามารถแสดงข้อความง่ายๆ ได้แล้ว ตอนนี้เราจะลองนำค่าที่อยู่ในตัว Raspberry Pi 3 มาแสดง เช่น Date & Time Network Adapter IP Address CPU Percentage Usage CPU Temperature Memory Total Memory Usage Memory Free Disk Total Disk Usage Disk Free เป็นต้น   ** ส่วนตัวผมจะถนัดใช้ nano เป็น text editor นะครับ ส่วนท่านอื่นที่ไม่คล่อง จะใช้ผ่าน vi หรือ text editor บน gui ก็ไม่ว่ากันครับ ** ** ไฟล์ทั้งหมดผม mkdir LCD เอาไว้บน home directory ของ user: pi ครับ ** ซึ่งดาวน์โหลดตัวอย่าง ได้ที่นี่ จากนั้นนำไฟล์ RPi_LCD_Driver.py (จากตอนที่แล้ว) วางไว้ที่ directory เดียวกัน   การแสดงวัน/เวลาบนหน้าจอ ใช้คำสั่งเพื่อสร้างไฟล์ sudo nano show_dt.py จากนั้นเขียนโค้ดตามด้านล่างนี้ครับ   import RPi_I2C_Driver from datetime import datetime mylcd = RPi_I2C_Driver.lcd() while True:     mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%d/%m/%Y”), 1)     mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%H:%M:%S.%f”), 2)   while True เนื่องจากต้องการให้รันแบบ infinite loop แสดงวันเวลาโดยที่ %d แสดงวันที่ %m แสดงเดือน %Y แสดงปี ค.ศ. %H แสดงหลักชั่วโมง %M แสดงหลักนาที %S แสดงหลักวินาที %f แสดง milli-seconds   เมื่อทดลองรันด้วยคำสั่ง sudo python show_dt.py หน้าจอ LCD จะแสดงดังตัวอย่างข้างล่างนี้ หลัก milli-seconds จะวิ่งเร็วมากจนหน้าจอแสดงไม่ทัน จากนั้นท่านจะเห็นว่าไม่สามารถพิมพ์คำสั่งอื่นๆ ที่ terminal ได้อีก เนื่องจากโปรแกรมรันอยู่นั่นเอง ให้ท่าน Ctrl+C ออกมา   การแสดงค่า IP Address ใช้โค้ดด้านล่างนี้ พร้อมกับเซฟไว้ในชื่อ myip.py   import RPi_I2C_Driver import socket mylcd = RPi_I2C_Driver.lcd() s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((‘psu.ac.th’, 80)) ip = s.getsockname()[0] s.close() mylcd.lcd_display_string(“IP Address:”, 1) mylcd.lcd_display_string(ip, 2)   หน้าจอ LCD ก็จะแสดงข้อความดังนี้ ** มีวิธีการเขียนแสดง ip address อีกหลายวิธี แต่ใช้วิธีนี้เนื่องจากเป็นวิธีที่จะได้ ip address ที่ใช้งานจริง เพราะในบางกรณีจะได้ loopback ip 127.0.0.1 แทน และในบางแบบ ก็สามารถระบุ interface เช่น eth0

Read More »