สารบัญ:
- ขั้นตอนที่ 1: วัสดุที่จำเป็น
- ขั้นตอนที่ 2: แผนภาพวงจร
- ขั้นตอนที่ 3: รหัส Arduino
- ขั้นตอนที่ 4: การพิมพ์ฐานโคมไฟ 3 มิติ
- ขั้นตอนที่ 5: ไฟล์แนบนำ
- ขั้นตอนที่ 6: กล่องใส่หลอดไฟ
- ขั้นตอนที่ 7: ตั้งค่า
วีดีโอ: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
โปรเจ็กต์นี้จัดทำขึ้นสำหรับหลักสูตร 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 มิติของฐานโคมไฟถูกวัด ออกแบบ และพิมพ์ด้วยขนาดที่ใหญ่พอที่จะใส่ส่วนประกอบไฟฟ้าทั้งหมดภายในช่องฐานได้
ขั้นตอนที่ 5: ไฟล์แนบนำ
Led ถูกม้วนด้วยกระดาษแข็งและติดด้วยเทปสองด้านเจาะรูที่ส่วนล่างเพื่อส่งลวดผ่าน
ขั้นตอนที่ 6: กล่องใส่หลอดไฟ
โครงตู้ถูกสร้างขึ้นโดยการค้นหาขวดใสที่มีความกว้างเท่ากับฐานโคมไฟและความสูงเท่ากับตัวยึด LED จากนั้นปิดด้วยกระดาษหนาเพื่อให้แสงกระจายได้ดีขึ้น อีกทางเลือกหนึ่งคือสามารถใช้กระจกฝ้าหรือหลอดพลาสติกโปร่งแสงเป็นโครงโคมไฟได้
ขั้นตอนที่ 7: ตั้งค่า
ทุกอย่างติดกาวและประกอบเข้าด้วยกัน และหลอดไฟก็พร้อมสำหรับการทดสอบ!
แนะนำ:
LightBox Music Visualizer: 5 ขั้นตอน (พร้อมรูปภาพ)
LightBox Music Visualizer: LightBox ใช้ไมโครโฟนในตัวของโทรศัพท์หรือแท็บเล็ตเพื่อวิเคราะห์เพลงเพื่อสร้างรูปแบบแสงที่สวยงามซึ่งเข้ากับเพลง เพียงแค่เปิดแอป วางโทรศัพท์หรือแท็บเล็ตของคุณไว้ที่ใดที่หนึ่งใกล้กับแหล่งกำเนิดเสียง แล้วกล่องของคุณจะแสดงภาพ
ลำโพง Bluetooth พร้อม Music Visualizer: 10 ขั้นตอน (พร้อมรูปภาพ)
ลำโพง Bluetooth พร้อม Music Visualizer: ในคำแนะนำนี้ ฉันจะแสดงให้คุณเห็นว่าฉันสร้างลำโพง Bluetooth ที่มี Visualizer เพลงอยู่ด้านบนอย่างไร มันดูเจ๋งจริง ๆ และทำให้ช่วงเวลาการฟังเพลงของคุณยอดเยี่ยมยิ่งขึ้น คุณสามารถตัดสินใจได้ว่าต้องการเปิดโปรแกรมสร้างภาพหรือไม่
Arduino Music Reactive Desktop Lamp: 8 ขั้นตอน (พร้อมรูปภาพ)
Arduino Music Reactive Desktop Lamp: สวัสดีทุกคน! ในงานสร้างนี้ เราจะสร้างโคมไฟตั้งโต๊ะ LED แบบรีแอกทีฟโดยใช้ส่วนประกอบง่ายๆ และการเขียนโปรแกรม Arduino ขั้นพื้นฐาน มันสร้างเอฟเฟกต์ที่น่าประทับใจโดยที่แสงจะเต้นไปกับเสียงและดนตรีทั้งหมด ฉันทำโปรเจ็กต์นี้เสร็จพร้อมกับเพื่อนร่วมทีม
Music Visualizer (ออสซิลโลสโคป): 4 ขั้นตอน (พร้อมรูปภาพ)
Music Visualizer (ออสซิลโลสโคป): เครื่องมือสร้างภาพดนตรีนี้เป็นวิธีที่ยอดเยี่ยมในการเพิ่มความลึกให้กับประสบการณ์การฟังเพลงของคุณ และสร้างได้ง่ายมาก นอกจากนี้ยังอาจมีประโยชน์ในฐานะออสซิลโลสโคปจริงสำหรับบางแอปพลิเคชันทั้งหมดที่จำเป็นคือ: - crt เก่า (เกือบทั้งหมด b&am
Nixie Tube Music Visualizer: 10 ขั้นตอน (พร้อมรูปภาพ)
Nixie Tube Music Visualizer: โปรแกรมสร้างภาพเพลงที่สะกดจิตซึ่งได้รับแรงบันดาลใจจากแถบเล็กๆ เหล่านั้นที่ด้านบนสุดของ iTunes ใช้หลอดบาร์กราฟแท่ง IN-13 รัสเซียสิบสี่หลอดเป็นจอแสดงผล ความยาวที่หลอดนิกซี่แต่ละหลอดสว่างขึ้นแสดงถึงปริมาตรของความถี่ที่แน่นอนในมิว