การทำวง NeoPixel ให้ทำงานตามอุณหภูมิจากเซ็นเซอร์ DHT11 ด้วย Arduino Nano เป็นโปรเจคที่เจ๋งมาก เพราะมันผสมผสานการวัดอุณหภูมิกับการแสดงผลแสงสีได้อย่างลงตัว มาดูกันว่าน้องจะสร้างระบบแบบนี้ได้ยังไง โปรเจคนี้ที่เราเรียกกันว่า **Temperature Control NeoPixels** จะเปลี่ยนทั้งห้องให้เป็นจอแสดงผลเลยทีเดียว ด้วยการเชื่อมโยงข้อมูลอุณหภูมิกับสี แสงในห้องจะช่วยเตือนน้องได้ทันทีว่าอุณหภูมิเปลี่ยนไปแล้ว!
ของที่ต้องเตรียม
Arduino Nano
เซ็นเซอร์วัดอุณหภูมิและความชื้น DHT11
วง Neo Pixel Ring
สายจัมเปอร์
สั่งทำ PCB สำหรับโปรเจคของน้อง
ถ้าอยากได้ PCB ราคาดี คุณภาพจัดส่งไว ลองไปศึกษาดูได้ มีหลายบริการออนไลน์ให้เลือกใช้เลย
บริการหลายเจ้ามักมีส่วนลดค่าจัดส่งสำหรับออเดอร์แรกด้วย ส่งไฟล์ Gerber ไปก็ได้บอร์ดคุณภาพดีกลับมาเร็วๆ นี้ บางที่ก็มีบริการครบวงจรตั้งแต่ดีไซน์ไปจนถึงทำกล่องใส่เลย แถมยังมีฟังก์ชันดู Gerber ออนไลน์ให้ตรวจก่อนสั่งผลิตอีกด้วย มีระบบสะสมแต้มแลกของฟรีในร้านของขวัญอีกต่างหาก
ขั้นตอนที่ 1: ต่อวงจรฮาร์ดแวร์
เริ่มต้นด้วยการต่อเซ็นเซอร์ DHT11 และวง Neo Pixel Ring เข้ากับ Arduino Nano ครับ เซ็นเซอร์ DHT11 ต่อกับขา Digital ไหนของ Arduino Nano ก็ได้ ส่วนวง Neo Pixel Ring ให้ต่อกับขา D2 ของ Arduino Nano

ขั้นตอนที่ 2: ติดตั้งไลบรารี
น้องจะต้องติดตั้งไลบรารี DHT และไลบรารี Adafruit Neo Pixel ใน Arduino IDE ของน้องก่อน ไลบรารีพวกนี้มีฟังก์ชันจำเป็นสำหรับการสื่อสารกับเซ็นเซอร์ DHT11 และวง Neo Pixel
เริ่มจากไปที่ Sketch > Include Library > Manage Libraries...

ใน Library Manager จะมีช่องค้นหา พิมพ์ “DHT sensor library” ลงไปในช่องนั้น

ในผลการค้นหา หาไลบรารีชื่อ “DHT sensor library” โดย Adafruit คลิกที่มัน แล้วกดปุ่ม “Install”
แค่นี้แหละ! น้องติดตั้งไลบรารีสำหรับเซ็นเซอร์ DHT11 ใน Arduino IDE สำเร็จแล้ว ไลบรารีนี้ก็พร้อมให้เรียกใช้ในสเก็ตช์ของน้องแล้วล่ะ
ขั้นตอนที่ 3: เขียนโปรแกรมให้ Arduino
ขั้นต่อไปคือเขียนโปรแกรมให้ Arduino Nano โปรแกรมควรอ่านค่าอุณหภูมิจากเซ็นเซอร์ DHT11 และเปลี่ยนสีของวง Neo Pixel Ring ตามอุณหภูมินั้น
ตัวอย่างเช่น น้องสามารถตั้งโปรแกรมให้วง Neo Pixel แสดงสีน้ำเงินเมื่ออุณหภูมิต่ำกว่าค่าที่กำหนด

แสดงสีเขียวเมื่ออุณหภูมิอยู่ในช่วงที่สบายๆ

และแสดงสีแดงเมื่ออุณหภูมิสูงเกินค่าที่กำหนด งานนี้จัดไปวัยรุ่น! สู้งานนะน้อง ห้ามช็อตนะตัวนี้

รายละเอียดเทคนิคแบบจัดเต็ม
แม้ว่า DHT11 จะเป็นเซ็นเซอร์ดิจิทัลแบบง่ายๆ แต่การใช้งานขั้นสูงกว่านี้สามารถใช้อุปกรณ์อย่าง **NTC 10K Thermistor (เทอร์มิสเตอร์)** เพื่อให้ได้ค่าตอบสนองแบบอนาล็อกที่เร็วกว่าได้ จุดหลักของมันคือการแปลงค่าตัวเลขอุณหภูมิให้เป็นสีที่แสดงผลออกมา
การแปลงข้อมูลตัวเลขเป็นสีแบบ HSV: แทนที่จะใช้ค่า RGB ตรงๆ วิธีที่สวยงามและแม่นยำกว่าคือการใช้สเปกตรัมสี HSV (Hue, Saturation, Value) น้องต้องกำหนดพารามิเตอร์การทำงาน เช่น 15°C อาจตั้งให้เป็นสีน้ำเงินเย็นจัด (Pure Cold Blue) และ 32°C อาจตั้งให้เป็นสีแดงร้อนระอุ (Searing Red) โดยใช้ฟังก์ชัน `map()` ในการแปลงค่าอุณหภูมิที่อ่านได้ให้เป็นค่า Hue (สี) ในไลบรารีอย่าง FastLED นั้น สีน้ำเงินมักอยู่ที่ Hue 160 และสีแดงอยู่ที่ Hue 0 ดังนั้นอุณหภูมิห้องประมาณ 23°C ก็จะถูกแมปให้เป็นสีเขียวสบายตา (Hue ~80) จากนั้น Arduino ก็จะส่งสีนี้ไปยัง LED ทั้งหมดด้วยคำสั่งอย่าง `fill_solid()` ได้เลย ง่ายมั้ยล่ะ!
ข้อควรคิดสำหรับการติดตั้งในสเกลใหญ่: สำหรับโปรเจคใหญ่ๆ ที่ใช้แถบ LED แบบ WS2812B NeoPixel การจัดการไฟเลี้ยงเป็นเรื่องสำคัญมาก ต้องใช้แหล่งจ่ายไฟ 5V ขนาดใหญ่ เพราะกระแสที่ใช้เมื่อเปิด LED ทั้งแถบเต็มที่อาจเกิน 10+ แอมป์ได้ง่ายๆ ห้ามจ่ายไฟให้แถบ NeoPixel ยาวๆ โดยตรงจากขา 5V ของ Arduino Nano เป็นอันขาดนะตัวนี้! มันจะทำให้เรกูเลเตอร์บนบอร์ดทำงานหนักเกินไปและอาจพังได้ สู้งานนะน้อง
ขั้นตอนที่ 4: ทดสอบระบบ
หลังจากอัพโหลดโค้ดลง Arduino Nano แล้ว ก็ถึงเวลาทดสอบระบบแล้วว่ะ จ่ายไฟให้ Arduino แล้วสังเกตสีของ Neo Pixel ring ดู ลองเปลี่ยนอุณหภูมิรอบๆ เซ็นเซอร์ DHT11 ดู (เช่น เป่าลมร้อนหรือลมเย็นใส่เซ็นเซอร์) แล้วดูว่าสีของ Neo Pixel ring เปลี่ยนไปตามนั้นหรือเปล่า อย่าลืมดูค่าที่แสดงบน Serial Monitor ด้วยล่ะ


#include <Adafruit_NeoPixel.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT11 // DHT 11
#define DHTPIN 3
DHT_Unified dht(DHTPIN, DHTTYPE);
#define PIN 2 // Neo
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
dht.begin();
sensor_t sensor;
strip.begin();
strip.setBrightness(100);
strip.show();
}
void loop() {
sensors_event_t event;
dht.temperature().getEvent(&event);
Serial.print(F("Temperature: "));
float temp1 = event.temperature;
Serial.print(temp1);
Serial.println(F("°C"));
dht.humidity().getEvent(&event);
Serial.print(F("Humidity: "));
float hum1 = event.relative_humidity;
Serial.print(hum1);
Serial.println(F("%"));
if (temp1 >= 28 && temp1 < 31) {
strip.clear(); // Set all pixel colors to 'off'
for (int i = 0; i < 12; i++) { // For each pixel...
strip.setPixelColor(i, strip.Color(0, 150, 0));
strip.show();
}
}
else if (temp1 < 28) {
strip.clear();
for (int i = 0; i < 12; i++) { // For each pixel...
strip.setPixelColor(i, strip.Color(0, 0, 150));
strip.show();
}
}
else {
strip.clear();
for (int i = 0; i < 12; i++) { // For each pixel...
strip.setPixelColor(i, strip.Color(150, 0, 0));
strip.show();
}
}
}
สรุปแล้วน้อง
การทำวง Neo Pixel ควบคุมด้วย DHT11 กับ Arduino Nano นี่มันโปรเจคที่ทั้งสนุกและได้ความรู้เลยนะตัวดี มันเอาการวัดอุณหภูมิกับไฟสวยๆ มาผสมกันสุดๆ ด้วยระบบนี้ น้องจะสามารถเช็คอุณหภูมิในห้องได้จากสีไฟเลยว่าเดี๋ยวนี้ร้อนจัดหรือหนาวสั่น อยู่ในโซนสบายๆ รึเปล่า โปรเจคนี้สอนแก่นสำคัญเลยคือการแปลงข้อมูลจากเซนเซอร์ให้เป็นภาพที่เข้าใจง่ายๆ นี่แหละพื้นฐานที่เอาไปต่อยอดได้อีกเยอะ ไม่ว่าจะเพิ่มเซนเซอร์แบบอื่นหรือเล่นกับสีแบบขั้นสูงเพื่อทำ Ambient Display สุดเท่ในห้องก็ยังได้ เอาเลยวัยรุ่น!