จุดประสงค์ของโปรเจคนี้คือการสร้างอุปกรณ์ Internet of Things ด้วย Arduino ที่ส่งข้อมูลไปยัง ThingSpeak ผ่าน WiFi และสร้างกราฟแบบเรียลไทม์ ThingSpeak เป็นแพลตฟอร์มที่ใช้เก็บและดึงข้อมูลจากสิ่งต่างๆ โดยใช้โปรโตคอล HTTP ผ่านอินเทอร์เน็ต
เรากำลังจะสร้างอุปกรณ์จิ๋ว (60x90 มม. - ประมาณ 2.36x3.54 นิ้ว) โดยใช้บอร์ด Feather Huzzah จาก Adafruit และส่งข้อมูลไปยัง ThingSpeak ด้วยโมดูล WiFi ESP8266 เราจะส่งข้อมูลจากเซ็นเซอร์วัดแสงที่เราทำขึ้นจากโฟโตเรซิสเตอร์
สุดท้ายแล้ว อุปกรณ์ทั้งหมดจะถูกบรรจุอยู่ในกล่องเล็กๆ (พิมพ์จากเครื่อง 3D พร้อมไม้) ซึ่งจะทำให้โปรเจค IoT ของเราพกพาไปไหนมาไหนได้สะดวกเลย
ขั้นตอนที่ 1: ตัวอย่างการทำงาน
ขั้นตอนที่ 2: อุปกรณ์ที่ต้องใช้
- Adafruit Feather Huzzah ESP8266
- แบตเตอรี่ Li-po 3.7V 550mAh (หรือความจุมากกว่านี้ก็ได้)
- โฟโตเรซิสเตอร์ (Photoresistor)
- ตัวต้านทาน 1kOhm (x4), 2.2kOhms (x2)
- ไฟ LED RGB
- สวิตช์จิ๋ว
- ลวด/สายไฟ
- เครื่องพิมพ์ 3D (ถ้ามี)
ขั้นตอนที่ 3: ลงมือสร้าง IoT & การทำงานทางเทคนิค
โปรเจค DIY WiFi Light Sensor นี้จะเผยให้เห็นชั้นการทำงานที่ซ่อนอยู่เบื้องหลังการส่งข้อมูลจากแสงไปยังคลาวด์อย่างง่ายๆ โครงสร้างฮาร์ดแวร์ประกอบด้วยหลายชั้นหลักๆ ดังนี้:
- ชั้นตรวจจับ (Sensing Layer): โฟโตเรซิสเตอร์ (LDR) ทำหน้าที่เป็นดวงตาของเซ็นเซอร์ ความต้านทานของมันจะเปลี่ยนแปลงตั้งแต่ ~500 โอห์ม (แสงเต็มที่) ไปจนถึง ~50 kOhm (มืดสนิท) สร้างสัญญาณอนาล็อกที่แปรผันได้
- ชั้นปรับสัญญาณ (Signal Conditioning Layer): ขาอินพุตอนาล็อกของ Feather Huzzah มีขีดจำกัดที่ 1V เราใช้วงจรแบ่งแรงดัน (ด้วยตัวต้านทานที่ระบุไว้) เพื่อให้แน่ใจว่าแรงดันจากแหล่งจ่าย 3.3V ที่ไปเลี้ยงโฟโตเรซิสเตอร์จะไม่เกิน 1V ที่ขา ADC
- ชั้นแปลงสัญญาณและอินเทอร์เฟซไร้สาย (Conversion & Wireless Interface Layer): ESP8266 บน Feather Huzzah คือหัวใจหลัก ADC (Analog-to-Digital Converter) แบบ 10-bit ที่ฝังมากับมันจะแปลงสัญญาณอนาล็อกจากเซ็นเซอร์ที่ผ่านการปรับแล้ว (0-1V) เป็นค่าดิจิทัลระหว่าง 0 ถึง 1023 ไมโครคอนโทรลเลอร์ตัวนี้ยังทำหน้าที่เป็นสะพานเชื่อมต่อกับเครือข่าย WiFi ที่บ้านของคุณอีกด้วย
- ชั้นสื่อสารและคลาวด์ (Communication & Cloud Layer): ข้อมูลจะถูกส่งเป็นจังหวะไปยังแพลตฟอร์มคลาวด์ ThingSpeak ผ่าน WiFi เพื่อการแสดงผลแบบเรียลไทม์และการบันทึกข้อมูล
- ชั้นตอบสนองผู้ใช้ (User Feedback Layer): ไฟ LED RGB ทำหน้าที่แสดงสถานะด้วยภาพ มันจะแสดงสีแดงระหว่างที่กำลังพยายามเชื่อมต่อ WiFi และจะกระพริบเป็นลำดับสีน้ำเงิน/เขียวเมื่อส่งข้อมูลสำเร็จ
ขั้นตอนการประกอบ:
- เชื่อมต่อแบตเตอรี่ Li-Po 3.7V กับสวิตช์เพื่อจ่ายไฟให้บอร์ด
- สร้างวงจรแบ่งแรงดัน 1V-max จากแหล่งจ่าย 3.3V เพื่อจ่ายไฟให้โฟโตเรซิสเตอร์อย่างปลอดภัยสำหรับอินพุตอนาล็อก
- เชื่อมต่อไฟ LED RGB กับขาดิจิทัลหมายเลข 12, 13 และ 14 สำหรับสีแดง, เขียว และน้ำเงิน ตามลำดับ เพื่อแสดงผลให้ผู้ใช้ทราบ
/!\ ข้อสำคัญ: ต้องเคารพขีดจำกัดกระแสของ ESP8266 นะน้อง: สูงสุด 12 mA ต่อขา และ 85mA สำหรับชิปทั้งหมด ห้ามช็อตนะตัวนี้!
ขั้นตอนที่ 4: ส่งข้อมูลไปยัง ThingSpeak
ในโค้ด Arduino ต่อไปนี้ เราจะส่งข้อมูลความสว่าง (luminosity) ไปยัง ThingSpeak นะน้อง อย่าลืมใส่ Channel ID ของตัวเอง และ SSID/รหัสผ่านของไวไฟที่ใช้ด้วยล่ะ
ตรรกะการทำงาน (Interaction Logic) มีดังนี้:
- ตั้งค่า Hardware และเชื่อมต่อ Cloud: โค้ดจะเซ็ตอัพเซ็นเซอร์, ขา LED, การเชื่อมต่อ WiFi และลิงก์ไปยังช่อง ThingSpeak ของน้องโดยใช้ Write API Key ที่เป็นเอกลักษณ์
- ลูปการทำงาน (Execution Loop): ESP8266 จะอ่านค่าจากขา Analog อย่างต่อเนื่อง แปลงค่าดิจิทัล (0 ถึง 1023) เป็นเปอร์เซ็นต์ระหว่าง 1 ถึง 100 (เราจะกลับค่ามัน เพื่อให้ 0% คือมืดสนิท และ 100% คือสว่างจ้า)
- อัพเดท Cloud และ Feedback: ค่าเปอร์เซ็นต์นี้จะถูกส่งไปยังช่อง ThingSpeak ของน้อง LED จะกระพริบเพื่อยืนยันว่าส่งข้อมูลสำเร็จแล้ว
อย่างที่เห็นในวิดีโอโปรเจค น้องสามารถสร้างกราฟแบบเรียลไทม์หลายแบบบน ThingSpeak ได้เลย เช่น Gauge หรือกราฟแสดงตามเวลา เพื่อดูการเปลี่ยนแปลงของความสว่างได้ชัดๆ
ขั้นตอนที่ 5: ฐาน (Socle) ที่พิมพ์จากเครื่อง 3D Printer / ไฟล์ STL
หลังจากที่เราประกอบอุปกรณ์ IoT เสร็จแล้ว เราจะเอามันใส่ลงในกล่องเล็กๆ ตัวฐานทำด้วยเครื่องพิมพ์ 3D (ใช้วัสดุ PLA) ส่วนฝากล่องเราทำจากไม้
ขั้นตอนที่ 6: โค้ด
<p>// Light Sensor data transmitted to ThingSpeak via Wifi<br>// Inspired from the Hackster project : https://www.hackster.io/glicmich/adafruit-feather-huzzah-with-esp8266-wifi-8009d2</p><p>// Librairies</p><p>#include <ESP8266Wifi.h><br>#include <WifiClient.h><br>#include <ESP8266WebServer.h><br>#include <ESP8266mDNS.h><br>#include <ThingSpeak.h><br></p><p>
const char* ssid = "your_ssid_box"; // Wireless SID<br>const char* password = "your_wifi_password"; // Wireless Passcode</p><p>ESP8266WebServer server(80); // http server</p><p>// what digital pin we're connected to<br>int led_r= 13; // red led connected to the digital pin 13<br>int led_g = 12; // green led connected to the digital pin 12<br>int led_b = 14; // blue led connected to the digital pin 14</p><p>int luminosity = A0; // photoresistor connected to the INPUT (analog pin 0)</p><p>WiFiClient client;<br>unsigned int myChannelNumber = 546348; // Channel Number from // ThingSpeak IoT<br>const char * myWriteAPIKey = "ZNE2N6NCI6DBJAVX"; // Write API Key<br>
void handleRoot() <br> {</p><p> delay(1000);<br> server.send(200, "text/plain", "Hello world !");</p><p> delay(1000);<br> }</p><p>void handleNotFound()<br> {</p><p> String message = "File Not Found\<br>\<br>";<br> message += "URI: ";<br> message += server.uri();<br> message += "\<br>Method: ";<br> message += (server.method() == HTTP_GET)?"GET":"POST";<br> message += "\<br>Arguments: ";<br> message += server.args();<br> message += "\<br>";<br>
for (uint8_t i=0; i</p><p>void setup(void)<br> {<br> Serial.println("AM2302 test!");<br> pinMode(led_r,OUTPUT);<br> pinMode(led_g,OUTPUT);<br> pinMode(led_b,OUTPUT);<br> digitalWrite(led_r,LOW);<br> digitalWrite(led_g,LOW);<br> digitalWrite(led_b,LOW);<br> pinMode(luminosity,INPUT);</p><p> Serial.begin(115200);<br> WiFi.begin(ssid, password);<br> ThingSpeak.begin(client);<br> Serial.println("");</p><p> // Wait for connection<br> while (WiFi.status() != WL_CONNECTED) <br> {<br> delay(500);<br> Serial.print(".");<br> // RGB red light<br> digitalWrite(led_r,HIGH);<br> digitalWrite(led_g,LOW);<br> digitalWrite(led_b,LOW);<br> }<br>
Serial.println("");<br> Serial.print("Connected to ");<br> Serial.println(ssid);<br> Serial.print("IP address: ");<br> Serial.println(WiFi.localIP());<br>
if (MDNS.begin("esp8266")) <br> {<br> Serial.println("MDNS responder started");<br> }</p><p> server.on("/", handleRoot);</p><p> server.on("/inline", [](){<br> server.send(200, "text/plain", "this works as well");<br> });</p><p> server.onNotFound(handleNotFound);</p><p> server.begin();<br> Serial.println("HTTP server started");<br> }</p><p>void loop(void)<br> {<br> server.handleClient();<br> // Blink led from white to blue<br> digitalWrite(led_r,HIGH);<br> digitalWrite(led_g,HIGH);<br> digitalWrite(led_b,HIGH);<br> delay(300);<br> digitalWrite(led_r,LOW);<br> digitalWrite(led_g,LOW);<br> digitalWrite(led_b,HIGH);<br> delay(300);<br> digitalWrite(led_r,HIGH);<br> digitalWrite(led_g,HIGH);<br> digitalWrite(led_b,HIGH);<br> delay(300);<br> digitalWrite(led_r,LOW);<br> digitalWrite(led_g,LOW);<br> digitalWrite(led_b,HIGH);<br> delay(300);<br> digitalWrite(led_r,HIGH);<br> digitalWrite(led_g,HIGH);<br> digitalWrite(led_b,HIGH);<br> delay(300);<br> digitalWrite(led_r,LOW);<br> digitalWrite(led_g,LOW);<br> digitalWrite(led_b,HIGH);<br> // Sensor reading <br> luminosity = analogRead(A0);<br> // Light sensor in % / reverse in order to have 0% for LOW light and 100% for high light<br> luminosity = 100 - map(luminosity,0,1024,0,100);<br> Serial.print(luminosity);<br> Serial.println(" %");<br> ThingSpeak.setField(1, luminosity); // Field 1 , sending the variable luminosity<br> ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);<br> }</p>
ไอเดียต่อยอดในอนาคต
โปรเจคนี้เป็นฐานที่เพอร์เฟคสำหรับเครื่องมือติดตามแสงแบบอินเทอร์กทีฟ และสามารถต่อยอดได้อีกหลายทาง:
- แดชบอร์ดแสดงสถานะด้วย OLED: เพิ่มจอ OLED ขนาดเล็กเพื่อแสดงเปอร์เซ็นต์แสงและความแรงสัญญาณ WiFi แบบเรียลไทม์ที่ตัวเครื่อง (จัดไปวัยรุ่น).
- เครือข่ายเซนเซอร์หลายตัว: ต่อเซนเซอร์วัดแสงหลายๆ ตัวเพื่อติดตามแสงในห้องหรือโซนต่างๆ แบบอิสระ (สแกนทุกซอกทุกมุมเลยน้อง).
- อินเทอร์เฟซแอปมือถือ: สร้างแอปมือถือคู่หูสำหรับดูและติดตามระดับแสงจากระยะไกล (จะได้ไม่ต้องลุกจากเก้าอี้).
- ปรับเกณฑ์ได้: เพิ่มโพเทนชิโอมิเตอร์ (Potentiometer) สำหรับปรับเกณฑ์ระดับแสงที่ใช้เตือนหรือเปลี่ยนสี LED ด้วยมือ (ห้ามช็อตนะตัวนี้).
ขั้นตอนที่ 7: ขอบคุณมาก !
ขอบคุณมากๆ นะครับ! ถ้าชอบโพสต์นี้ ลองไปดูงานนำเสนอหรือทูตอเรียนอื่นๆ ของพวกเราดูได้นะ!
หากต้องการเยี่ยมชมเว็บไซต์ของเรา:
เพื่อติดตามบทเรียนต่างๆ ของเรา: