วันนี้ผมจะเขียนเรื่องการใช้งาน Ethernet Module รุ่นเล็กนี้ครับ ชื่อรุ่นคือ ENC28J60
โจทย์ของวันนี้เป็นแบบนี้ครับ
สมมุติว่าผมต้องการจดบันทึก และดูค่าอุณหภูมิและความชื้นในห้องเก็บไวน์ที่บ้าน (พอดีไวน์ที่บ้านมันแพง ต้องอยู่ที่อุณหภมิและความชื้นที่เหมาะสม) และผมก็เป็นห่วงมันมากๆ กลัวจะมีปัญหา เวลาผมจะออกไปข้างนอก ผมก็อยากจะรู้อยู่ดีว่าไวน์ที่รักยังมีความสุขกับอุณภูมิและความชื้นที่ผมตั้งไว้รึเปล่า ผมอยากจะเข้าดูผ่าน Internet ได้ทุกที่ทุกเวลา เผื่อมีปัญหาจะได้ส่งคนไปดูแลแทนได้ จะทำยังไงดี ด้วยความเป็นวิศวกรไฟฟ้า ก็เลยจัดเอา Arduino UNO R3 กับ DHT11 มาวัด แล้วส่งเข้า Internet ผ่าน Ethernet Module ซะหน่อย กะว่าจะให้แสดงผลบนหน้าจอผ่านเว็บไซต์ หรือ ผ่าน Application บน Smart Phone ครับ
ในการใช้งาน Arduino ให้เป็นตัวส่งข้อมูลผ่านไปยัง webserver โดยใช้ Ethernet Module นั้นต้องเข้าใจ 2 ส่วนหลักนะครับ คือ การใช้งาน Arduino กับ Ethernet Module และการใช้งาน Webserver ที่จำทำหน้าที่เก็บข้อมูลของเราไว้ครับ ดังนั้นวันนี้จะต้องอธิบาย 2 ส่วน ก่อนที่จะเริ่มใช้งานกันนะครับ คือ ส่วนของ Hardware โดยเราจะใช้ DHT11 (ซึ่งใช้วัดค่าความชื้นและวัดอุณหภูมิ) เพื่อเป็นตัวทดสอบการส่งค่าไปครับ เนื่องจากมีราคาถูกและใช้งานง่ายมากๆครับ
จากนั้นคงต้องมาอธิบายกันว่า webserver ที่เราจะใช้นั้นมันทำงานยังไง โดยผมจะเลือกใช้ของ Xively.com นะครับ เป็น Webserver ที่ออกแบบมาเพื่อใช้เป็น Data logger โดยเฉพาะ และ ใช้งานฟรีในขั้นเริ่มต้นครับ แต่ถ้าจะไปใช้เชิงพาณิชย์ ก็คงต้องอุดหนุนเขาหน่อยครับ
มาดูรายละเอียดภายนอกกันครับ Ethernet Module ตัวนี้เป็นรุ่นที่มีขนาดเล็กนะครับ ใช้ Chip ของบริษัท Microchip ENC28J60 เป็นหัวใจในการทำงานครับ จริงๆแล้ว Ethernet Shield มีอยู่อีกรุ่นนะครับ แพงกว่าอีกนิด แต่มี SD card module มาให้ด้วย แต่เป็นการทำงานโดยใช้ Chip คนละตัวนะครับ ดังนั้น Library จึงใช้ด้วยกันไม่ได้ (อันนี้จะเขียนการใช้งานให้ในครั้งต่อไป โปรดติดตาม :) )
วันนี้ผมจะใช้งาน Ethernet Module คู่กับ Portable Router นะครับ ทั้งนี้เพื่อให้ผมไม่ต้องเดินสายให้ยุ่งยาก เนื่องจากสถานที่ทดสอบมี Wifi อยู่แล้ว แต่ Wireless Router อยู่คนละที่ครับ แต่ถ้าใครจะต่อสาย LAN โดยตรงก็ทำได้นะครับ ผมใช้ Portable Wireless Router รุ่น TENDA W150m ครับ หน้าที่ของตัวนี้คือจับสัญญา WIFI มาใส่สาย LAN แล้วต่อเข้ากับ Ethernet Module ครับ
หลายคนอาจจะสงสัยว่าทำไมไม่ใช้ WIFI Shield ไปเลยให้ มาต่อสายและใช้ Portable Wireless Router อีกทอด สาเหตุเพราะ WIFI Shield ราคาแพงกว่ามากๆครับ ประมาณ 10 เท่าเห็นจะได้ (ใครจะซื้อผมก็มีขายนะครับ แถม Support ให้ด้วย ) แต่ถ้างบน้อย และอยากได้แบบไร้สายก็วิธีนี้ครับ รวมค่าอุปกรณ์ (Ethernet Module กับ Tenda) แล้วก็ราวๆ 1 พันบาทเท่านั้น ไม่รวมค่าบอร์ด Arduino นะครับ วิธีการ setting เจ้า Tenda นี้ลองกลับไปดูบทความของเราดูนะครับ
กลับมาคุยกันเรื่อง ENC38J60 กันต่อครับ ดูแล้วอาจจะต่อสายกันเยอะซักหน่อย แต่ก็ไม่ได้ยากมากนะครับ ลองดูตามตารางนี้เลยครับ เลือกให้ถูกตามบอร์ดที่ใช้นะครับ
จากนั้น Download Library จาก github มาใส่ไว้ใน Folder Library ของเรา
https://github.com/jcw/ethercard/archive/master.zip
จากนั้นต่อ DHT11 เข้ากับบอร์ด Arduino UNO R3 ครับ อย่าลือ Download library DHT มาด้วยนะครับ ลองดูวิธีใช้งาน DHT11 ใน บทความของเรา ได้อีกเช่นกันครับ
DHT11 มันจะมี Pin อยู่ 3 ขา VCC GND และ DATA ต่อตามนี้ครับ
VCC -> 5 Volt
GND -> GND
DATA -> Pin 2
ตัว DHT11 มันจะมีขายทั้งแบบ On plate อย่างที่เห็นในรูป และ มาแบบตัวเปล่า DHT11 เท่านั้นก็มีนะครับ แต่ผมเลือกใช้แบบ On plate (เพิ่มเงินอีกไม่กี่สิบบาท) เพราะมันต่อได้สะดวก มี led แสดงสถานะไฟเลี้ยงให้ด้วยครับ ก็เลือกเอาตามใช้ชอง
ต่อ Arduino, Ethernet module และ DHT11 แล้วก็ประมาณรูปด้านบนนะครับ
คราวนี้มารู้จักกับเว็บไซต์ที่เอาไว้ใช้ทำ Data logger กันครับ จริงๆ แล้วก็พอจะมีให้เลือกอยู่ 2 -3 เจ้านะครับ เช่น www.xively.com หรือ www.exosite.com เจ้าแรกนี่มาก่อนตั้งแต่เริ่มมี Arduino ใหม่ๆ ดังนั้นหนังสือ หรือเว็บไซต์ของนักพัฒนาจึงจะมีข้อมูลของ xively มากกว่าซักหน่อยครับ แต่การทำงานคร่าวๆ ก็จะเหมือนกัน ต่างกันที่ Syntax ในการส่งข้อมูล และ รายละเอียดราคาของแต่ละ package ครับ
จริงๆ แล้วทั้งสองเจ้านี้ก็ไม่ได้ทำให้แต่เฉพาะการใช้งานกับ Arduino นะครับ มันสามารถใช้งานได้กับ Android, Linux, Raspberry PI หรือแม้กระทั่ง Python ก็มี API ให้เลือกใช้งานได้ วันนี้ผมจะแนะนำวิธีการใช้งานกับ Xively นะครับ
เริ่มต้นจากการเข้าไปสมัคร Sign in กับเว็บก่อนนะครับ (ขั้นตอนที่จะเขียนต่อไปนี้เป็นแบบฟรีทั้งหมดนะครับ ใครจะไปทำงานเชิงพาณิชย์ก็ต้องไปตืดต่อเขาเอาเองครับ)
ขั้นตอนที่ 1 เริ่มจาก Get Started มุมขวาบนครับ
ขั้นที่ 2 ไปคลิ๊กที่ “Sign Up for a Free Develop Account”
ขั้นที่ 3 กรอกรายละเอียดของผู้ใช้งาน
ขั้นที่ 4 Step 4 – Activate บัญชีที่ใช้โดยไปที่ email ที่กรอกไว้เมื่อซักครู่ จากนั้น Log in เข้าไปที่ www.xively.com
ขั้นที่ 5 ไปที่ Develop
ขั้นที่ 6 เลือก "Add devive" ซึ่งจะเป็นการกำหนด Channel ที่เราจะเรียกใช้ครับ
เสร็จแล้วจะได้หน้าตาประมาณนี้ครับ
เท่านี้ก็พร้อมที่จะไปลงโปรแกรมต่อแล้วครับ
จากนั้นก็ใช้ Sketch นี้ไป Upload ลงที่ Arduino UNO R3 ครับ อย่าลืมแก้ค่า API Key กับ FEED ที่สมัครไว้ให้ถูกนะครับ
// Simple demo for feeding some random data to Pachube.// 2011-07-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php// Arduitronics Data Logger with Ethernet module ENC28J60// www.arduitronics.com// www.facebook.com/arduitronics#include // Lirary ของ ENC28J60#include // Lirary ของ DHT#define DHTPIN 2 // กำหนดขาของ DHT ที่จะเข้า Arduino UNO R3// Uncomment whatever type you're using!#define DHTTYPE DHT11 // DHT 11DHT dht(DHTPIN, DHTTYPE);// Uncomment whatever type you're using!#define DHTTYPE DHT11 // DHT 11// change these settings to match your own setup#define FEED "9999999999" // copy Feed ID ที่เป็นตัวเลข 10 หลักมาจากหน้าเว็บ#define APIKEY "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" //จากนั้นก็ API Key ตัวอักษรยาวๆครับ// ethernet interface mac address, must be unique on the LANbyte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // เลข Mac นี้ไม่ต้องเปลี่ยนก็ได้ครับchar website[] PROGMEM = "api.pachube.com";byte Ethernet::buffer[700];uint32_t timer;Stash stash;void setup () {Serial.begin(57600);Serial.println("Arduitronics Data Logger with Ethernet module ENC28J60");Serial.println(" DHT11 Datastream ....");Serial.println("\n[webClient]");if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)Serial.println( "Failed to access Ethernet controller");if (!ether.dhcpSetup())Serial.println("DHCP failed");ether.printIp("IP: ", ether.myip);ether.printIp("GW: ", ether.gwip);ether.printIp("DNS: ", ether.dnsip);if (!ether.dnsLookup(website))Serial.println("DNS failed");ether.printIp("SRV: ", ether.hisip);Serial.println("\n");Serial.println("... Start Reading Data and uploading to Xively ...\n");}void loop () {ether.packetLoop(ether.packetReceive());if (millis() > timer) {/////////////////////////////////////////////////////////read sensor values// Reading temperature or humidity takes about 250 milliseconds!// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)float sensorValue = dht.readHumidity();delay(300); // รอให้ส่งข้อมูลให้เสร็จก่อนค่อยอ่านต่อfloat sensorValue_T = dht.readTemperature();//print the sensor valye ตรงนี้ Print ให้ดูที่ Serial MonitorSerial.print("Read sensor value Humidity: ");Serial.println(sensorValue);Serial.print("Read sensor value Temperature: ");Serial.println(sensorValue_T);Serial.println();timer = millis() + 15000;// generate two fake values as payload - by using a separate stash,// we can determine the size of the generated message ahead of timebyte sd = stash.create(); // เวลาส่งข้อมูลไปที่ Server ของ Xively ที่ละชุด เขาจะเรียกว่า Stashstash.print("Humidity,"); //ตรงนี้เป็นการส่งค่าไปที่ Xively ที่ชื่อ Humidity ถ้าจะเรียกอย่าอื่นก็เปลี่ยนได้stash.println((word) sensorValue ); // ส่งค่าไป Xivelystash.print("Temperature,");//ตรงนี้เป็นการส่งค่าไปที่ Xively ที่ชื่อ Temperaturestash.println((float) sensorValue_T); // ส่งค่าไป Xivelystash.save();// generate the header with payload - note that the stash size is used,// and that a "stash descriptor" is passed in as argument using "$H"// ตรงนี้อย่าไปแก้อะไรครับStash::prepare(PSTR("PUT http://$F/v2/feeds/$F.csv HTTP/1.0" "\r\n""Host: $F" "\r\n""X-PachubeApiKey: $F" "\r\n""Content-Length: $D" "\r\n""\r\n""$H"),website, PSTR(FEED), website, PSTR(APIKEY), stash.size(), sd);// send the packet - this also releases all stash buffers once doneether.tcpSend();}} |
Upload เสร็จเรียบร้อยไม่มีอะไรผิดพลาดจะได้หน้าจอ Serial Monitor ตามนี้ครับ จะเห็นว่าในท่อนแรกเป็นการรายงานผลการเชื่อมต่อเข้า Internet ของ Ethernet Module ถ้าเข้าไม่สำเร็จ คือต่อ Net ไม่ได้จะขึ้นแสดงว่า Failed to access Ethernet controller นะครับ
สำหรับท่อนต่อไปจะแสดงค่าที่่อ่านได้จาก DHT11 ถ้าอ่านปกติจะเห็นค่าอุณหภูมิ แต่ถ้าอ่านไม่ได้เนื่องจากต่อสายไม่ถูกต้องจะแสดงว่า Read fail Read sensor value Humidity: nan ก็ให้ตรวจสองชุด DHT11 นะครับ
ทีนี้ไปดูที่ Xively.com ครับ เริ่มจาก Log in เข้าไปและเลือก Channel ที่เราได้สร้างไว้ที่ตรงกับ Feed ID และ API Key ครับ ถ้าสำเร็จเราจะเห็นตามด้านล่างนี้ครับ
ในกรณีที่ส่งค่าไปไม่สำเร็จ ค่าที่ Return กลับมาจะมีค่าไม่เท่ากับ 200 แสดงว่า Server ไม่ได้ตอบรับค่านะครับ ซึ่งจะมีการแสดง log book ของแต่ละ Feed ไว้ในด้านขวาของหน้าจอ
แถมให้อีกอย่างครับ ใครที่ใช้ Smart phone หลังจากที่เรา upload ข้อมูลที่่่เราเก็บมาด้วย Arduino ขึ้นไปบน Channel ของเราบน Xively แล้ว เราสามารถเปิดดูข้อมูลของเราผ่าน Application ชื่อ "Xively Viewer" ได้นะครับ Download ฟรีที่ Google Play Store เท่าที่ผมเขียนในขณะที่ยังไม่มี App ของ IOS นะครับ ใช้ได้แต่ Smart phone Android
Xively Viewer นี้สามารถตั้งเวลาในการ reload สามารถ Zoom ได้ทั้งแกน X Y และเลือก Channel ที่จะดูข้อมูลได้ ทำให้เราสามารถดูค่าที่เราวัดได้ทุกที่ที่มี internet ไปถึงผ่าน Application ตัวนี้ครับ
วันนี้พอแค่นี้ครับ ยาวมากแล้ว ถ้ามีปัญหาก็สอบถามมาได้นะครับ
ลองหาข้อมูลเพิ่มเติมเกี่ยวกับบทความได้ที่
http://blog.wickeddevice.com/?p=474
http://nathanhein.com/2013/02/getting-arduino-online-with-an-enc28j60/
https://www.arduitronics.com/product/22/ethernet-enc28j60-network-interface-module
โดย Mountain "A"
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,417,779 ครั้ง |
ผู้ชมทั้งหมด | 5,920,859 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 3 ต.ค. 2568 |