สารบัญ:

Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 ขั้นตอน (พร้อมรูปภาพ)
Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: LG Life’s Good Award : Conference - Full | LG 2024, กรกฎาคม
Anonim
Image
Image
แผนภูมิวงจรรวม
แผนภูมิวงจรรวม

โปรเจ็กต์นี้จัดทำขึ้นสำหรับหลักสูตร Technology for Concept Design ที่ TUDelft

ผลิตภัณฑ์ขั้นสุดท้ายคือหลอดไฟ LED ฐาน ESP-32 และเชื่อมต่อกับเซิร์ฟเวอร์ สำหรับต้นแบบ หลอดไฟมีสองหน้าที่; เอฟเฟกต์สีรุ้งที่ปล่อยแสงสีที่ให้ความรู้สึกผ่อนคลายไปยังสภาพแวดล้อมโดยรอบ และตัวสร้างภาพเสียงอย่างที่สอง โดยที่พิกเซล LED จะ "เต้น" ตามระดับเสียง ระบบเชื่อมต่อกับ wifi และผู้ใช้สามารถเลือกเอฟเฟกต์ที่ต้องการจากหลอดไฟผ่าน WIFI ได้

ไมโครชิป ESP-32 ราคาถูกมอบโปรเซสเซอร์อันทรงพลัง เซ็นเซอร์ฮอลล์ในตัว เซ็นเซอร์อุณหภูมิ เซ็นเซอร์สัมผัส และความสามารถ wifi และบลูทูธ ด้วยสิ่งนี้ แม้จะเลือกเอฟเฟกต์เพียงสองเอฟเฟกต์สำหรับโปรเจ็กต์นี้ ความหมายของหลอดไฟ "อัจฉริยะ" นี้ก็ไร้ขีดจำกัด จะใช้เพื่อระบุสภาพอากาศให้กับผู้ใช้หรืออุณหภูมิของห้อง ตัวโคมไฟสามารถทำหน้าที่เป็นตัวกระตุ้นสัญญาณเตือนภัย หรือให้แสงแดดส่องลงมาที่ข้างเตียงของคุณเพื่อจำลองพระอาทิตย์ขึ้นเพื่อประสบการณ์การตื่นนอนที่ดี

ขั้นตอนที่ 1: วัสดุที่จำเป็น

Arduino esp32

เซ็นเซอร์เสียง

ตัวแปลงระดับลอจิกสี่ทิศทาง

Neopixel นำ 2m 60 led / m

สายจัมเปอร์

สายไมโคร USB พร้อมอแดปเตอร์

การเชื่อมต่ออินเทอร์เน็ต

ขั้นตอนที่ 2: แผนภาพวงจร

แผนภาพวงจรถูกวาดและทำวงจรตามที่กำหนดใน

แผนภาพด้านล่าง

ขั้นตอนที่ 3: รหัส Arduino

ที่นี่ตอนแรกสร้างรหัสวิชวลไลเซอร์ จากนั้นโค้ดตัวอย่างสองตัว

;“neoplxel RGBW การทดสอบเริ่มต้น”; และ “simpleWebServerWifi” ได้รับการแก้ไขและรวมเข้ากับโค้ดวิชวลไลเซอร์ แม้ว่ารหัสจะยังคงบั๊กในบางครั้ง (ไฟ LED แบบสุ่มจะสว่างขึ้นเป็นครั้งคราว) การทำซ้ำรหัสครั้งต่อไป (เมื่อเรามีเวลาเพียงพอ) จะได้รับการอัปเดต

#รวม

#ifdef _AVR_

#รวม

#endif

const int numReadings = 5;

การอ่าน int[numReadings];

int readIndex = 0;

รวมทั้งหมด = 0;

ค่าเฉลี่ย int = 0;

int micPin = 33;

#กำหนด PIN 4

#define NUM_LEDS 120

#นิยามความสว่าง100

แถบ Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

ไบต์ neopix_gamma = {

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 109, 110, 112, 114, 115, 117, 119, 120, 122, 124, 126, 127, 129, 131, 133, 135, 137, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 167, 169, 171, 173, 175, 177, 180, 182, 184, 186, 189, 191, 193, 196, 198, 200, 203, 205, 208, 210, 213, 215, 218, 220, 223, 225, 228, 231, 233, 236, 239, 241, 244, 247, 249, 252, 255 };

#รวม

#รวม

ถ่าน ssid = "เครือข่ายของคุณ"; // SSID เครือข่ายของคุณ (ชื่อ)

char pass = "รหัสผ่านลับ"; // รหัสผ่านเครือข่ายของคุณ

int keyIndex = 0; // หมายเลขดัชนีคีย์เครือข่ายของคุณ (จำเป็นสำหรับ WEP เท่านั้น)

สถานะ int = WL_IDLE_STATUS;

เซิร์ฟเวอร์ WiFiServer(80);

การตั้งค่าเป็นโมฆะ ()

{

Serial.begin(9600); // เริ่มต้นการสื่อสารแบบอนุกรม

โหมดพิน (9, เอาต์พุต); // ตั้งค่าโหมดพิน LED

// ตรวจสอบการมีอยู่ของโล่:

ถ้า (WiFi.status () == WL_NO_SHIELD) {

Serial.println ("ไม่มีตัวป้องกัน WiFi");

ในขณะที่ (จริง); //อย่าไปต่อ

}

สตริง fv = WiFi.firmwareVersion ();

ถ้า (fv != "1.1.0") {

Serial.println("กรุณาอัพเกรดเฟิร์มแวร์");

}

// พยายามเชื่อมต่อกับเครือข่าย Wifi:

ในขณะที่ (สถานะ != WL_CONNECTED) {

Serial.print("กำลังพยายามเชื่อมต่อกับเครือข่ายชื่อ: ");

Serial.println(ssid); // พิมพ์ชื่อเครือข่าย (SSID);

// เชื่อมต่อกับเครือข่าย WPA/WPA2 เปลี่ยนบรรทัดนี้หากใช้เครือข่ายแบบเปิดหรือ WEP:

สถานะ = WiFi.begin(ssid, ผ่าน);

// รอ 10 วินาทีสำหรับการเชื่อมต่อ:

ล่าช้า (10000);

}

เซิร์ฟเวอร์.begin(); // เริ่มเว็บเซิร์ฟเวอร์บนพอร์ต 80

printWifiStatus(); // คุณเชื่อมต่อแล้ว ดังนั้นพิมพ์สถานะ

}

{

Serial.begin(9600);

แถบ.setBrightness(ความสว่าง);

แถบ.begin();

แถบ.show(); // เริ่มต้นพิกเซลทั้งหมดเป็น 'ปิด'

โหมดพิน (micPin, INPUT);

สำหรับ (int thisReading = 0; thisReading < numReadings; thisReading ++) {

การอ่าน[การอ่านนี้] = 0;

}

}

รุ้งเป็นโมฆะ (uint8_t รอ) {

uint16_t ผม, เจ;

สำหรับ (j=0; j<256; j++) {

สำหรับ(i=0; i

strip.setPixelColor(i, Wheel((i+j) & 255));

}

แถบ.show();

ล่าช้า(รอ);

}

}

โมฆะวิชวลไลเซอร์ (){

รวม = รวม - การอ่าน [readIndex];

การอ่าน [readIndex] = analogRead (micPin);

รวม = ทั้งหมด + การอ่าน[readIndex];

readIndex = readIndex + 1;

ถ้า (readIndex >= numReadings) {

readIndex = 0;

}

เฉลี่ย = รวม / numReadings;

ล่าช้า(1);

int micpixel = (เฉลี่ย-100)/5;

Serial.println (ไมโครพิกเซล);

ถ้า (ไมโครพิกเซล > 0){

{

สำหรับ (int j=0; j<=micpixel; j++)

strip.setPixelColor(j, (micpixel*2), 0, (90-micpixel), 0);

สำหรับ (int j=micpixel; j<=NUM_LEDS; j++)

strip.setPixelColor(j, 0, 0, 0, 0);

แถบ.show();

}

}

ถ้า (ไมโครพิกเซล < 0) {

สำหรับ (int j=0; j<=20; j++)

strip.setPixelColor(j, 0, 0, 50, 0);

แถบ.show();

}

}

วงเป็นโมฆะ () {

{

ไคลเอนต์ WiFiClient = server.available (); // รับฟังลูกค้าที่เข้ามา

if (client) { // หากคุณได้รับลูกค้า

Serial.println("ลูกค้าใหม่"); // พิมพ์ข้อความออกพอร์ตอนุกรม

สตริง currentLine = ""; // สร้างสตริงเพื่อเก็บข้อมูลขาเข้าจากลูกค้า

while (client.connected()) { // วนรอบขณะเชื่อมต่อไคลเอ็นต์

if (client.available()) { // หากมีไบต์ที่จะอ่านจากลูกค้า

ถ่าน c = client.read(); // อ่านไบต์แล้ว

Serial.write(c); // พิมพ์ออกมามอนิเตอร์แบบอนุกรม

if (c == '\n') { // ถ้าไบต์เป็นอักขระขึ้นบรรทัดใหม่

// ถ้าบรรทัดปัจจุบันว่าง คุณได้อักขระขึ้นบรรทัดใหม่สองตัวในแถว

// นั่นคือจุดสิ้นสุดของคำขอ HTTP ของไคลเอ็นต์ ดังนั้นให้ส่งการตอบกลับ:

ถ้า (currentLine.length () == 0) {

// ส่วนหัว HTTP จะเริ่มต้นด้วยรหัสตอบกลับเสมอ (เช่น HTTP/1.1 200 OK)

// และประเภทเนื้อหาเพื่อให้ลูกค้ารู้ว่ากำลังจะเกิดอะไรขึ้น ตามด้วยบรรทัดว่าง:

client.println("HTTP/1.1 200 ตกลง");

client.println("ประเภทเนื้อหา:ข้อความ/html");

client.println();

// เนื้อหาของการตอบสนอง HTTP ตามส่วนหัว:

client.print("คลิกที่นี่เปิดเอฟเฟกต์สายรุ้ง");

client.print("คลิกที่นี่เปิด Visualizer");

// การตอบสนอง HTTP ลงท้ายด้วยบรรทัดว่างอื่น:

client.println();

// แยกตัวออกจากวง while:

หยุดพัก;

} else { // หากคุณขึ้นบรรทัดใหม่ ให้ล้าง currentLine:

currentLine = "";

}

} else if (c != '\r') { // หากคุณมีอย่างอื่นนอกจากอักขระขึ้นบรรทัดใหม่

ปัจจุบันบรรทัด += ค; // เพิ่มไปยังจุดสิ้นสุดของ currentLine

}

// ตรวจสอบเพื่อดูว่าคำขอของลูกค้าเป็น "GET /H" หรือ "GET /L":

if (currentLine.endsWith("GET /R")) {

เรนโบว์(10); // เปิดเอฟเฟกต์สายรุ้ง

}

if (currentLine.endsWith("GET /V")) {

วิชวลไลเซอร์(); // Visualizer เปิดอยู่

}

}

}

// ปิดการเชื่อมต่อ:

client.stop();

Serial.println("ไคลเอ็นต์ยกเลิกการเชื่อมต่อ");

}

}

เป็นโมฆะ printWifiStatus () {

// พิมพ์ SSID ของเครือข่ายที่คุณเชื่อมต่อ:

Serial.print("SSID: ");

Serial.println(WiFi. SSID());

// พิมพ์ที่อยู่ IP ของ WiFi shield ของคุณ:

IPAddress ip = WiFi.localIP ();

Serial.print("ที่อยู่ IP: ");

Serial.println(ip);

// พิมพ์ความแรงของสัญญาณที่ได้รับ:

rssi ยาว = WiFi. RSSI ();

Serial.print("ความแรงของสัญญาณ (RSSI):");

Serial.print(rssi);

Serial.println("dBm");

// พิมพ์ว่าจะไปที่ไหนในเบราว์เซอร์:

Serial.print( หากต้องการดูหน้านี้ ให้เปิดเบราว์เซอร์ไปที่

Serial.println(ip);

}

}

uint32_t Wheel (ไบต์ WheelPos) {

WheelPos = 255 - WheelPos;

ถ้า (WheelPos <85) {

แถบส่งคืน.สี(255 - WheelPos * 3, 0, WheelPos * 3, 0);

}

ถ้า (WheelPos <170) {

WheelPos -= 85;

แถบกลับ.สี(0, WheelPos * 3, 255 - WheelPos * 3, 0);

}

WheelPos -= 170;

แถบส่งคืน.สี(WheelPos * 3, 255 - WheelPos * 3, 0, 0);

}

uint8_t สีแดง (uint32_t c) {

กลับ (c >> 16);

}

uint8_t สีเขียว (uint32_t c) {

กลับ (c >> 8);

}

uint8_t สีน้ำเงิน (uint32_t c) {

กลับ (c);

}

}

//Serial.println(ไมโครพิกเซล);

}

ขั้นตอนที่ 4: การพิมพ์ฐานโคมไฟ 3 มิติ

การพิมพ์ฐานโคมไฟ 3 มิติ
การพิมพ์ฐานโคมไฟ 3 มิติ

แบบจำลอง 3 มิติของฐานโคมไฟถูกวัด ออกแบบ และพิมพ์ด้วยขนาดที่ใหญ่พอที่จะใส่ส่วนประกอบไฟฟ้าทั้งหมดภายในช่องฐานได้

ขั้นตอนที่ 5: ไฟล์แนบนำ

ไฟล์แนบนำ
ไฟล์แนบนำ

Led ถูกม้วนด้วยกระดาษแข็งและติดด้วยเทปสองด้านเจาะรูที่ส่วนล่างเพื่อส่งลวดผ่าน

ขั้นตอนที่ 6: กล่องใส่หลอดไฟ

ตู้ไฟ
ตู้ไฟ

โครงตู้ถูกสร้างขึ้นโดยการค้นหาขวดใสที่มีความกว้างเท่ากับฐานโคมไฟและความสูงเท่ากับตัวยึด LED จากนั้นปิดด้วยกระดาษหนาเพื่อให้แสงกระจายได้ดีขึ้น อีกทางเลือกหนึ่งคือสามารถใช้กระจกฝ้าหรือหลอดพลาสติกโปร่งแสงเป็นโครงโคมไฟได้

ขั้นตอนที่ 7: ตั้งค่า

ติดตั้ง
ติดตั้ง

ทุกอย่างติดกาวและประกอบเข้าด้วยกัน และหลอดไฟก็พร้อมสำหรับการทดสอบ!

แนะนำ: