جدول المحتويات:

المصباح الذكي (TCfD) - قوس قزح + مصور الموسيقى: 7 خطوات (بالصور)
المصباح الذكي (TCfD) - قوس قزح + مصور الموسيقى: 7 خطوات (بالصور)

فيديو: المصباح الذكي (TCfD) - قوس قزح + مصور الموسيقى: 7 خطوات (بالصور)

فيديو: المصباح الذكي (TCfD) - قوس قزح + مصور الموسيقى: 7 خطوات (بالصور)
فيديو: المصباح الذكي | مزود بحساس حركة 360 درجة 2024, يوليو
Anonim
Image
Image
مخطط الرسم البياني
مخطط الرسم البياني

تم تنفيذ هذا المشروع لدورة "تكنولوجيا تصميم المفاهيم" في TUDelft

المنتج النهائي عبارة عن مصباح LED أساسي ESP-32 ومتصل بالخادم. بالنسبة للنموذج الأولي ، فإن المصباح له وظيفتان ؛ تأثير قوس قزح الذي ينبعث توهجًا مهدئًا يتحول للألوان تجاه محيطه وثانيًا متخيل الصوت حيث "ترقص" وحدات البكسل LED وفقًا لمستويات الصوت. النظام متصل بشبكة wifi ويمكن للمستخدم اختيار التأثير الذي يريده من المصباح عبر WIFI.

توفر لنا الرقاقة الدقيقة ESP-32 رخيصة معالجات قوية ، ومستشعر القاعة يحمل في ثناياه عوامل ، ومستشعر درجة الحرارة ، ومستشعر اللمس وأيضًا قدرة wifi والبلوتوث. مع هذا ، في حين تم اختيار تأثيرين فقط لهذا المشروع ، فإن الآثار المترتبة على هذا المصباح "الذكي" لا حدود لها. يمكن استخدامه للإشارة إلى الطقس للمستخدم ، أو درجة حرارة الغرفة ، ويمكن للمصباح نفسه أن يعمل كمحرك إنذار أو يمكن أن يعطي توهجًا هادئًا لأشعة الشمس بجوار سريرك ليحاكي شروق الشمس لتجربة إيقاظ لطيفة.

الخطوة 1: المواد المطلوبة

اردوينو esp32

مستشعر الصوت

محول المستوى المنطقي ثنائي الاتجاه رباعي الاتجاه

نيوبكسل ليد 2 م 60 ليد / م

أسلاك العبور

كابل Micro USB مع محول

اتصال بالإنترنت

الخطوة 2: مخطط الدائرة

تم رسم مخطط الدائرة وتم عمل الدائرة وفقًا لذلك على النحو الوارد في

الرسم البياني أدناه.

الخطوة 3: كود اردوينو

هنا ، تم إنشاء رمز متخيل أولاً. ثم ، مثالين على الكود

؛ "neoplxel RGBW starndtest" ؛ و "simpleWebServerWifi" تم تعديله وإدماجه في كود المتخيل. على الرغم من أن الرمز لا يزال عربات التي تجرها الدواب في بعض الأحيان (يضيء مصباح LED عشوائيًا من وقت لآخر). سيتم تحديث التكرار التالي للرمز (بمجرد حصولنا على الوقت الكافي).

#يشمل

#ifdef _AVR_

#يشمل

#إنهاء إذا

const int numReadings = 5 ؛

قراءات int [numReadings] ؛

int readIndex = 0 ؛

مجموع int = 0 ؛

متوسط كثافة العمليات = 0 ؛

int micPin = 33 ؛

# تعريف رقم التعريف الشخصي 4

# تعريف 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 };

#يشمل

#يشمل

char ssid = "شبكتك" ؛ // شبكتك SSID (الاسم)

char pass = "secretPassword" ؛ // كلمة مرور شبكتك

مفتاح int keyIndex = 0 ؛ // رقم فهرس مفتاح الشبكة (مطلوب فقط لـ WEP)

حالة int = WL_IDLE_STATUS ؛

خادم WiFiServer (80) ؛

الإعداد باطل()

{

Serial.begin (9600) ؛ // تهيئة الاتصال التسلسلي

pinMode (9 ، الإخراج) ؛ // اضبط وضع دبوس LED

// تحقق من وجود الدرع:

إذا (WiFi.status () == WL_NO_SHIELD) {

Serial.println ("درع WiFi غير موجود") ؛

احيانا صحيح)؛ // لا تستمر

}

String fv = WiFi.firmwareVersion () ،

إذا (fv! = "1.1.0") {

Serial.println ("الرجاء ترقية البرنامج الثابت") ؛

}

// محاولة الاتصال بشبكة Wifi:

بينما (الحالة! = WL_CONNECTED) {

Serial.print ("محاولة الاتصال بشبكة باسم:")؛

Serial.println (ssid) ؛ // طباعة اسم الشبكة (SSID) ؛

// الاتصال بشبكة WPA / WPA2. غيّر هذا الخط إذا كنت تستخدم شبكة مفتوحة أو شبكة WEP:

status = WiFi.begin (ssid، pass) ؛

// انتظر 10 ثوانٍ للاتصال:

تأخير (10000) ؛

}

server.begin () ، // بدء خادم الويب على المنفذ 80

printWifiStatus () ، // أنت متصل الآن ، لذا اطبع الحالة

}

{

Serial.begin (9600) ؛

strip.setBrightness (سطوع) ؛

strip.begin () ،

عرض الشريط()؛ // تهيئة جميع وحدات البكسل على "إيقاف"

pinMode (micPin ، الإدخال) ؛

لـ (int thisReading = 0؛ thisReading <numReadings؛ thisReading ++) {

قراءات [thisReading] = 0 ؛

}

}

قوس قزح باطل (uint8_t انتظر) {

uint16_t أنا ، ي ؛

لـ (j = 0 ؛ j <256 ؛ j ++) {

لـ (أنا = 0 ؛ أنا

strip.setPixelColor (i ، Wheel ((i + j) & 255)) ؛

}

عرض الشريط()؛

تأخير (انتظر) ؛

}

}

متخيل باطل () {

total = total - القراءات [readIndex] ؛

القراءات [readIndex] = analogRead (micPin) ؛

المجموع = مجموع + القراءات [فهرس القراءة] ؛

readIndex = readIndex + 1 ؛

إذا (readIndex> = numReadings) {

readIndex = 0 ؛

}

المتوسط = المجموع / numReadings ؛

تأخير (1) ؛

عدد وحدات البكسل = (متوسط 100) / 5 ؛

Serial.println (ميكروفون) ؛

إذا (micpixel> 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) ؛

عرض الشريط()؛

}

}

إذا كان (micpixel <0) {

لـ (int j = 0 ؛ j <= 20 ؛ j ++)

strip.setPixelColor (j ، 0 ، 0 ، 50 ، 0) ؛

عرض الشريط()؛

}

}

حلقة فارغة() {

{

عميل WiFiClient = server.available () ؛ // استمع للعملاء القادمين

if (client) {// إذا حصلت على عميل ،

Serial.println ("عميل جديد") ؛ // طباعة رسالة من المنفذ التسلسلي

String currentLine = ""؛ // عمل سلسلة لحفظ البيانات الواردة من العميل

while (client.connected ()) {// حلقة أثناء اتصال العميل

if (client.available ()) {// إذا كان هناك بايت للقراءة من العميل ،

char c = client.read () ؛ // قراءة بايت ، ثم

Serial.write (ج) ؛ // اطبعها على الشاشة التسلسلية

if (c == '\ n') {// إذا كان البايت حرف سطر جديد

// إذا كان السطر الحالي فارغًا ، فستحصل على حرفين سطرين جديدين على التوالي.

// هذه هي نهاية طلب HTTP للعميل ، لذا أرسل ردًا:

إذا (currentLine.length () == 0) {

// تبدأ رؤوس HTTP دائمًا برمز استجابة (مثل HTTP / 1.1 200 OK)

// ونوع المحتوى حتى يعرف العميل ما هو قادم ، ثم سطر فارغ:

client.println ("HTTP / 1.1 200 OK") ؛

client.println ("نوع المحتوى: نص / html") ؛

client.println () ،

// يتبع محتوى استجابة HTTP الرأس:

client.print ("انقر هنا تشغيل تأثير قوس قزح") ؛

client.print ("انقر هنا Turn on Visualizer") ؛

// تنتهي استجابة HTTP بسطر فارغ آخر:

client.println () ،

// الخروج من حلقة while:

استراحة؛

} else {// إذا حصلت على سطر جديد ، فامسح currentLine:

currentLine = "" ؛

}

} else if (c! = '\ r') {// إذا كان لديك أي شيء آخر عدا حرف إرجاع ،

الخط الحالي + = ج ؛ // إضافته إلى نهاية السطر الحالي

}

// تحقق لمعرفة ما إذا كان طلب العميل "GET / H" أو "GET / L":

إذا (currentLine.endsWith ("GET / R")) {

قوس قزح (10) ؛ // تم تشغيل تأثير قوس قزح

}

إذا (currentLine.endsWith ("GET / V")) {

متخيل () ؛ // متخيل قيد التشغيل

}

}

}

// أغلق الاتصال:

client.stop () ؛

Serial.println ("العميل غير متصل") ؛

}

}

printWifiStatus () باطلة {

// طباعة SSID للشبكة التي تتصل بها:

Serial.print ("SSID:") ؛

Serial.println (WiFi. SSID ()) ؛

// طباعة عنوان IP الخاص بدرع WiFi:

IPAddress ip = WiFi.localIP () ؛

Serial.print ("عنوان IP:") ؛

Serial.println (ip) ؛

// طباعة قوة الإشارة المستلمة:

long rssi = WiFi. RSSI () ؛

Serial.print ("قوة الإشارة (RSSI):") ؛

Serial.print (rssi) ؛

Serial.println ("ديسيبل") ؛

// طباعة إلى أين تذهب في المتصفح:

Serial.print ("لمشاهدة هذه الصفحة أثناء العمل ، افتح مستعرضًا لـ https://") ؛

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) {

العودة (ج >> 16) ؛

}

uint8_t أخضر (uint32_t c) {

العودة (ج >> 8) ؛

}

uint8_t blue (uint32_t c) {

العودة (ج) ؛

}

}

//Serial.println(micpixel) ؛

}

الخطوة 4: طباعة ثلاثية الأبعاد لقاعدة المصباح

طباعة ثلاثية الأبعاد لقاعدة المصباح
طباعة ثلاثية الأبعاد لقاعدة المصباح

تم قياس وتصميم وطباعة نموذج ثلاثي الأبعاد لقاعدة المصباح بأبعاد كبيرة بما يكفي لتناسب جميع المكونات الكهربائية داخل حجرة القاعدة.

الخطوة 5: مرفق الصمام

مرفق الصمام
مرفق الصمام

تم لف ليد في لفة من الورق المقوى وربطها بشريط مزدوج الجوانب ، وتم حفر ثقب في الجزء السفلي لتمرير السلك من خلاله

الخطوة 6: حاوية المصباح

حاوية المصباح
حاوية المصباح

تم إنشاء العلبة من خلال العثور على زجاجة شفافة بعرض مماثل لقاعدة المصباح وارتفاعه مثل ملحق LED. ثم تمت تغطيتها بورق سميك لتحسين انتشار الضوء. بدلاً من ذلك ، من الممكن استخدام الزجاج المصنفر أو الأنابيب البلاستيكية الشفافة كحاوية للمصباح.

الخطوة 7: الإعداد

اقامة
اقامة

تم لصق كل شيء معًا وتجميعه. وكان المصباح جاهزا لبعض الاختبارات !.

موصى به: