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

การใช้ Arduino วัดอุณหภูมิและความชื้นด้วย DHT11

รู้จัก DHT11

เป็นเซ็นเซอร์ที่ใช้วัดอุณหภูมิเป็นองศาเซลเซียล และองศาฟาเรนไฮ ยังสามารถวัดความชื้นได้อีกด้วย มีไลบารี่พร้อมใช่งานกับ Arduino สามารถใช้วัดค่าได้เที่ยงตรงกว่า NTC หรือ PTC มาก เพราะให้เอาต์พุตออกมาในรูปของดิจิตอล ใช้วัดอุณหภูมิอากาศโดยรอบ

การใช้งาน

DHT11 มีทั้งหมดอยู่ 4 ขา คือ
ลำดับขาใช้งาน
1VCC
DATA
NC
GND
DHT11 จะใช้วิธีการส่งข้อมูลให้กับไมโครคอนโทรลเลอร์ด้วยสายเพียงเส้นเดียวในแบบของดิจิตอลลอจิก

วงจรใช้งานกับ Arduino

Arduino library

สามารถดาว์โหลดได้จากลิ้ง https://github.com/adafruit/DHT-sensor-library นำไฟล์ที่คลายแล้ว ไปวางในโฟลเดอร์ Arduino\libraries แล้วก๊อบโค้ดด้านล้างลงบอร์ด
/* IOXhop - www.ioxhop.com */
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
   Serial.begin(9600); 
   Serial.println("DHTxx test!");

   dht.begin();
}

void loop() {
   float h = dht.readHumidity();
   float t = dht.readTemperature();
   float f = dht.readTemperature(true);

   if (isnan(h) || isnan(t) || isnan(f)) {
     Serial.println("Failed to read from DHT sensor!");
      return;
   }

   float hi = dht.computeHeatIndex(f, h);

   Serial.print("Humidity: "); 
   Serial.print(h);
   Serial.print(" %\t");
   Serial.print("Temperature: "); 
   Serial.print(t);
   Serial.print(" *C ");
   Serial.print(f);
   Serial.print(" *F\t");
   Serial.print("Heat index: ");
   Serial.print(hi);
   Serial.println(" *F");
  
   delay(2000);
}
เมื่อเปิด Serial Monitor ขึ้นมา ก็จะพบกับข้อความแสดงอุณหภูมิดังรูปด้านล่างนี้
-----------------------------------------------------------------------------------
DHT11 มีการตอบสนองต่ออุณหภูมิที่ค่อนข้างช้า ไม่ควรนำไปใช้วัดในสภาพแวดล้อมที่มีการเปลี่ยนแปลงไปอย่างรวดเร็ว

วันพุธที่ 1 มีนาคม พ.ศ. 2560

RS485 Design Tip


Raspberry Pi : Getting started with pyfirmata

จากในครั้งก่อนๆ ถ้าจำได้ ที่ผมได้แนะนำเรื่องการใช้ Arduino มาเป็นแขนเป็นขาให้ Raspberry Pi (ย้อนกลับไปดู http://raspberry-pi-th.blogspot.com/2012/11/raspberry-pi-and-arduino-experiment.html) ในตอนนั้น เราได้เขียนโปรแกรมติดต่อระหว่างบอร์ด Arduino และ บอร์ด Raspberry Pi โดยใช้ python-serial จาก Raspberry pi ติดต่อผ่าน uart protocal โดยให้บอร์ด Arduino ทำหน้าที่รอรับคำสั่งจาก Raspberry Pi เราจะพบว่า ค่อนข้างจะลำบากในแง่ของการพัฒนา แต่ถ้าหากใครที่มีความชำนาญแล้ว อาจจะชอบสไตล์นี้ก็ไม่ว่ากัน แต่ ถ้าหากจะมีไลบรารี่ที่สามารถอำนวยความสะดวกได้หล่ะ ก็น่าจะทำให้เราสามารถลดระยะเวลาในการพัฒนาโปรแกรมได้ไม่น้อย
วันนี้ เราจะมาลองใช้ไลบรารีสำเร็จรูปที่ชื่อ pyfirmata ซึ่งจะต้องติดตั้งลงบน Raspberry Pi แทนการเขียนโค๊ดเพื่อติดต่อระหว่าง Raspberry Pi และ Arduino ผ่านทาง Serial Port
Firmata คือ โปรแกรมที่ถูกออกแบบโปรโตคอลอย่างง่าย ที่ใช้สำหรับควบคุมขา PIN ต่างๆ บนบอร์ด Arduino โดยจะทำงานบนบอร์ด Arduino ซึ่งจะคอยทำงานรับส่งคำสั่ง ผ่านทาง Serial port
pyfirmata คือ ไลบรารีสำเร็จรูปที่ถูกพัฒนาด้วยภาษาไพธอนให้ทำงานอยู่บน host ในที่นี้ เราจะให้มาทำงานบน Raspberry Pi คอยสั่งคำสั่งและรับค่าผ่าน Serial port เมื่อติดต่อกับ Arduino
สิ่งจำเป็นที่เราต้องมี คือ 
- สาย USB สำหรับต่อจากบอร์ด Arduino กับ บอร์ด Raspberry Pi 
- บอร์ด Raspberry Pi ที่เชื่อมต่อกับอินเตอร์เนต เพื่อดาวน์โหลด ติดตั้ง package pyfirmata 
- บอร์ด arduino รุ่นใดก็ได้ ในที่นี้ ผมใช้ Arduino Duemilanover w/ATmega328
อันดับแรกให้ทำการติดตั้ง pyfirmata ลงบนบอร์ด Raspberry pi แต่เนื่องจากา pyfirmata นั้น ต้องการ python-serial โมดูลทำงานร่วมด้วย หากใครยังไม่เคยติดตั้ง จะต้องทำการติดตั้ง python-serial ก่อน  (ดูการติดตั้ง python-serial http://raspberry-pi-th.blogspot.com/2012/10/how-to-communicate-raspberry-pi-s.html)  และเนี่องจาก package pyfirmata ถูกเก็บไว้แบบ mecurial distributed source control เพราะฉะนั้นก่อนติดตั้ง เราจะต้องต้องติดตั้ง mecurial package ของ debian ซะก่อน ด้วยคำสั่ง
sudo apt-get mercurial
firmata source code control
เมื่อ Raspberry Pi ของเรามี python-serial และ mecurial เรียบร้อยแล้ว จากนี้ เราก็จะทำการติดตั้ง pyfirmata ด้วยคำสั่ง
hg clone https://bitbucket.org/tino/pyfirmata
เราจะได้โฟวเดอร์ pyfirmat มา จากนั้น เข้าไปในโฟวเดอร์ดังกล่าว
cd pyfirmata
แล้วติดตั้ง
sudo python setup.py install
หากไม่มีอะไรผิดพลาด เราน่าจะเรียกโมดูลนี้ได้ โดยเมื่อเราเข้าไปใช้ใน python console น่าจะเห็น function ต่างๆ ใน pyfirmata
sudo python 
>>> import pyfirmata 
>>> dir(pyfirmata) 
['ANALOG', 'ANALOG_MESSAGE', 'Arduino', 'ArduinoMega', 'BOARDS', 'Board', 'DIGITAL', 'DIGITAL_MESSAGE', 'DIGITAL_PULSE', 'END_SYSEX', 'I2C_CONFIG', 'I2C_REPLY', 'I2C_REQUEST', 'INPUT', 'InvalidPinDefError', 'NoInputWarning', 'OUTPUT', 'PWM', 'Pin', 'PinAlreadyTakenError', 'Port', 'QUERY_FIRMWARE', 'REPORT_ANALOG', 'REPORT_DIGITAL', 'REPORT_FIRMWARE', 'REPORT_VERSION', 'SAMPLING_INTERVAL', 'SERVO', 'SERVO_CONFIG', 'SET_PIN_MODE', 'SHIFT_DATA', 'START_SYSEX', 'STRING_DATA', 'SYSEX_NON_REALTIME', 'SYSEX_REALTIME', 'SYSTEM_RESET', 'UNAVAILABLE', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', 'boards', 'inspect', 'itertools', 'pyfirmata', 'serial', 'time', 'to_two_bytes', 'two_byte_iter_to_str', 'util'] 
>>>
แสดงว่าเราติดตั้ง pyfirmata สมบูรณ์แหละ ที่เหลือก็คือ ดูจาก tutorial และ exmaple การใช้งานของมัน
กลับมาที่บอร์ด Arduino เราจำเป็นจะต้องมีโค๊ดที่ทำหน้าที่รับคำสั่งจาก pyfirmata ที่มีรูปแบบโปรโตคอลเฉพาะที่ตรงกัน เพื่อทำหน้าที่รับ ส่ง คำสั่ง ระหว่าง pyfirmata ที่รันอยู่บน Raspberry Pi และ firmata ที่รันอยู่บน Arduino ซึ่งในส่วนของ Arduino ได้มีตัวอย่างของ firmata รวบรวมมาพร้อมอยู่แล้ว กับ Arduio IDE เวอร์ชั่นใหม่ๆ  ให้เราต่อบอร์ด Arduino เข้ากับคอมพิวเตเอร์ของเรา แล้วทำการเลือกตัวอย่าง StandardFirmata จากเมนู File>>Examples>>Firmata จากนั้นทำการ  verify โค๊ดก่อน หากไม่มีอะไรผิดพลาดเกิดขึ้น ก็ให้เราทำการ upload เพื่อทำการ burn hex file ลงบนบอร์ด arduino
burn firmata code into arduino

กลับไปที่บอร์ด Raspberry Pi เราจะทำการสร้างไฟล์ทดสอบการทำงานด้วย python เพื่อทำการทดสอบ pyfirmata ว่าจะสามารถติดต่อกับบอร์ด arduino ได้หรือเปล่า โดยให้เราสร้างไฟล์ขึ้นมาทดสอบ โดยเรียกโปรแกรม nano เพื่อสร้างไฟล์ blink.py
sample code usage pyfirmata
ทำการบันทึก (Ctrl+x) กด y เพื่อยืนยัน จากนั้น นำบอร์ด Arduino (ที่ผ่านการโปรแกรม เรียบร้อยแล้ว) มาเสียบด้วยสาย USB เข้าที่พอร์ต USB ของ Raspberry Pi  หากใช้คำสั่ง tail –f  /var/log/message จะพบว่า Raspberry pi มองเห็นบอร์ด arudino เป็น ttyUSB0 (ซึ่งเราได้นำค่านี้ไปกำหนดลงในโปรแกรม blink.py ด้วย) เมื่อทุกอย่างเรียบร้อยแล้ว ให้ลองทำการสั่ง python blink.py แล้วดูผลลัพธ์ที่หลอด LED13 ที่บอร์ด arduino จะเห็นว่า เกิดการติดดับ สลับกัน 2 ครั้ง เป็นไปตามโค๊ดที่เราเขียน
Raspbbery Pi with Arduino via pyfirmata
สรุปกันอีกครั้ง
  1. ติดตั้ง pyfirmata lib ลงบน raspberry pi
  2. โปรแกรม firmata standard ลงบนบอร์ด arduino
  3. เขียนโค๊ด blink.py ลงบน Raspberry pi
  4. ต่อสาย USB ระหว่างบอร์ด Raspberry Pi และบอร์ด Arduino
  5. ทดสอบโค๊ด และดูผลลัพธ์ที่ได้
ถ้าทำสำเร็จ เราจะพบว่า การติดต่อระหว่าง Raspberry Pi และ Arduino ไม่ใช่เรื่องยากอีกต่อไป นอกจากนี้ Arduino เอง ยังสามารถนำไปต่อกับ Sensor และ Control อะไรได้อีกมากมาย ซึ่งต่อไป จะได้นำเสนอโปรเจคที่นำ Arduino ไปต่อยอดให้ Raspberry Pi มีความาสามารถเพิ่มขึ้นได้อีกต่อไปครับ
ขอให้สนุกกับ Raspberry Pi และ Arduino ครับ

shell script check cpu raspberry pi ‘s temperature

vcgencmd measure_temp

หน้าร้อนใกล้เข้าแล้ว  เริ่มเป็นห่วงว่า Raspberry pi จะร้อนเกินไปหรือเปล่า ก็ลองใช้ shell script เช็คอุณหภูมิของ CPU ของ Raspberry pi สักหน่อย ว่า ตอนนี้อุณหภูมิ อยู่ที่เท่าไหร่แล้ว ใช้คำสั่งง่ายๆ ครับ vcgencmd measure_temp แค่ นี้ ก็จะได้คำตอบแล้ว ว่าอุณหภูมิเท่าไหร่  ถ้าจะให้วนลูปเรื่อยๆ ก็ได้ครับ
while true; do vcgencmd measure_temp; sleep 2; done
วนลูป แล้ว หยุด ทุกๆ 2 วินาที  ลองเอาไปประยุกต์กันดูครับ

Port Forwarding for Raspberry pi from outside world


เผื่อบางท่านที่ยังไม่ทราบ หรือกำลังหาวิธีทำ Port Forwarding จาก Router ไปหา Access point แล้วไปที่บอร์ด Raspberry pi โดยเราจะทำการ Port Forwarding หมายเลขพอร์ท 80 สำหรับเว็บ , หมายเลข 22 สำหรับทำ SSH รีโมทเข้าบอร์ด , หรือพอร์ทอื่นๆ ที่คุณต้องการรันแอพพลิเคชั่น
อันดับแรกเลย ผมจะบอกถึงอุปกรณ์เนตเวิร์กของผมก่อน ผมใช้บริการอินเตอร์เนต จาก 3BB network  ผมมี Huawei router จาก 3BB จากนั้นผมก็ต่อเข้ากับ Enginius ที่เป็นตัวขยาย Port Network และเป็นตัวปล่อยสัญญาณ wifi ภายในบ้าน จากนั้น ผมก็ต่อบอร์ด Raspberry pi เข้ากับ Engenius อีกครั้ง ตามรูป
จากนั้น เราต้องทำการ Fixed หมายเลข IP Address ของที่ Huawei ที่เป็น LAN และที่ Engenius ทั้ง WAN และ LAN เลย ส่วนที่บอร์ด Raspberry pi ก็ให้ Fixed ไว้ด้วยเช่นกัน


ทำการ Fixed IP Address ให้ได้ตามรูปด้านบนก่อน

สำหรับ Huawei



สำหรับ Engenius 


จากรูปด้านบน เรามองว่า WAN ของ Huawei คือรับ IP และข้อมูลจากภายนอก แล้ว LAN คือ iP ในวงแลนของเรา แต่ เมื่อเราต่อ Engenius ต่อท้าย Huawei แล้ว จึงทำให้ WAN ของ Engenuis ก็รับข้อมูลจาก LAN ของ Huawei อีกที
ดังนั้น เราต้องทำการบอกที่ Huawei ให้ทำการส่งข้อมูล ที่ต้องการติดต่อกับพอร์ตใดๆ ไว้ที่ Huawei ให้ทำการส่งข้อมูลนั้น ต่อมาที่ WAN IP ของ Engenius  โดยเข้าไปตั้งค่า NAT ในหน้าเว็บของ HUAWEI โดยปกติจะเป็น http://192.168.1.1 แล้วไปที่เมนู Basic->NAT ทำการเพิ่ม Virtual Server ตามรูป ในที่นี้ผมต้องการให้ มีการ Forward port 80,22,8090,900 ไปที่ WAN IP ของ Engenius

จากนั้น เราก็ไปตั้งค่า Forwarding Port ที่ Engenius ต่อไปที่บอร์ด Rasbperry pi ของเราอีกที โดยที่บอร์ด Rasbperry pi ของเราถูก Fixed IP Address ไว้ที่ 192.168.2.105

ทำการ Fixed IP Address ของบอร์ด Raspberry pi ด้วยการแก้ไขไฟล์ interfaces
nano /etc/network/interfaces

แค่นี้ ก็เป็นอันเรียบร้อยแล้ว วิธีทดสอบก็คือ ลอง Connect ผ่าน WAN IP Address ของ Huawei ผ่านหน้าเว็บ (ถ้าเปิด Web service ไว้) หรือผ่าน SSH Terminal จากข้างนอกเข้ามา ซึ่งการหา WAN IP Address ก็ทำตามขั้นตอนจากตอนเก่าๆ ได้ ที่นี่
มาถึงตอนนี้ ผมคิดว่าหลายๆ คน คงเข้าใจดี ว่าตัวเองกำลังทำอะไรอยู่ และจะได้อะไรจากการทำแบบนี้ ซึ่งประโยชน์ที่คุณจะได้ก็คือ คุณจะสามารถเข้ามากับบอร์ด Raspbery pi แม้ว่าคุณอยู่นอกบ้าน ซึ่งก็แล้่วแต่จินตนาการของแต่ละท่านว่าจะทำอะไรต่อ
ปล. สำหรับใครที่ใช้ 3BB แล้ว Forward Port ไม่สำเร็จ โทรไปปรึกษา 3BB ที่เบอร์ 1530 นะครับ เพราะบางที เราอาจจะโดนบล๊อกจาก 3BB อยู่ก่อน บอกให้เขาปล๊อดบล๊อกให้ครับ

How to install MJPG-Streamer

MJPG-Streamer คือ โปรแกรมประเภทคำสั่งที่สามารถพิมพ์คำสั่งลงไป แล้วโปรแกรมจะทำการดึงภาพออกจากเว็บแคมของเรา แล้วทำการส่งไปเก็บไว้ เพื่อที่เราจะสามารถเข้ามาดูได้ โดยผ่านเว็บบราวเซอร์ หรือผ่านทางมือถือก็ได้
บทความต่อไปนี้ ผมได้ค้นหามาจาก http://www.raspberrypi.org/phpBB3/viewtopic.php?f=30&t=8659  ซึ่งก่อนหน้านี้ ผมพยายามทำมาหลายครั้งแล้ว แต่ ไม่ประสบความสำเร็จเหมือนคนอื่นเค้า เนื่องจากบอร์ด Raspberry Pi ของผมเป็น Model B rev 1 ซึ่งอาจจะมีอุปสรรคมากกว่าบอร์ดรุ่นใหม่ๆ สักหน่อย ซึ่งอาจจะทำให้บทความนี้ อาจจะไม่เวิร์กสำหรับคนอื่นก็ได้ ก็ต้องขอบอกไว้ ณ ทีนี้ด้วย ซึ่งการที่เราจะต่ออุปกรณ์อะไรสักอย่างกับ Linux ย่อมมีอุปกรณ์เรื่องของ driver ที่ไม่รองรับ นั่นเป็นเรื่องธรรมดาของ Linux OS ครับ (ต้องทำใจนิดนึง)
อุปกรณ์ที่ผมใช้ก็คือ บอร์ด Raspberry Pi Model B rev 1 ซึ่งมี RAM อยู่ 256 กับกล้อง WebCam ยี่ห้อ OKER รุ่น Webcam OKER (177) ซึ่งนับว่าโชคดีมาก ที่เจ้า Driver kernel ของผมมันรองรับพอดี หากเพื่อน ต้องการทราบว่ากล้องรุ่นใดบ้างที่ driver รองรับ สามารถตรวจสอบได้ที่ http://www.ideasonboard.org/uvc/
เรามาเริ่มกันเลยครับ หลังจากที่เราได้เช็คอัพเดทแล้ว sudo apt-get update ให้เราไปโหลด package เหล่านี้มาก่อน ได้แก่
sudo apt-get install subversion 
sudo apt-get install libv4l-dev 
sudo apt-get install libjpeg8-dev 
sudo apt-get install imagemagick
ซึ่ง Subversion เป็นตัวเอาไว้โหลดซอร์สโค๊ดจาก svn server ที่นักพัฒนาโปรแกรมนิยมเอาไปเก็บไว้ครับ ส่วน package อื่นๆ ที่เหลือ ก็เกี่ยวเนื่อง และ เป็นไลบรารี่เสริมในการ
compile MJPG-Streamer อีกทีครับ
ตอนนี้เราจะโหลด MJPG-Streamer บ้างหล่ะ ให้ใช้คำสั่งนี้ครับ ซึ่งจะได้ตัวอัพเดทล่าสุดเลย
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
เสร็จแล้วให้เข้าไปที่โฟวเดอร์ mjpg-streamer/mjpg-streamer ด้วยคำสั่ง
cd mjpg-streamer/mjpg-streamer
จากนั้นเราจะทำการ compile โปรแกรมของเราหล่ะ ด้วยคำสั่ง
make USE_LIBV4L2=true clean all
ซึ่งไม่น่าจะมี error ใดๆ ขึ้นมานะครับ (อาจจะมี warning ได้ แต่ อย่าให้มี error ก็แล้วกัน ) เสร็จแล้วก็ตามด้วย
sudo make DESTDIR=/usr install
หากไม่มี error แล้ว ให้เราทำการเสียบกล้อง webcam ของเราเข้าทาง port USB ของบอร์ด Raspberry pi ครับ ก่อนที่จะเสียบสาย USB เราอาจจะสั่งคำสั่ง
tail -f /var/log/messages
เพื่อดูว่า uvcvideo kernel driver มองเห็นอุปกรณ์ที่เป็น camera หรือยัง ถ้ามองเห็นแล้ว ควรจะได้ข้อความตามรูปข้างล่าง
uvcvideo kernel driver found webcam
จากนั้น ผมลองติดตั้ง fswebcam ซึ่งตัวนี้ ผมจะใช้เป็นตัวเช็คว่า ผมจะต้องปรับค่า output ที่กล้องให้ค่าได้เป็นอะไร ซึ่งเราจะนำไปใช้ในการตั้งค่า streamer ต่อไป
ติดตั้ง fswebcam  ด้วยคำสั่ง
sudo apt-get install fswebcam
เสร็จแล้วให้ใช้คำสั่ง
fswebcam --verbose
fswebcam --verbose
ซึ่งจากข้อมูลที่ได้มา ผมควรที่จะปรับค่า output ที่จะได้จาก streamer ให้เป็น YUYV และ frame rate ควรจะเท่ากับ 4
ผมก็นำเอาข้อมูลที่ได้นี้ มาใช้ร่วมกับคำสั่ง
mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0  -r 352x288 -f 4 -y YUYV" -o "/usr/lib/output_http.so -p 8090 -w /var/www/mjpg_streamer"
image
(ศึกษาพารามิเตอร์ต่างๆ ได้ที่ คำสั่ง mjpg_streamer --help  หรือ จากไฟล์ /home/pi/mjpg-streamer/mjpg-streamer/start.sh )
หลังจากที่สั่งคำสั่ง เรียบร้อยแล้ว จะเกิดการ stream ภาพที่ได้จากกล้องไปเก็บไว้ที่ web root folder เราสามารถเปิดดูภาพที่ได้ผ่านหน้าเว็บบราวเซอร์ได้เลย โดยใส่  URL ไปที่ ip ของ Raspberry pi แล้วตามด้วยพอร์ต 8090 ครับ จากนั้นตามด้วยพารามิเตอร์ ?action=stream
สมมติว่า ip address ของบอร์ด raspberry pi เท่ากับ 192.168.2.105 จะได้ว่า
http://192.168.2.105:8090/?action=stream
ที่หน้าเว็บบราวเซอร์จะพบภาพจากกล้องเว็บแคมของเราครับMJPG-Streamer work
ถ้าเพื่อนๆ ลองปรับพารามิเตอร์คำสั่ง mjpg_streamer ให้เหมาะกับ output ของกล้องหล่ะก็ ภาพที่ได้จะออกมาดี (เท่าที่กล้องมันจะทำได้) เลยหล่ะครับ หวังว่าคงเป็นประโยชน์ นำไปต่อยอดกันได้นะครับ

The Pi4J Project


image
    The Pi4J Project ได้ออกชุดไลบรารีสำหรับภาษาจาวา ให้สามารถเชื่อมต่อ สั่งงาน GPIO บน Raspberry Pi ซึ่งนับว่าเป็นการเปิดการเชื่อมต่อของ Raspberry Pi ออกไปอีกทางหนึ่ง ให้ผู้ที่มีความสามารถทางภาษาจาวา ได้สามารถเรียกใช้ Library ด้วยภาษาจาวาทำการติดต่อ และสั่งงานขา GPIO ได้

คุณสมบัติ 
- Export & unexport GPIO pins 
- Configure GPIO pin direction 
- Configure GPIO pin edge detection 
- Control/write GPIO pin states 
- Pulse GPIO pin state 
- Read GPIO pin states 
- Listen for GPIO pin state changes (interrupt-based; not polling) 
- Automatically set GPIO states on program termination (GPIO shutdown) 
- Triggers for automation based on pin state changes 
- Send & receive data via RS232 serial communication 
- Access system information and network information from the Raspberry Pi 
- Wrapper classes for direct access to WiringPi Library from JavaImport Pi4J Packages
Create Controller Instance

สาวก Java ดาวน์โหลด Pi4J library  ( คลิก )
แล้วทำการติดตั้ง  ( คลิก )
ส่วน วิธีการใช้งาน ( คลิก ) ก็ทำตามขั้นตอนได้เลยครับ
นอกจากนี้ ยังมีเอกสารของ JavaDoc ( คลิก ) ให้อ่านอีกด้วย
ตัวอย่างการทำ  GPIO State Listener
\Wiring Diagram