Arduino Data logger 

 

Arduino Data logger 

โสรัตย์ อุนหะวรากร

อภิรักษ์ นามแถ่ง

งบประมาณ 950 บาท

 

ในบทความนี้เราจะมาทดลองสร้างอุปกรณ์ที่เรียกว่า Data logger สำหรับใช้ในการวัดค่าและบันทึกค่าข้อมูลกัน เพื่อนำมาวิเคราะห์ปัญหาหรือเฝ้าระวังเหตุการณ์ต่างๆ โดยมี Arduino เป็นพระเอกของเรากัน ข้อดีก็คือสามารถสร้างได้ง่าย ราคาไม่แพง แถมยังสามารถดัดแปลงเพิ่มความสามารถต่างๆ ได้ตามที่เราต้องการอีกด้วย

 

Data logger หรือ Data recorder ฟังจากชื่อแล้วคุณผู้อ่านหลายท่านอาจคิดว่าเป็นอุปกรณ์ที่อยู่ไกลตัว และเราเองก็คงไม่ได้ใช้งานมันมากเท่าไร แต่อันที่จริงอุปกรณ์ที่ว่านี้อยู่ใกล้ตัวเรามากๆ และมีประโยชน์มากด้วย เช่น Enviromental Data logger ซึ่งใช้เก็บข้อมูลสภาพภูมิอากาศ, OBD data logger ที่ติดตั้งอยู่ในรถยนต์เพื่อตรวจสอบและบันทึกข้อมูลที่เกี่ยวกับการทำงานของเครื่องยนต์, Flight Data Recorder (FDR) หรือกล่องดำที่เก็บข้อมูลการทำงานต่างๆ ภายในเครื่องบิน, GPS logger สำหรับการบันทึกพิกัดเส้นทางการเคลื่อนที่ของยานพาหนะ เป็นต้น และถ้าลองสังเกตุให้ดีๆ จะพบว่ายังมีอุปกรณ์ซึ่งทำหน้าที่ในลักษณะของ Data logger ที่มีอยู่รอบตัวของเรานั้นยังมีอีกมากทีเดียว  อันที่จริงในท้องตลาดบ้านเราก็มี Data logger อยู่หลากหลาย ทั้งที่ผลิตขึ้นในประเทศของเราและจากต่างประเทศ ทั้งแบบที่มีราคาถูกหรือแพงมีให้เลือกใช้อยู่สารพัดเลยทีเดียว

ซึ่งนั่นทำให้เมื่อต้องการหามาไว้ใช้งาน ทางเลือกของการซื้อมาใช้แบบสำเร็จรูปนั้นก็จะสะดวกมาก หากแต่ว่าอุปกรณ์ในท้องตลาดก็อาจไม่ได้ตรงกับความต้องการของเราเสมอไป และบางครั้งเราก็อาจจะต้องจ่ายเงินเพิ่มเพื่อให้ได้ฟังก์ชันการทำงานที่ต้องการ ในกรณีที่ว่านั้นบางทีการสร้างขึ้นเพื่อใช้งานก็ดูจะตอบโจทย์ได้มากกว่า ในบทความตอนนี้เราก็เลยจะมาทดลองสร้าง Data logger กัน ด้วย Arduino และ Data Logger Shield ที่จะรับบทเป็นพระเอก โดยในที่นี้ใช้ Data logger ของเราจะมีเซนเซอร์ที่ใช้อ่านค่าระดับแสง, ค่าอุณหภูมิ, ค่าความชื้นสัมพัทธ์ และค่าเวลาที่ทำการวัด (หรือ timestamp นั่นเอง) นำมาบันทึกลงยัง SD Card เป็นโครงงานที่สามารถสร้างเองได้ง่าย ซ่อมแซมเองก็ไม่ยาก ใช้งานได้จริง แถมยังราคาไม่แพง และยังสามารถดัดแปลงเพื่อเพิ่มความสามารถต่างๆ ตามที่ต้องการได้อีกด้วย

รูปที่ 1 แผนผังวงจรของโครงงาน ประกอบด้วยบอร์ด Arduino UNO R3 และ Data logger shield และการต่อวงจรเข้ากับโมดูลเซนเซอร์


รูปที่ 2 โมดูลเซนเซอร์วัดความเข้มแสง (LDR)


รูปที่ 3 โมดูลเซนเซอร์วัดอุณหภูมิและความชื้นสัมพัทธ์ (DHT11)

หลักการทำงาน

ภาคฮาร์ดแวร์ รูปที่ 1 เป็นแผนผังวงจรของโครงงานที่ประกอบด้วยฮาร์ดแวร์ส่วนหลัก ได้แก่ บอร์ด Arduino UNO R3, บอร์ด Data Logger Shield โดยมีไมโครคอนโทรลเลอร์ ATmega328 ที่ติดตั้งอยู่บน Arduino UNO R3 เป็นส่วนควบคุมการทำงานหลักซึ่งจะทำงานตามซอร์สโค้ดโปรแกรมที่เราได้เขียนไว้ ในขณะที่ Data Logger Shield เป็นส่วนที่ใช้ติดตั้งเซนเซอร์วัดความเข้มแสง (LDR) และเซนเซอร์วัดระดับอุณหภูมิและระดับความชื้นสัมพัทธ์ (DHT11) เอาไว้ โดย LDR จะถูกต่อเข้า ADC ที่ตรงกับขา A1 ของ UNO R3 ส่วน DHT11

ซึ่งเป็นไอซีวัดอุณหภูมิและความชื้นสัมพัทธ์ซึ่งสื่อสารข้อมูลผ่านทางบัส (bus) one-wire จะถูกต่อเข้ากับพอร์ต Digital I/O ที่ตำแหน่ง D2 ของ UNO R3 เช่นกัน ค่าความเข้มแสงของสิ่งแวดล้อมสามารถถูกอ่านค่าได้จากเซนเซอร์ LDR (ดังรูปที่ 2) โดย LDR ที่ว่านี้ถูกต่ออนุกรมอยู่กับตัวต้านทาน 10K เนื่องจากคุณสมบัติของ LDR ที่จะให้ค่าความต้านทานแปรตามระดับแสงที่ตกกระทบยังตัวของมัน จึงทำให้แรงดันที่ตกคร่อมที่ขาทั้ง 2 ขา เปลี่ยนตามไปด้วยระดับความเข้มแสงนั่นเอง ค่าแรงดันที่ว่านี้จะถูกส่งต่อไปยังส่วนแปลงสัญญาณอะนาลอกเป็นดิจิตอล (Analog-to-Digital Conversion หรือ ADC) ซึ่งต่ออยู่กับอินพุตขา A1 ของ UNO R3 นั่นเอง ช่วยให้เราสามารถอ่านค่ามาใช้งานได้อย่างถูกต้อง

รูปที่ 3 เป็นโมดูลเซนเซอร์ DHT11 ซึ่งมีหน้าที่อ่านค่าอุณหภูมิและความชื้นสัมพัทธ์จากสิ่งแวดล้อม (Temperature and Humidity Sensor Module) การสื่อสารเพื่ออ่านค่าข้อมูลและควบคุมการทำงานจะทำโดยผ่านบัส one-wire เซนเซอร์ตัวนี้สามารถทำงานได้กับแหล่งจ่ายพลังงานตั้งแต่ 3.3V – 5.5V โดยสามารถจะวัดค่าความชื้นสัมพัทธ์และอุณหภูมิโดยจะให้ข้อมูลออกมาเป็นแบบดิจิตอล จึงไม่ต้องการการสอบเทียบค่า, ใช้พลังงานต่ำ ขณะอยู่ในโหมดแสตนบาย (standby) ใช้กระแสประมาณ 150 ไมโครแอมป์ และในขณะแปลงสัญญาณหรือส่งข้อมูล ใช้กระแสประมาณ 2.5 มิลลิแอมป์ และใช้ขาสัญญาณเพียงแค่ขาเดียวเท่านั้นในการทั้งรับและส่งข้อมูล ค่าเวลาที่ทำการวัด หรือ timestamp ได้มาจากไอซี DS1307 ซึ่งมีหน้าที่เป็นนาฬิกานั่นเอง

ไอซีที่ว่านี้จะสื่อสารกับ UNO R3 ผ่านทางบัส I2C ซึ่งอยู่ที่ขา SDA และ SCL โดยที่นาฬิกาของเราจะยังคงทำงานได้แม้ถอดแหล่งจ่ายไฟเลี้ยงของบอร์ดออกไปแล้ว จากการมีแบตเตอรี่ขนาดเล็ก (CR1220) ที่จะคอยจ่ายไฟเลี้ยงให้ตลอดเวลา จึงช่วยให้ค่าเวลาที่ทำการวัดมีความถูกต้องอยู่เสมอได้นั่นเอง ข้อมูลที่อ่านได้มาจากเซนเซอร์ รวมทั้งค่าเวลาที่ทำการวัดด้วย

ทั้งหมดจะถูกนำมาบันทึกลงยัง SD Card ซึ่งถูกควบคุมจาก UNO R3 อีกเช่นกัน ผ่านทางพอร์ตสื่อสาร SPI ที่ขา D10 – D13 โดยที่ระบบจัดเก็บไฟล์ หรือ FAT filesystem ที่ถูกใช้ในการเขียนไฟล์ข้อมูลลงยัง SD Card ในที่นี้ก็เป็น FAT32 นั่นทำให้ขนาดความจุของ SD card ที่ใช้ได้สูงสุดสำหรับโครงงานนี้ก็คือ 4GByte  โดยไฟล์ข้อมูลที่บันทึกอยู่ใน SD Card จะถูกเก็บอยู่ในรูปไฟล์ข้อความ (Text file) ในฟอร์แมต CSV หรือ Comma-Separated Values ซึ่งเป็นไฟล์ที่เราสามารถเปิดอ่านได้จากบนเครื่องคอมพิวเตอร์ทั้ง PC และ Mac โดยใช้ซอฟต์แวร์สเปรตชีต (spreadsheet) เช่น Microsoft Excel หรือ Apple Numbers โดยสามารถเปิดดูและสามารถสร้างชาร์ตในรูปแบบต่างๆ เพื่อให้เกิดความสะดวกในการวิเคราะห์ข้อมูลได้ด้วย

รูปที่ 4 Data Logger Shield


รูปที่ 5 ตำแหน่งการเชื่อมสายเข้ากับโมดูลเซนเซอร์ (มองจากด้านบน)


รูปที่ 6 ตำแหน่งการเชื่อมสายเข้ากับโมดูลเซนเซอร์ (มองจากด้านล่าง)

ขั้นตอนการสร้าง

ในการสร้างโครงงานนี้ เนื่องจากฮาร์ดแวร์ที่ใช้งานเป็นบอร์ดสำเร็จรูป ขั้นตอนของการสร้างเราก็เลยไม่ต้องลงไม้ลงมือกับการทำแผ่นวงจรพิมพ์มากเหมือนอย่างโครงงานทั่วไปแบบที่ทางเซมิฯ เคยได้สร้างทดลองกันมา บนบอร์ด Data logger shield มีพื้นสำหรับการต่อวงจรเพิ่มเติมมาให้ด้วย ซึ่งเราจะใช้พื้นที่ส่วนนี้ในการติดตั้งเซนเซอร์เอาไว้ เนื่องจากเซนเซอร์ทั้งสองตัวมีขนาดเล็กและมีขาที่ต้องใช้งานเพียง 3 ขาเท่านั้น คือ ขาสัญญาณ, ขาไฟเลี้ยง และขากราวด์ การบัดกรีตรงจุดที่ว่านี้จึงทำได้ไม่ยาก ที่ดูจะต้องลงมือมากขึ้นสักหน่อยคงเป็นเรื่องการเชื่อมสาย คือ การต่อเชื่อมสายระหว่างเซนเซอร์มายังตำแหน่งขาของ UNO R3 โดยในเครื่องต้นแบบของทางผู้เขียนได้ทำการบัดกรีเชื่อมต่อสายเอาไว้ทั้งจากทางด้านบนและด้านล่างของ Data logger shield ดังแสดงในรูปที่ 5 และ 6 ในขั้นตอนนี้คงต้องขอให้คุณผู้อ่านตรวจดูตำแหน่งขาต่างๆ ให้ถูกต้องด้วย ไม่อย่างนั้นอาจทำบอร์ดไม่สามารถทำงานได้ หรืออย่างเลวร้ายก็อาจทำให้เกิดการพังเสียหายได้ ก็ขอให้ระมัดระวังตรงจุดที่ว่านี้ด้วยครับ

รูปที่ 7 การตั้งเวลาให้กับ RTC (DS1307) ผ่านทาง Serial Monitor


รูปที่ 8 หลังจากรีบูตแต่ละครั้ง โปรแกรมจะจรวจสอบ SD Card ถ้าอยู่ในสภาพพร้อมทำงาน ที่ หน้าต่างของ Serial Monitor จะแสดงข้อความ Initializing SD card…card initialized. พร้อมกับ LED1 มีสถานะติดสว่าง และมีชื่อไฟล์ที่ใช้บันทึกข้อมูล (.CSV) อยู่ในปัจจุบัน และค่าข้อมูลจากการวัดในแต่ละรอบแสดงเป็นบรรทัดเรียงต่อมาเรื่อยๆ


รูปที่ 9 ในกรณีที่เกิดความผิดพลาดขึ้นที่ SD Card ที่หน้าต่าง Serial Monitor จะมีข้อความ Initializing SD card…error: Card failed, or not present แสดงขึ้น และ LED1 มีสถานะดับสนิท เพื่อบอกว่ามีความผิดปกติบางอย่างเกิดขึ้น


รูปที่ 10 หน้าต่างของ Serial Monitor ขณะอ่านค่าข้อมูลบันทึกลง SD Card ในกรณีที่การทำงานทุกอย่างเป็นไปอย่างถูกต้อง ราบรื่น

หลังจากติดตั้งเซนเซอร์เข้ากับบอร์ด Data logger shield เรียบร้อยแล้ว ก็ให้นำบอร์ดสวมลงบน Arduino UNO R3 ที่จะต้องทำเป็นขั้นต่อไปคือการโปรแกรมหน่วยความจำโปรแกรมของไมโครคอนโทรลเลอร์ ATmega328 บนบอร์ด Arduino UNO R3 ด้วยซอร์สโค้ดซึ่งดาวน์โหลดได้จากเว็บไซต์ http://electronics.se-ed.com/download โดยสามารถทำโดยใช้เครื่องมือหลักคือ Arduino IDE นั่นเอง หลังจากนั้นให้ใส่แบตเตอรี่ CR1220 ที่บน Data logger shield และเสียบ SD Card เข้าไว้ในช่องรับการ์ด และตรวจสอบความถูกต้องโดยรวมก่อนว่าสายเชื่อมต่างๆ ได้ต่อไว้ถูกตำแหน่งและไม่มีการลัดวงจร เพื่อเตรียมสำหรับการทดสอบ

การทดสอบ

ในครั้งแรกที่เริ่มจ่ายไฟเลี้ยงให้กับบอร์ดอาจเป็นไปได้ที่ค่าเวลาและวันที่ภายใน RTC (DS1307) อาจไม่ตรงกับค่าเวลาปัจจุบัน จึงจำเป็นจะต้องตั้งค่าเวลาให้ถูกเสียก่อน ซึ่งการตั้งค่าเวลาที่ว่านี้สามารถการใช้ข้อความ (String) ส่งผ่านทางหน้าต่าง Serial Monitor โดยข้อความที่ว่านี้มีรูปแบบหรือฟอร์แมตเป็น |Tddmmyyhhmmss# ยกตัวอย่างเช่น ในรูปที่ 7 เป็นการพิมพ์ส่งค่าข้อความเวลาเป็น |T180917172700# เมื่อกดปุ่ม Send (ที่บนหน้าต่างของ Serial Monitor) ข้อความก็จะถูกส่งไปยังบอร์ด UNO R3 ของเราโดยความหมายก็คือ การตั้งเวลาปัจจุบันของ RTC ให้เป็น วันที่ 18 เดือนกันยายน ปี ค.ศ. 2017 ที่เวลา 11:30:25 เป็นต้น

หลังจากรีบูต (reboot) แต่ละครั้ง โปรแกรมจะเริ่มการทำงานโดยตรวจสอบว่ามี SD Card อยู่ในช่องเสียบหรือไม่ ตรวจดูชนิดระบบไฟล์ (File system) ที่ใช้ในว่าเป็นแบบใด (เช่น FAT16, FAT32) หากไม่พบความผิดปกติ จะมีข้อความ “Initializing SD card…card initialized.” แสดงที่ Serial Monitor พร้อมกับแสดงชื่อไฟล์ (.CSV) ที่ใช้บันทึกค่าอยู่ในขณะนั้น (ดังรูปที่ 8) พร้อมกับ LED1 จะมีสถานะติดสว่าง เป็นการแสดงว่าฮาร์ดแวร์ทั้งหมดพร้อมทำงาน ในทางตรงกันข้าม หากพบความผิดปกติที่ SD Card หรือพบว่าไม่มี SD Card อยู่ในช่องรับ ที่ Serial Monitor จะแสดงข้อความ “Initializing SD card… error: Card failed, or not present” (ดังรูปที่ 9) และ LED1 มีสถานะดับสนิท (ดังนั้นถ้าหาก LED1 ไม่ติดสว่างหลังจากการรีบูตก็สงสัยได้เลยว่าต้องมีความผิดปกติบางอย่างเกิดขึ้นแล้วแน่ๆ)

รูปที่ 11 บรรทัดในซอร์สโค้ดที่ใช้กำหนดรอบเวลาในการอ่านค่าจากเซนเซอร์สำหรับจัดเก็บค่า

หลังจากนั้น เมื่อถึงรอบเวลาที่กำหนดไว้ (โปรแกรมในเครื่องต้นแบบกำหนดรอบเวลาที่ว่านี้ไว้ที่ 10 วินาที ซึ่งคุณผู้อ่านสามารถแก้ไขรอบเวลาดังกล่าวได้จากซอร์สโค้ดที่บรรทัด #define TimeLogger ซึ่งแสดงอยู่ในรูปที่ 11) ในแต่ละรอบข้อมูลจากเซนเซอร์ก็จะถูกอ่านมาแสดงผลยัง Serial Monitor พร้อมกับถูกบันทึกลงยัง SD Card แล้วตามมาด้วย LED2 จะติดสว่างขึ้นประมาณ 0.5 วินาที เป็นการบอกว่าข้อมูลถูกบันทึกเรียบร้อยแล้ว สถานะของทั้ง LED1 และ LED2 จะช่วยได้มากในการแสดงสถานะของฮาร์ดแวร์ขณะใช้งานจริงซึ่งการต่อบอร์ดเข้ากับคอมพิวเตอร์ เพื่อเช็คดูข้อมูลต่างๆ ผ่าน Serial Monitor อาจไม่สะดวกนัก


รายการอุปกรณ์

Arduino UNO R3     1 บอร์ด

Data logger shield (พร้อมแบตเตอรี่ CR1220)       1 บอร์ด

อะแดปเตอร์ 7-12V/0.5A       1 ชุด

สาย USB สำหรับโปรแกรม Arduino UNO R3 1 เส้น

SD Card ขนาด 4GB     1 ชุด

โมดูลเซนเซอร์วัดอุณหภูมิและความชื้นสัมพัทธ์ (DHT11)      1 ชุด

โมดูลเซนเซอร์วัดความเข้มแสง (LDR)    1 ชุด

สายไฟสำหรับเชื่อมวงจร


สำหรับการจะเพิ่มฟังก์ชันการทำงานให้กับ Data logger เช่น ให้เริ่มวัดค่าจากช่วงเวลาหนึ่งถึงเวลาอีกเวลาหนึ่ง หรือ ต้องการให้พอร์ตอินพุต/เอาต์พุตของบอร์ด ปิดหรือเปิดอุปกรณ์หรือเครื่องจักรอื่นใดก่อน หรือหยุดการทำงานเพื่อรอสถานะบางอย่าง เป็นต้น เราสามารถทำเรื่องที่ว่านี้ได้โดยการเขียนแก้ไขซอร์สโค้ดโปรแกรมภายในไมโครคอนโทรลเลอร์ ATmega328 ซึ่งโปรแกรมที่ว่านี้ก็คือไฟล์ที่เราได้ดาวน์โหลดมาเมื่อขั้นตอนการประกอบนั่นเอง ซึ่งจำเป็นจะต้องอาศัยความรู้ในการเขียนโปรแกรมภาษา C ในการแกะรอย และแก้ไขซอร์สโค้ดของโปรแกรมที่มีอยู่เป็นจุดตั้งต้น บวกกับการทดลอง เพื่อให้ได้การทำงานที่คุณผู้อ่านต้องการ ซึ่งเชื่อว่าไม่ยากเกินความสามารถของคุณผู้อ่านอย่างแน่นอนครับ.

 

ส่วนที่เหลือก็คงเป็นเรื่องไอเดียและความคิดสร้างของคุณผู้อ่าน ที่จะไปประยุกต์ต่อยอดเข้ากับงานต่างๆ ที่ต้องการแล้วล่ะครับ ตรงจุดนี้คงต้องอาศัยการทดลองดู ถ้าหากติดขัดตรงไหนสามารถสอบถามเข้ามาที่กอง บก. เซมิฯ ได้เลย หรือถ้านำไปสร้างต่อยอดเป็นโครงงานสนุกๆ เสร็จแล้วก็อย่าลืมนำมาเล่าสู่กันฟังบ้างครับ .

 

Leave a Comment