Përmbajtje:

Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 hapa (me fotografi)
Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 hapa (me fotografi)

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 hapa (me fotografi)

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer: 7 hapa (me fotografi)
Video: LG Life’s Good Award : Conference - Full | LG 2024, Nëntor
Anonim
Image
Image
Diagrami i qarkut
Diagrami i qarkut

Ky projekt është bërë për kursin Teknologji për Dizajnim Koncepti në TUDelft

Produkti Final është një llambë LED bazë ESP-32 dhe është e lidhur me serverin. Për prototipin, llamba ka dy funksione; një efekt ylberi që lëshon një ngjyrë qetësuese që zhvendos shkëlqimin drejt mjedisit të tij dhe së dyti vizualizues të zërit ku pikselët LED "vallëzojnë" sipas niveleve të zërit. Sistemi është i lidhur me wifi dhe përdoruesi është në gjendje të zgjedhë efektin që dëshiron nga llamba përmes WIFI.

Mikroçipi i lirë ESP-32 na siguron procesorë të fuqishëm, sensor salle të integruar, sensor të temperaturës, sensor prekje dhe gjithashtu aftësi wifi dhe bluetooth. Me këtë, Ndërsa vetëm dy efekte u zgjodhën për këtë projekt, nënkuptimi i kësaj llambë "të zgjuar" është i pakufizuar. Do të përdoret për të treguar motin tek përdoruesi, ose temperaturën e dhomës, vetë llamba mund të veprojë si një shkas alarmi ose mund të japë një shkëlqim qetësues të dritës së diellit pranë shtratit tuaj duke simuluar lindjen e diellit për një përvojë të këndshme zgjimi.

Hapi 1: Materiali i nevojshëm

Arduino esp32

Sensori i zërit

Konvertuesi i nivelit të logjikës me dy drejtime me katër drejtime

Neopixel led 2m 60 led/m

Telat e kërcyesit

Kabllo mikro USB me përshtatës

lidhje interneti

Hapi 2: Diagrami i Qarkut

Një diagram qark u vizatua dhe qarku u bë në përputhje me rrethanat siç është dhënë në

diagramin më poshtë.

Hapi 3: Kodi Arduino

Këtu, së pari u bë kodi i vizualizuesit. Pastaj, dy shembuj të kodit

; "Neoplxel RGBW starndtest"; dhe "simpleWebServerWifi" u modifikua dhe u integrua brenda kodit të vizualizuesit. Edhe pse kodi është akoma i gabuar ndonjëherë (drita e rastësishme e dritës ndizet herë pas here). Përsëritja tjetër e kodit (sapo të kemi kohë të mjaftueshme) do të përditësohet.

#përfshi

#ifdef _AVR_

#përfshi

#endif

const int numRlexime = 5;

leximet int [numReadings];

int readIndex = 0;

int total = 0;

mesatarja int = 0;

int micPin = 33;

#përcaktoni kodin PIN 4

#përcaktoni NUM_LEDS 120

#përkufizoni shkëlqimin 100

Rrip Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

byte 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 };

#përfshi

#përfshi

char ssid = "Rrjeti yt"; // SSID i rrjetit tuaj (emri)

char pass = "passwordPassword"; // fjalëkalimi i rrjetit tuaj

int keyIndex = 0; // Numri i indeksit të çelësit të rrjetit tuaj (nevojitet vetëm për WEP)

int status = WL_IDLE_STATUS;

Serveri WiFiServer (80);

void setup ()

{

Serial.filloj (9600); // inicoj komunikimin serik

pinMode (9, OUTPUT); // vendosni modalitetin e pinit LED

// kontrolloni praninë e mburojës:

nëse (WiFi.status () == WL_NO_SHIELD) {

Serial.println ("Mburoja WiFi nuk është e pranishme");

ndërsa (e vërtetë); // mos vazhdo

}

String fv = WiFi.firmwareVersion ();

nëse (fv! = "1.1.0") {

Serial.println ("Ju lutemi azhurnoni firmware -in");

}

// përpjekja për t'u lidhur me rrjetin Wifi:

ndërsa (statusi! = WL_CONNECTED) {

Serial.print ("Përpjekja për t'u lidhur me Rrjetin me emrin:");

Serial.println (ssid); // printoni emrin e rrjetit (SSID);

// Lidhu me rrjetin WPA/WPA2. Ndryshoni këtë linjë nëse përdorni rrjet të hapur ose WEP:

statusi = WiFi.filloni (ssid, kaloni);

// prisni 10 sekonda për lidhje:

vonesë (10000);

}

server.filloj (); // filloni serverin në internet në portin 80

printWifiStatus (); // ju jeni lidhur tani, kështu që printoni statusin

}

{

Serial.filloj (9600);

strip.setBrightness (BRIGHTNESS);

strip.filloj ();

shirit.shfaq (); // Filloni të gjithë pikselët në "jo"

pinMode (micPin, INPUT);

për (int thisReading = 0; thisReading <numReadings; thisReading ++) {

lexime [thisReading] = 0;

}

}

ylber i pavlefshëm (uint8_t prit) {

uint16_t i, j;

për (j = 0; j <256; j ++) {

për (i = 0; i

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

}

shirit.shfaq ();

vonesë (pritje);

}

}

vizualizues i pavlefshëm () {

total = total - lexime [readIndex];

leximet [readIndex] = analogRead (micPin);

total = total + lexime [readIndex];

readIndex = readIndex + 1;

nëse (readIndex> = numReadings) {

readIndex = 0;

}

mesatare = total / numR lexime;

vonesa (1);

int mikpixel = (mesatarja-100)/5;

Serial.println (mikpixel);

nëse (micpixel> 0) {

{

për (int j = 0; j <= mikpixel; j ++)

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

për (int j = mikpixel; j <= NUM_LEDS; j ++)

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

shirit.shfaq ();

}

}

nëse (micpixel <0) {

për (int j = 0; j <= 20; j ++)

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

shirit.shfaq ();

}

}

lak void () {

{

Klienti WiFiClient = server.available (); // dëgjoni për klientët që vijnë

nëse (klienti) {// nëse merrni një klient, Serial.println ("klient i ri"); // printoni një mesazh nga porti serik

String currentLine = ""; // bëni një String për të mbajtur të dhënat hyrëse nga klienti

ndërsa (klienti.lidhur ()) {// lak ndërsa klienti është i lidhur

if (client.available ()) {// nëse ka byte për të lexuar nga klienti, char c = client.read (); // lexoni një byte, atëherë

Serial.shkruani (c); // printoni atë nga monitori serik

if (c == '\ n') {// nëse bajti është një karakter i linjës së re

// nëse rreshti aktual është bosh, keni dy karaktere të linjës së re në një rresht.

// ky është fundi i kërkesës së klientit HTTP, kështu që dërgoni një përgjigje:

nëse (currentLine.length () == 0) {

// Titujt HTTP gjithmonë fillojnë me një kod përgjigjeje (p.sh. HTTP/1.1 200 OK)

// dhe një lloj përmbajtjeje në mënyrë që klienti të dijë se çfarë po vjen, pastaj një vijë bosh:

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

client.println ("Lloji i përmbajtjes: tekst/html");

klient.println ();

// përmbajtja e përgjigjes HTTP ndjek titullin:

client.print ("Kliko këtu Aktivizo efektin Rainbow");

client.print ("Kliko këtu Aktivizo Visualizer");

// Përgjigja HTTP përfundon me një linjë tjetër bosh:

klient.println ();

// dal nga laku while:

pushim;

} else {// nëse keni një linjë të re, atëherë pastroni CurrentLine:

currentLine = "";

}

} tjetër nëse (c! = '\ r') {// nëse keni ndonjë gjë tjetër përveç një karakteri të kthimit të karrocës, currentLine += c; // shtojeni atë në fund të vijës aktuale

}

// Kontrolloni për të parë nëse kërkesa e klientit ishte "GET /H" ose "GET /L":

nëse (currentLine.endsWith ("GET /R")) {

Ylber (10); // Efekti ylber u ndez

}

nëse (currentLine.endsWith ("GET /V")) {

Visualizer (); // Visualizer është aktivizuar

}

}

}

// mbyllni lidhjen:

client.stop ();

Serial.println ("klienti i shkëputur");

}

}

void printWifiStatus () {

// printoni SSID -in e rrjetit ku jeni bashkangjitur:

Serial.print ("SSID:");

Serial.println (WiFi. SSID ());

// printoni adresën IP të mburojës tuaj WiFi:

IPAddress ip = WiFi.localIP ();

Serial.print ("Adresa IP:");

Serial.println (ip);

// printoni fuqinë e marrë të sinjalit:

gjatë rssi = WiFi. RSSI ();

Serial.print ("fuqia e sinjalit (RSSI):");

Serial.print (rssi);

Serial.println ("dBm");

// printoni ku të shkoni në një shfletues:

Serial.print ( Për të parë këtë faqe në veprim, hapni një shfletues në

Serial.println (ip);

}

}

uint32_t Rrota (byte WheelPos) {

WheelPos = 255 - WheelPos;

nëse (WheelPos <85) {

shiriti i kthimit. Ngjyra (255 - WheelPos * 3, 0, WheelPos * 3, 0);

}

nëse (WheelPos <170) {

WheelPos -= 85;

shiriti i kthimit. Ngjyra (0, WheelPos * 3, 255 - WheelPos * 3, 0);

}

WheelPos -= 170;

shiriti i kthimit. Ngjyra (WheelPos * 3, 255 - WheelPos * 3, 0, 0);

}

uint8_t e kuqe (uint32_t c) {

kthimi (c >> 16);

}

uint8_t jeshile (uint32_t c) {

kthimi (c >> 8);

}

uint8_t blu (uint32_t c) {

kthimi (c);

}

}

//Serial.println(micpixel);

}

Hapi 4: Shtypja 3D e Bazës së Llambës

3d Shtypja e Bazës së Llambës
3d Shtypja e Bazës së Llambës

Një model 3d i bazës së llambës u mat, u projektua dhe u shtyp me dimensione mjaft të mëdha për të përshtatur të gjithë përbërësit elektrikë brenda ndarjes bazë.

Hapi 5: Bashkëngjitja Led

Shtojca e udhëhequr
Shtojca e udhëhequr

Led -et u mbështjellën në rrotull kartoni dhe u lidhën duke përdorur shirit të dyanshëm, një vrimë u shpua në pjesën e poshtme për të kaluar tela përmes

Hapi 6: Mbulimi i llambës

Mbulimi i llambës
Mbulimi i llambës

Një rrethim u bë duke gjetur një shishe transparente me gjerësi të ngjashme me bazën e llambës dhe lartësinë si shtojca LED. Kjo më pas u mbulua me letër të trashë për shpërndarje më të mirë të dritës. Përndryshe, është e mundur që të përdorni xham të mbuluar me brymë ose tuba plastike të tejdukshme si rrethues llambash.

Hapi 7: Konfigurimi

Konfigurimi
Konfigurimi

Gjithçka ishte ngjitur dhe montuar. Dhe llamba ishte gati për disa prova !.

Recommended: