Բովանդակություն:

Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 քայլ (նկարներով)
Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 քայլ (նկարներով)

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 քայլ (նկարներով)

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 քայլ (նկարներով)
Video: LG Life’s Good Award : Conference - Full | LG 2024, Նոյեմբեր
Anonim
Image
Image
Շղթայի դիագրամ
Շղթայի դիագրամ

Այս նախագիծը կատարվում է TUDelft- ում Technology for Concept Design դասընթացի համար

Վերջնական արտադրանքը ESP-32 բազային LED լամպ է և միացված է սերվերին: Նախատիպի համար լամպն ունի երկու գործառույթ. ծիածանի էֆեկտ, որն արտացոլում է հանգստացնող գույն, որը փոխում է փայլը դեպի շրջակայքը և երկրորդ ՝ ձայնային արտացոլիչ, որտեղ LED պիքսելները «պարում են» ըստ ձայնի մակարդակի: Համակարգը միացված է wifi- ին, և օգտվողը կարող է ընտրել, թե ինչ ազդեցություն են ուզում լամպից WIFI- ի միջոցով:

Էժան ESP-32 միկրոչիպը մեզ տրամադրում է հզոր պրոցեսորներ, ներկառուցված սրահի սենսոր, ջերմաստիճանի տվիչ, հպման ցուցիչ, ինչպես նաև wifi և bluetooth հնարավորություններ: Մինչդեռ այս նախագծի համար ընտրվել է ընդամենը երկու էֆեկտ, այս «խելացի» լամպի ենթատեքստն անսահմանափակ է: Այն կօգտագործվի օգտագործողին եղանակը կամ սենյակի ջերմաստիճանը նշելու համար, լամպն ինքնին կարող է ազդանշանի ազդանշան հանդիսանալ կամ կարող է հանգստացնող արևի փայլ հաղորդել ձեր անկողնու կողքին ՝ արևածագը մոդելավորելով հաճելի արթնանալու փորձի համար:

Քայլ 1: Անհրաժեշտ նյութեր

Arduino esp32

Ձայնի տվիչ

Չորս ուղղությամբ երկկողմանի տրամաբանական մակարդակի փոխարկիչ

Neopixel led 2m 60 led/մ

Jumper լարերը

Միկրո USB մալուխ ՝ ադապտորով

Ինտերնետ կապը

Քայլ 2: Շղթայի դիագրամ

Շրջանակային դիագրամ կազմվեց և համապատասխանաբար կազմվեց միացում, ինչպես տրված է

ստորև բերված դիագրամը:

Քայլ 3: Arduino կոդ

Այստեղ նախ կազմվեց վիզուալիզատորի կոդը: Այնուհետև երկու օրինակ կոդ

; «Neoplxel RGBW աստղային փորձարկում»; և «simpleWebServerWifi» - ն փոփոխվել և ինտեգրվել է վիզուալիզատոր կոդի մեջ: Թեև ծածկագիրը երբեմն դեռ խափանված է (պատահական լուսադիոդի լուսավորություն ժամանակ առ ժամանակ): Կոդի հաջորդ կրկնությունը (բավական ժամանակ ստանալուց հետո) կթարմացվի:

#ներառում

#ifdef _AVR_

#ներառում

#էնդիֆ

const int numReadings = 5;

int ընթերցումներ [numReadings];

int readIndex = 0;

int ընդհանուր = 0;

int միջին = 0;

int micPin = 33;

#սահմանեք PIN 4

#սահմանել NUM_LEDS 120

#սահմանեք ՊԱՀՔՈ 100ԹՅՈՆԸ 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 = "yourNetwork"; // ձեր ցանցի SSID (անունը)

char pass = "secretPassword"; // ձեր ցանցի գաղտնաբառը

int keyIndex = 0; // ձեր ցանցի բանալու ինդեքսի համարը (անհրաժեշտ է միայն WEP- ի համար)

int կարգավիճակ = WL_IDLE_STATUS;

WiFiServer սերվեր (80);

դատարկ կարգավորում ()

{

Serial.begin (9600); // սկզբնավորել սերիական հաղորդակցությունը

pinMode (9, OUTPUT); // սահմանել 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, pass);

// սպասեք 10 վայրկյան կապի համար.

ուշացում (10000);

}

server.begin (); // գործարկեք վեբ սերվերը 80 նավահանգստում

printWifiStatus (); // Դուք այժմ միացված եք, այնպես որ տպեք կարգավիճակը

}

{

Serial.begin (9600);

strip.setBrightness (BRIGHTNESS);

strip.begin ();

strip.show (); // Նախագծել բոլոր պիքսելները «անջատված»

pinMode (micPin, INPUT);

համար (int thisReading = 0; thisReading <numReadings; thisReading ++) {

ընթերցումներ [thisReading] = 0;

}

}

դատարկ ծիածան (uint8_t սպասել) {

uint16_t i, j;

համար (j = 0; j <256; j ++) {

համար (i = 0; i

strip.setPixelColor (i, անիվ ((i+j) & 255));

}

strip.show ();

ուշացում (սպասել);

}

}

դատարկ վիզուալիզատոր () {

ընդհանուր = ընդհանուր - ընթերցումներ [readIndex];

ընթերցումներ [readIndex] = analogRead (micPin);

ընդհանուր = ընդհանուր + ընթերցումներ [readIndex];

readIndex = readIndex + 1;

եթե (readIndex> = numReadings) {

readIndex = 0;

}

միջին = ընդհանուր / թվային ընթերցումներ;

ուշացում (1);

int micpixel = (միջին -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);

strip.show ();

}

}

եթե (micpixel <0) {

համար (int j = 0; j <= 20; j ++)

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

strip.show ();

}

}

դատարկ շրջան () {

{

WiFiClient client = server.available (); // լսեք մուտքային հաճախորդների համար

եթե (հաճախորդ) {// եթե հաճախորդ եք ստանում, Serial.println («նոր հաճախորդ»); // հաղորդագրություն տպել սերիական նավահանգստից

String currentLine = ""; // կատարել տող `հաճախորդից մուտքային տվյալները պահելու համար

while (client.connected ()) {// հանգույց, մինչ հաճախորդը միացված է

if (client.available ()) {// եթե հաճախորդից կարդալու բայթեր կան, char c = client.read (); // կարդալ բայթ, ապա

Սերիա. Գրել (գ); // տպեք այն սերիական մոնիտորը

եթե (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 («Կտտացրեք այստեղ Միացնել ainիածանի էֆեկտը»);

client.print («Կտտացրեք այստեղ Միացնել Visualizer»);

// HTTP պատասխանը ավարտվում է մեկ այլ դատարկ տողով.

client.println ();

// դուրս գալ while օղակից:

ընդմիջում;

} else {// եթե ունեք նոր գիծ, ապա ջնջեք currentLine- ը ՝

currentLine = "";

}

} else if (c! = '\ r') {// եթե դուք ունեք որևէ այլ բան, բացի կառքի վերադարձի բնույթից, currentLine += c; // ավելացնել այն ընթացիկ գծի վերջում

}

// Ստուգեք ՝ արդյոք հաճախորդի հարցումը «GET /H» կամ «GET /L» էր.

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

Ainիածան (10); // Rիածանի էֆեկտը միացված է

}

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

Visualizer (); // Visualizer- ը միացված է

}

}

}

// փակել կապը.

client.stop ();

Serial.println («հաճախորդն անջատված է»);

}

}

void printWifiStatus () {

// տպեք այն ցանցի SSID- ը, որին կցված եք.

Serial.print ("SSID:");

Serial.println (WiFi. SSID ());

// տպեք ձեր WiFi վահանի IP հասցեն.

IPAddress ip = WiFi.localIP ();

Serial.print («IP հասցե ՝»);

Serial.println (ip);

// տպել ստացված ազդանշանի ուժը.

երկար rssi = WiFi. RSSI ();

Serial.print ("ազդանշանի ուժգնություն (RSSI):");

Serial.print (rssi);

Serial.println («dBm»);

// տպեք, թե ուր գնալ դիտարկիչում.

Serial.print ("Այս էջը գործնականում տեսնելու համար դիտարկիչը բացեք https:// հասցեով");

Serial.println (ip);

}

}

uint32_t Անիվ (բայթ 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 կապույտ (uint32_t գ) {

վերադարձ (գ);

}

}

//Serial.println(micpixel);

}

Քայլ 4. Լամպի հիմքը 3d տպելը

3d Լամպի հիմքը տպելը
3d Լամպի հիմքը տպելը

Լամպի բազայի 3D մոդելը չափվել, նախագծվել և տպագրվել է չափսերով բավականաչափ մեծ, որպեսզի տեղավորվեն բազայի խցիկի ներսում առկա բոլոր էլեկտրական բաղադրիչները:

Քայլ 5: Առաջնորդված հավելված

Led հավելված
Led հավելված

Led- երը փաթաթված էին ստվարաթղթե գլանափաթեթով և ամրացված երկկողմանի ժապավենի միջոցով, ներքևի հատվածում անցք էր փորված ՝ մետաղալարն անցնելու համար

Քայլ 6: Լամպի պարիսպ

Լամպի պարիսպ
Լամպի պարիսպ

Պարիսպ է ստեղծվել `գտնելով թափանցիկ շիշ, որի լայնությունը նման է լամպի հիմքին և բարձրությանը, ինչպես LED- ի կցորդը: Այնուհետև այն ծածկված էր հաստ թուղթով ՝ լույսի ավելի լավ տարածման համար: Այլապես, հնարավոր է օգտագործել ցրտահարված ապակի կամ կիսաթափանցիկ պլաստիկ խողովակներ `որպես լամպի պատյան:

Քայլ 7: Կարգավորում

Կարգավորում
Կարգավորում

Ամեն ինչ սոսնձված էր և հավաքված: Եվ լամպը պատրաստ էր որոշ փորձարկումների:

Խորհուրդ ենք տալիս: