ผมเชื่อว่าหลายคน เคยเจอเหตุการณ์นี้ อยากจะบันทึกค่าการทดลอง ทุกๆ 10 นาที ต้องจับเวลาและบันทึกเอง ซึ่งดีกว่านี้อีกนิด ใช้ Data logger บันทึกข้อมูล ลง SD -Card แล้วเอามาพร็อตกราฟ ด้วยโปรแกรม excel หรือ โปรแกรมใดๆ บนคอมพิวเตอร์ แต่ก็ยังติดปัญหาอีก ถ้าอยู่คนล่ะที่ อยากจะบันทึก และ ดู monitor การทดลอง แบบ Real time มันก็เป็นไปไม่ได้อีก
มารู้จักกับ Data Logger บน Cloud
ปัญหาดังกล่าวจะหมดไป ถ้าเราบันทึกข้อมูล ทุกอย่างลงบน Database บน Cloud ช่วยให้เราบันทึกข้อมูลจากมุมไหนก็ได้ และ ดูข้อมูลพร้อมกันจากหลายๆที่ ก้อยังได้อีก ซึ่งในตอนนี้มีหลายที่ แต่ที่ทางผมรู้จักจะมีดังต่อไปนี้
- data.sparkfun.com เป็น Platform-as-a-Servics (PaaS) อีกที่ ที่ดำเนินการโดย บ. sparkfun เลยเปิดฟรี ไม่จำกัด key แต่ PaaS นี้จะมีไม่มีบริการ plot กราฟ ให้นะครับ จะเก็บบันทึกข้อมูลแค่อย่างเดียว มีพื้นที่ให้เก็บได้ 50MByte จริง มากพอที่จะไว้ทำทุกอย่าง
- Thinkspeak.com คือ Platform-as-a-Service (PaaS) สำหรับ บันทึก/อ่านข้อมูลที่ได้จาก sensor ไปเก็บไว้ใน cloud database ซึ่งนอกจากบันทึกค่า แสดงค่าแบบกราฟ ได้อีกด้วย ด้วยมันเป็นเวป ทำให้เราสามารถเปิดกราฟ ออกมาดูจากที่ไหน ก็ได้ในโลก แต่มีข้อจำกัดตรงใน version ฟรี เขาจะให้ key สำหรับเชื่อมต่อแค่ 1 key ฉะนั้น เราจะต่อกับอุปกรณ์ ได้แค่ตัวเดียวครับ
- Xively.com เป็น Platform-as-a-Servics (PaaS) เจ้านี้เปิดบริการมานาน มากที่สุด จะมีลูกเล่น มากกว่าเพื่อน ที่เด่นๆ คือ plot graph ได้ และ เลือกช่วงเวลาแบบ 1 อาทิตย์ 1 เดือน 3 เดือนได้ มีทั้งบริการแบบฟรี และ เสียเงินครับ
สำหรับตอนนี้ทางผมคงจะมีอธิบายวิธีการบันทึกข้อมูลแบบง่ายๆ ที่สุดก่อนครับ โดยใช้ data.sparkfun.com กันก่อนล่ะครับ เนื่องจากมัน ฟรี ครับ
ความเจ็บปวดในการทำงาน Backend
การสร้างฐานข้อมูลบน cloud ในฐานะ ที่ทางผมเองเป็นคนพัฒนาอุปกรณ์ ทาง embedded system อุปกรณ์ ไม่เคยได้ไฟมากกว่า 12 โวลต์ ไม่เคยไปไหน ไกลกว่าสาย serial จะไปถึงได้นิ คงบอกได้ว่า เรื่องที่เกี่ยวกับ server internet เป็นเรื่องใหม่ สำหรับทางผม การที่จะทำมันขึ้นมาได้ คงจะยากสำหรับทางผม ยิ่งต้องทำให้เสถียร ใช้งานได้ อาจจะต้องใช้เวลา เพราะมันต้องศึกษาหลายเรื่องทั้งการติดตั้ง server บน cloud ,การสร้างเวป services แต่ด้วยยุคที่ IoT กำลังจะมา ทำให้หลายเจ้า แข่งกันมาก ทำให้มีคนพัฒนา Backend แบบนี้มาให้ใช้ฟรี ซึ่งข้อดีคือ ถ้าเราสามารถเอามันไปใช้งานได้เลย โดยไม่ต้องมาปวดหัวว่า server จะล้ม หรือ จะมีอะไรดับไหม ณ. ตอนนี้ ลองเอาไปใช้ประโยชน์กันก่อนนะครับ
และการทำให้โปรเจค ไมโคร เชื่อมต่อ internet ในช่วงก่อนหน้านี้ เป็นเรื่องที่มีค่าใช้จ่ายสูง จะใช้ Pi หรือ จะใช้ Arduino มันก็มีค่าใช้จ่ายที่สูง เพราะว่าโปรเจคแนวนี้เราจะไม่ได้ใช้ Sensor เพียงแค่ตัวเดียว แต่จะใช้ sensor เป็นหลัก 10 หลัก 100 ตัว จนกระทั้ง ESP8266 ออกมาขาย หลายๆ ดูคุ้มที่จะใช้มากขึ้นเลยที่เดียว
การ Pushing ข้อมูลเข้า Data.SparkFun.com
การนำข้อมูลขึ้นไปเก็บไว้ใน database ทาง sparkfun จะเรียกว่าการ push data โดยวิธีการของทาง Sparkfun จะใช้รูปแบบ HTTP request ยิง link ไปยังเวป การส่งข้อมูลสะดวกและง่ายมากๆ ผ่านเวป ก้อทำงานได้
ตัวอย่างข้อมูลที่ส่งไปบันทึก ที่ data.sparkfun.com ซึ่งเราจะสามารถ download ไฟล์ที่เก็บไว้ในรูปแบบ csv เอาไป plot กราฟเองก็ได้ หรือ จะทำ web มาดึงข้อมูลในรูปแบบ JSON ไปแสดงกราฟ ก็ได้นะครับ
การใช้นำไปงาน
1. มาถึงตอนนี้ ทางผมคงเอาบอกวิธีการนำ ESP8266 ไปใช้งานส่งข้อมูลเข้า Server ล่ะกันครับ ก่อนอื่นเลยเราต้องลงทะเบียน เพื่อ add field data ได้สักก่อน
2. มาถึงหน้านี้ กรอกข้อมูล ที่จำเป็น จากนั้นกด Save
3. จากนั้น เราจะได้เข้าไปยังหน้า Key ซึ่งเราจะได้ค่า Public Key และ Private Key เราจะใช้ Key นี้ ใน ตอนส่ง HTTP Request ครับ
4. มาดูตัวอย่างการใช้ Key ให้เรามองว่า การส่ง Http Request ในตอนนี้มันเหมือน การเข้าลิงค์เวปครับ เราส่ง Request ไป ตัว server จะรับ Request และ Get Parameter ไปด้วย ซึ่ง Format ถูกต้อง ตัวเวป จะเก็บข้อมูลเข้าไปใน ฐานข้อมูลเองครับ
ลองกด Link ดังกล่าว และเข้าไปดู ยังหนัา Public URL เราจะเห็นข้อมูล add เข้าไปล่ะ 1 field
ข้อควรระวัง
number ตัวแปรนี้จะเปลี่ยนชื่อไปตามที่เราตั้ง
Example:
http://data.sparkfun.com/input/zDRx1nbRYRtNyE8glOoD?private_key=YyeXvZ8e5etv9xjAGaVR&number=24.33
เอาล่ะครับ อันนี้เป็นวิธีหนึ่งในการส่งข้อมูลเข้าไปเก็บนะ ยังมีอีกหลายวิธีครับ วิธีนี้ข้อดี มันใช้งานง่าย อุปกรณ์หลายตัว ใช้งานได้ ได้มาตราฐาน ตอนนี้มาดูส่วน ESP8266 บ้างต้องทำอย่างไง
ESP8266 POST DATA To data.sparkfun.com
สำหรับในครั้งนี้ ผมใช้ Arduino IDE สำหรับ ESP8266 นะครับ เนื่องด้วยความเป็น native ของมัน และคิดว่าน่าจะสะดวกกับทุกคน
สิ่งแรกที่ทำสำหรับคนที่เพิ่งเข้ามาอ่านบทความนี้นะครับ Arduino IDE ตัวนี้ ไม่ใช่ตัวมาตราฐาน ลองอ่านบทความ มาเล่น ESP8266 บน Arduino IDE กันเถอะ นี่ เพื่อติดตั้งก่อนนะครับ
ผมใช้ตัวอย่างของ ESP เลยนะครับ อยู่ใน Example>ESP8266Wifi >WifiClient
จากนั้นเราแค่แก้ไข ssid , password ให้ถูกต้อง
ใส่เข้า public key ในช่อง streamId และ privateKey น่าจะใช้งานได้ ครับ
const char* ssid = "---------------"; const char* password = "--------------"; const char* host = "data.sparkfun.com"; const char* streamId = "--------------------"; const char* privateKey = "--------------------";
ข้อควรระวังนะครับ ชื่อ filedData ในชุดคำสั่ง ในบรรทัดที่ 64 ถึง 65 มันจะตามที่เราตั้งชื่อใน หน้าแรกนะครับ ฉะนั้น ถ้าในช่อง filed ไม่ได้ตั้งชื่อว่า number ให้ไปแก้ใน code ในบรรทัดดังกล่าวด้วย
โค๊ดทั้งหมดครับ หรือ จะใช้ ตัวอย่างของ ESP เลยนะครับ อยู่ใน Example>ESP8266Wifi >WifiClient มาใช้งานก็ได้ครับ
/* * This sketch sends data via HTTP GET requests to data.sparkfun.com service. * * You need to get streamId and privateKey at data.sparkfun.com and paste them * below. Or just customize this script to talk to other HTTP servers. * */ #includeconst char* ssid = "---------------"; const char* password = "--------------"; const char* host = "data.sparkfun.com"; const char* streamId = "--------------------"; const char* privateKey = "--------------------"; void setup() { Serial.begin(115200); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } int value = 0; void loop() { delay(5000); ++value; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/input/"; url += streamId; url += "?private_key="; url += privateKey; url += "&number="; url += value; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); }
เอาล่ะครับ จบไปอีก หนึ่งตัว กับประสบการณ์การใช้งาน cloud data หวังว่าจะเห็นการนำไปประยุกต์ให้เกิดโปรเจค ที่มีประโยชน์นะครับ
ทำไมมันถึงส่งได้ครั้งเดียวอะครับ ทั้งๆที่มันวนลูป
แล้วเวลาจะรับข้อมูลจาก data.sparkfun ต้องทำอย่างไรหรอครับ
เป็นยังคุณอะ
โค๊ดที่จะทำให้มันส่งข้อมูล ทุก 1 นาที โดยไม่ใช้ delay() ทำไงครับ