กลับไปหน้ารวมไฟล์
diy-wifi-light-sensor-d526d0.md

จุดประสงค์ของโปรเจคนี้คือการสร้างอุปกรณ์ 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) มีดังนี้:

  1. ตั้งค่า Hardware และเชื่อมต่อ Cloud: โค้ดจะเซ็ตอัพเซ็นเซอร์, ขา LED, การเชื่อมต่อ WiFi และลิงก์ไปยังช่อง ThingSpeak ของน้องโดยใช้ Write API Key ที่เป็นเอกลักษณ์
  2. ลูปการทำงาน (Execution Loop): ESP8266 จะอ่านค่าจากขา Analog อย่างต่อเนื่อง แปลงค่าดิจิทัล (0 ถึง 1023) เป็นเปอร์เซ็นต์ระหว่าง 1 ถึง 100 (เราจะกลับค่ามัน เพื่อให้ 0% คือมืดสนิท และ 100% คือสว่างจ้า)
  3. อัพเดท 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: ขอบคุณมาก !

ขอบคุณมากๆ นะครับ! ถ้าชอบโพสต์นี้ ลองไปดูงานนำเสนอหรือทูตอเรียนอื่นๆ ของพวกเราดูได้นะ!

หากต้องการเยี่ยมชมเว็บไซต์ของเรา:

เพื่อติดตามบทเรียนต่างๆ ของเรา:

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
  - "1x ThingSpeak Cloud Platform"
author: "TechnoFabrique"
category: "Sensors & Environment"
components:
  - "1x Li-Ion Battery 1000mAh"
  - "2x Resistor 1k ohm"
  - "1x Single RGB Led"
  - "1x Slide Switch"
  - "1x Photo resistor"
  - "1x Adafruit Feather HUZZAH with ESP8266 WiFi"
  - "4x Resistor 2.21k ohm"
description: "โครงการนี้คือการสร้าง IoT Device ด้วย Arduino ที่จะส่งข้อมูลเซนเซอร์วัดแสงขึ้นไปแสดงผลบน ThingSpeak ผ่าน WiFi ครับน้อง งานง่ายแต่หล่อ วัยรุ่นสายช่างต้องลอง!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1/xQIQdEmSc3zp66ns2fV+JNSPuWBHOgarom2JEnXrhKALcB9Ubuqr/km3asX3IT44Zh/kcvBBXnibxMP4Vt0oswUBNqNhEVjs="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/diy-wifi-light-sensor-d526d0_cover.png"
lang: "en"
likes: 1
passwordHash: "f1a4a0bf72885e446fc2d4bef8b1282f7e4559300ebe63980215750b7e380373"
price: 2450
seoDescription: "Build a DIY WiFi Light Sensor with Arduino and ThingSpeak. Learn to send IoT data over WiFi in this simple tutorial."
tags:
  - "weather"
  - "wearables"
  - "lights"
  - "smart appliances"
  - "data collection"
  - "internet of things"
title: "งาน DIY วัดแสงส่ง WiFi ง่ายๆ แต่เท่ไม่เหมือนใคร"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/3LGoo4bnWXE"
views: 4518