ArduinoEmbeded SystemInternet of thing

ก้าวแรกสู่ IoT : ESP8266 บันทึกข้อมูลเข้า Cloud ของ data.sparkfun.com

By April 10, 2015 April 14th, 2015 4 Comments

ผมเชื่อว่าหลายคน เคยเจอเหตุการณ์นี้ อยากจะบันทึกค่าการทดลอง ทุกๆ 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 ออกมาขาย หลายๆ ดูคุ้มที่จะใช้มากขึ้นเลยที่เดียว

DSC01405

การ Pushing ข้อมูลเข้า Data.SparkFun.com

การนำข้อมูลขึ้นไปเก็บไว้ใน database ทาง sparkfun จะเรียกว่าการ push data โดยวิธีการของทาง Sparkfun จะใช้รูปแบบ  HTTP request  ยิง link ไปยังเวป การส่งข้อมูลสะดวกและง่ายมากๆ ผ่านเวป ก้อทำงานได้

ตัวอย่างข้อมูลที่ส่งไปบันทึก ที่ data.sparkfun.com ซึ่งเราจะสามารถ download ไฟล์ที่เก็บไว้ในรูปแบบ csv เอาไป plot กราฟเองก็ได้ หรือ จะทำ web มาดึงข้อมูลในรูปแบบ JSON ไปแสดงกราฟ ก็ได้นะครับ

capture-20150410-150247

การใช้นำไปงาน

1. มาถึงตอนนี้ ทางผมคงเอาบอกวิธีการนำ ESP8266 ไปใช้งานส่งข้อมูลเข้า Server ล่ะกันครับ ก่อนอื่นเลยเราต้องลงทะเบียน เพื่อ add field data ได้สักก่อน

capture-20150410-160540

2.  มาถึงหน้านี้ กรอกข้อมูล ที่จำเป็น จากนั้นกด Save

capture-20150410-161015

3. จากนั้น เราจะได้เข้าไปยังหน้า Key ซึ่งเราจะได้ค่า Public Key และ Private Key เราจะใช้ Key นี้ ใน ตอนส่ง HTTP Request ครับ

capture-20150410-161728

4. มาดูตัวอย่างการใช้ Key ให้เรามองว่า การส่ง Http Request ในตอนนี้มันเหมือน การเข้าลิงค์เวปครับ เราส่ง Request ไป ตัว server จะรับ Request และ Get Parameter  ไปด้วย ซึ่ง Format ถูกต้อง ตัวเวป จะเก็บข้อมูลเข้าไปใน ฐานข้อมูลเองครับ

capture-20150410-162325

ลองกด 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.
 *
 */

#include 

const 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 หวังว่าจะเห็นการนำไปประยุกต์ให้เกิดโปรเจค ที่มีประโยชน์นะครับ

chang

ชื่อ “ช้าง” ส่วนมากเขาจะเรียกว่า “พี่ช้าง” แล้ว มีความสนใจทางเทคโนโลยีทางคอมพิวเตอร์ อิเล็กทรอนิกส์ และ หุ่นยนต์ เป็นทั้งนักคิด นักประดิษฐ์ ชอบทดลองเล่น จนเดี่ยวนี้รู้สึกว่าจะเล่นมากกว่ามืออาชีพไปสักแล้ว

4 Comments

  • Disantos Pongpua says:

    ทำไมมันถึงส่งได้ครั้งเดียวอะครับ ทั้งๆที่มันวนลูป

  • Disantos Pongpua says:

    แล้วเวลาจะรับข้อมูลจาก data.sparkfun ต้องทำอย่างไรหรอครับ

  • กว่าจะเป็นสารพัดช่าง คิด says:

    โค๊ดที่จะทำให้มันส่งข้อมูล ทุก 1 นาที โดยไม่ใช้ delay() ทำไงครับ

Leave a Reply to Disantos Pongpua Cancel Reply