มาเริ่มต้นกันกับ NodeMcu v.2 ตอนที่ 5 การอ่านค่า sensor ด้วย NodeMCU


สวัสดีครับ เมื่อไม่นานมานี้เจ้าของบล็อกได้ทดลองเล่นกับพวกโมดูลเซนเซอร์ต่าง ๆ โดยใช้ NodeMCU ซึ่งก่อนหน้านี้เจ้าของบล็อกใช้ Arduino มาสักพักนึง แต่เมื่อมาเทียบกับ NodeMCU ตัวนี้แล้วรู้สึกว่า เหมาะกับการใช้งานในด้าน IoT ยิ่งนัก อ่านค่าจากเซนเซอร์แล้วส่งค่าขึ้น Cloud ทันที แต่บทความนี้จะพูดถึงการอ่านค่ามาเก็บไว้ตัวแปรกันก่อนนะครับ


Sensor module ที่ใช้ก็จะมี
  • DHT11 วัดอุณหภูมิและความชื้น
  • DS18B20 วัดอุณภูมิเป็นแบบ One-Wire
  • ZX-HIH4030 จะเป็นตัววัดความชื้น (จะพูดในบทความต่อไป เนื่องจาก sensor นี้ค่าที่อ่านเป็น Analog ซึ่งเจ้าของบล็อกจะอธิบายเกี่ยวกับ ADC Pin เนื่องจากบทความนี้จะยาวเกินเหตุทำให้ไม่น่าอ่าน)

Sensor module DHT11 นั้นเจ้าของบล็อกจะใช้ library ของทาง adafruit ซึ่งสามารถ download ได้จาก ที่นี่  ซึ่ง library นี้ก็ใช้ง่ายมาก ๆ เขียนคำสั่งไม่กี่บรรทัดก็สามารถดึงค่าอุณหภูมิและค่าความชื้นมาได้แล้ว

สำหรับการต่อวงจรเจ้าของบล็อกก็จะต่อตามนี้นะครับ


ใน library มีฟังชั่นที่ใช้หลัก ๆ ประมาณนี้ครับ ต่อมาเราก็มาเขียนโปรแกรมในการใช้งานกันเลย


ตามตัวอย่าง code ด้านบนก็จะได้ผลลัพธ์ออกมาเช่นนี้


จะสังเกตุเห็นว่าค่าที่อ่านมานั้นยังมีค่า error ที่ไม่สามารถอ่านได้ก็คือ nan มันอาจจะเป็น bug ของทางโปรแกรมหรือทาง hardware ก็ได้แต่ในส่วนนี้เราสามารถเขียนให้มันแสดงเฉพาะตอนที่ไม่มี error ก็ได้ ซึ่งก็เพิ่มเงื่อนไขเข้าไปอีกในโปรแกรม



จากที่ใส่เงื่อนไขดังกล่าวเข้าไป ผลลัพธ์ของโปรแกรมก็จะแสดงออกมาแบบไม่มี error ใด ๆ



สำหรับตัวนี้เจ้าของบล็อกจะขอพูดถึงแค่นี้ หากผู้อ่านอยากเล่นมากกว่านี้ก็ลองจาก function ที่ทาง adafruit มีให้ใน library ได้เลยนะครับ



Sensor ตัวต่อไปนั้นก็คือ DS18B20 ครับ ตัวนี้จะส่งข้อมูลกันแบบ One Wire นะครับ สามารถนำตัว sensor นี้มาต่อได้หลาย ๆ ตัวโดยใช้สายสัญญาณเพียงเส้นเดียว เพราะแต่ละใน sensor นั้นจะมีค่า address ที่ระบุตัวตนของ sensor อยู่แล้วจึงสามารถอ่านแยกค่ากันได้

ในการใช้งานแบบ one wire นั้น สายสัญญาณข้อมูล DQ จะต้องมีสถานะปกติที่ลอจิกสูงหรือต้องมีไฟเลี้ยงตลอดเวลา สามารถทำได้โดยการต่อตัวต้านทานประมาณ 5 กิโลโอห์ม pullup ไว้กับไฟเลี้ยง ดูตามรูปภาพด้านล่างประกอบเลยครับ


ขอบคุณรูปภาพจาก http://www.mind-tek.net/ds18b20.php

ก็จะประมาณนี้นะครับ ส่วนใน Arduino IDE นั้นมี Examples Library ของ One Wire อยู่แล้วและสามารถใช้ได้กับตัวเซนเซอร์ตัวนี้ได้ด้วยอันดับแรกก็เลือก Examples ตามตัวอย่างเลยครับ


เราก็จะได้ตามด้านล่างนี้ ในตัวอย่างต่อไปนี้เจ้าของบล็อกต้องการอ่านค่าเพียงค่าเดียวนะครับ ซึ่งถ้าหากต้องการอ่าน 2 ค่าหรือมากกว่าก็ทำตามตัวอย่างต่อไปนี้ได้เช่นกัน

ตัวนี้คือตัวที่เลือกจาก Example ตรง ๆ เจ้าของบล็อกจะทำให้มันเป็นฟังชั่นแทนนะครับ


ตอนนี้ก็ได้ฟังชั่นแยกออกมาให้จัดการง่าย ๆ แล้วครับ ในฟังชั่นเจ้าของบล็อกได้เพิ่มพารามิเตอร์เข้าไปในฟังชั่นก็คือ void readTemp(float* dataTemp) ในส่วนที่ขีดเส้นใต้คือพารามิเตอร์ที่เพิ่มเข้าไป เป็นการรับพารามิเตอร์ในรูปแบบ pointer และสังเกตุในส่วนท้ายของฟังชั่นก็จะให้ตัวแปร pointer นั้นเท่ากับ ค่าอุณหภูมิที่อ่านได้ในฟังชั่นเพื่อที่จะให้ค่าตัวแปรที่ส่งมาที่ฟังชั่นนี้เปลี่ยนค่า สุดท้ายก็อย่าลืมเปลี่ยน baud rate นะครับ เพราะใช้ NodeMCU ต้องใช้ baud rate ที่ 115200

ก็ลองมาทดลองกับ sensor กันเลย สังเกตุจากตัวแปรที่เพิ่ม และ ในฟังชั่น void loop() ว่ามีการเรียกใช้งานยังไง


จากโค้ดก็จะมีการเพิ่มตัวแปร เปลี่ยน pin นิดหน่อย โดย pin นั้นเจ้าของบล็อกเลือกเป็น pin D3 และสร้างตัวแปร float ขึ้นมา 1 ตัวสำหรับเก็บค่าอุณหภูมิ

ส่วนใน void loop() นั้น ในการเรียกฟังชั่นและการใส่พารามิเตอร์นั้น จะเป็นการส่งค่า address ของตัวแปร temp ไปยังฟังชั่น readTemp() ก็ให้มันจัดการกันในฟังชั่นเสร็จแล้ว ตัวแปรเราก็จะเปลี่ยนค่าไปเรื่อย ๆ ตามที่อ่านอุณหภูมิได้ มาดูผลลัพธ์ของ program นี้กันครับ


แค่นี้ก็เสร็จแล้วครับ สำหรับผู้อ่านท่านไหนที่ยังงง ๆ เกี่ยวกับตัวแปรประเภท pointer ลองกลับไปศึกษาทบทวนดูนะครับ เพราะมีประโยชน์มากในการเขียนโปรแกรม

บทความนี้เป็นบทความเกริ่น ๆ ก่อนที่จะนำค่าอุณหภูมิที่อ่านค่าได้นี้ส่งไปยัง Thingspeak และก็สร้างเว็ป Server ขึ้นมาเพื่อดูค่าอุณหภูมิผ่าน Internet กัน โดย web server นั้นเจ้าของบล็อกได้ลองใช้ host ของ github ซึ่งให้ใช้งานได้ฟรี เดี๋ยวจะพูดต่อในบทความต่อไปจากจบเรื่อง sensor จาก analog ครับ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]