Sisukord:
- Samm: selle projekti loomiseks vajate
- 2. samm: kast ja võlukepp
- Samm: riistvara sees
- Samm 4: Tarkvara
Video: Hue Magic: 4 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:48
Tere võlurid!
Paar kuud tagasi lõin oma 3 -aastasele pojale väikese võlukarbi võlukepiga. Kui ta puudutab võlukepiga karpi, hakkab kastist kiirgama muutuv värviline tuli. Kui ta näeb värvi, mis talle eriti meeldib, võib ta suunata võlukepi laualambi poole (Philips Hue pirniga sees), loitsida ja kastist tulev värv hüppab võluväel lambi poole! Karbi lamp ja valgus on äkki sama värvi…
Mõne sekundi pärast värv kaob ja laualamp naaseb oma olekusse enne loitsu. Kuni uue loitsu tegemiseni…
Samm: selle projekti loomiseks vajate
Selle projekti loomiseks vajate järgmisi materjale:
- 1 (või rohkem) Philips Hue värvipirn ja Hue Bridge
- 1 Wemos D1 mini või sarnane esp8266-põhine mikrokontroller
- 1 (Arduino) puuteandur (nt TTP223R)
- 1 (Arduino) hetkeline nupp
- 1 10uF kondensaator
- 1 RGB LED (tavaline anooditüüp)
- 5 takistit (10, 22 ja 47 oomi, 2x 10 K oomi)
- 2 väikest PCB prototüüpimist (2x3 tolli või umbes 5x7 cm peaks olema piisavalt suur)
- mõned (hüppaja) juhtmed
- jootekolb
- võlukepp (seda saab osta mänguasjapoest valmis kujul või saate seda ise teha)
- väike karp, mis on valmistatud papist või puidust (võib olla olemasolev kast, kuid võite ka kasti nullist ehitada)
- mingi lint
- mõned liimid ja/või mutrid ja poldid PCB -de kinnitamiseks kasti.
- valikuline: ümbrispaber karbi jaoks
NB! Väike kogemus skeemide lugemisel on abiks selle juhendi läbimisel. Minu skeem ei ole liiga keeruline: kui suudate kondensaatorit takisti eristada, on teil tõenäoliselt kõik korras.
Abiks on ka mõned kogemused Arduino programmeerimisel Arduino IDE abil. Pigem peaks piisama elementaarsest kogemusest, kuna annan teile kopeerimiseks/kleepimiseks täieliku koodi. Peate siiski kohandama mõningaid asju, et see teie konkreetses seadistuses toimiks (nt võrgusätted ja mõned üksikasjad teie Hue konfiguratsioonist). Kui see tundub pisut hirmutav, ärge muretsege, aitan teil kogu vajaliku teabe hankida.
2. samm: kast ja võlukepp
Esimesed sammud on tavaliselt kõige raskemad, kuid mitte selles juhendatavas! Lihtsaks alustamiseks võite mänguasjapoest lihtsalt võluvitsa osta ja kasti jaoks võite lihtsalt uuesti kasutada olemasolevat väikest kasti, mille olete juba lamanud. Lihtsalt veenduge, et karp ei oleks metallist, kuna see blokeerib wifi signaalid ja me vajame neid võlu jaoks;-).
Olemasoleva kasti ümberkorraldamisel peate tegema ainult karbi ülaossa kaks auku: 1 väike auk (suurus 5 mm = 0,2 tolli) RGB-valgusdioodi jaoks ja suurem auk (umbes 12- 14 mm või umbes 0,5 ) puuteanduri jaoks.
Aukude täpne paigutus ei ole kriitiline, lihtsalt asetage need vastavalt oma esteetikale, kuid pidage meeles mõnda asja:
- Hoidke mõlema ava vahel teatud kaugus, veendumaks, et aukude alla paigaldatavad komponendid (RGB -LED ja puuteandur) võivad mõlemad paigaldamiseks ja juhtmestikuks piisavalt ruumi hõivata.
- Suurim auk on puutetundliku anduri jaoks. See andur paigaldatakse augu alla nii, et seda saab puudutada (ja isegi kergelt vajutada). Nii et veenduge, et ostetud võlukepp poleks liiga paks!
Soovi korral võite kasutada (pihustus) värvi või pakkepaberit ja katta plastikust, et muuta kast pisut ilusamaks ning kaitsta seda toidule lekkimise ja määrdunud käte eest.
Kui see esimene samm on teie maitsele pisut liiga ambitsioonikas, siis jätkake ja looge kast ja võlukepp täiesti nullist! Seal on mitu juhendit, mis aitavad teil ilusa võlukepi luua
Ükskõik, millise tee valite, on nüüd aeg uurida kasti sisemust.
Samm: riistvara sees
Elektrooniliste komponentide ühendamiseks kasutage jootekolvi vastavalt ülaltoodud skeemile. Erilist tähelepanu tuleb pöörata paarile asjale:
- Juhtmed Wemos D1 Mini ja RGB LED -i vahel peaksid olema piisavalt pikad, nii et RGB -LED -i saab paigaldada karbi kaane sisse tehtud auku.
- Hetkelüliti ja puutetundliku anduri külge kinnitatud juhtmete puhul on sama tähtsus, kuna need peaksid olema ligipääsetavad kaane teise augu kaudu.
- Hetkelüliti nupp tuleb liimida puuteanduri alumisele küljele (mittetundlikule küljele) selliselt, et saate nupu hetke lülitile tagasi panna, kui puuteandur on liimitud (vt pilti). Puuteandur on paigaldatud hetkelise lüliti peale, et tuvastada sõrmega tehtud nupuvajutusi, mille puhul nupuvajutust eiratakse. Alles siis, kui võluvitsaga nuppu vajutatakse (mis peaks olema mittejuhtiv, nii et plast ja puit on korras), algab võlusükkel.
- Paigaldage puutetundliku anduriga hetkeline nupp ülaosale mitte liiga sügavale kaane augu alla, sest maagia liikumiseks peab see olema võluvitsaga ligipääsetav.
- Jootmisel jälgige kindlasti kondensaatori polaarsust. Kui pöörate positiivsed ja negatiivsed juhtmed ümber, eraldab kondensaator tõenäoliselt maagilist suitsu ja paneb teie vooluahela igavesse unne.
- Liimige, kleepige teip ja või keerake patareipesa ja PCB (d) oma kohale. See ei pea olema puhas, kuna seda ei paista silma. See peaks olema lihtsalt kukkumiskindel.
Tarkvara juurde!
Samm 4: Tarkvara
Veenduge, et teil oleks uusim (tasuta) Arduino tarkvararedaktor, mille saate alla laadida aadressilt https://www.arduino.cc/en/Main/Software. Wemos D1 mini ja muude ESP8266-põhiste tahvlite toe lisamiseks toimige järgmiselt.
- Pärast installimist käivitage Arduino tarkvara ja avage eelistuste aken.
- Sisestage https://arduino.esp8266.com/stable/package_esp8266com_index.json väljale „Täiendavad juhatusehalduri URL -id“. Saate lisada mitu URL -i, eraldades need komadega.
- Avage Boards Manager menüüst Tools> Board ja installige platvorm esp8266 (ja ärge unustage pärast installimist valida ESP8266 plaat menüüst Tools> Board. "LOLIN (WEMOS) D1 R2 & mini" sobib kõige paremini Wemos D1 mini v2 ja v3 jaoks) lauad.
Kui vajate Arduino installimisel ja draiverite seadistamisel rohkem abi, saate vaadata aadressi
Avage Arduino redaktoris uus fail (Fail> Uus) ja kopeerige/kleepige allolev kood äsja avatud aknasse. Kirjutage lihtsalt üle uues aknas juba olevad read (tühine seadistus ja tühimik).
Nüüd olete peaaegu valmis, kuid peate kohandama paar koodi oma konkreetse seadistuse jaoks.
Esimene asi, mida teha, on muuta rea 34 ip -aadress (Arduino redaktoris koodirid nummerdatud) oma Hue silla ip -aadressiks. Kui te ei tea oma Hue Bridge'i IP -aadressi, külastage aadressi https://discovery.meethue.com/ ja õige IP -aadress kuvatakse kohe teie brauseris. IP -aadress on punktiir, mille ees on "internalipaddress".
Hue -tuledega suhtlemiseks peate looma Wemos D1 mini jaoks Hue API kasutaja, et Wemos saaks Hue API -ga Hue -valgusega suhelda. Selleks järgige juhiseid aadressil https://developers.meethue.com/develop/get-started-2/ ja kopeerige/kleepige loodud (päris pikk) kasutajanimi Arduino koodi aknasse. Lihtsalt asendage iga "YOUR HUE API USERNAME" loodud API kasutajanimega.
Seejärel peate värvi muutmiseks valima õige Hue -valguse. Hue API -s on igal valgusel number, seega peate leidma numbri, mis vastab valgusele, mida soovite selle projekti jaoks kasutada. Üks lihtsamaid viise, kuidas teada saada, milline number konkreetsel valgusallikal on, on rakenduse Hue Viewer allalaadimine Androidile või iOS -ile. Asendage tekst "YOUR LIGHT NUMBER" õige numbriga kõikjal Arduino koodi aknas.
Viimane asi, mida teha, on seadistada Wemos oma WiFi -võrguga ühenduse loomiseks. Selleks laadige kood üles Wemosesse ja lülitage sülearvuti teise WiFi -võrku: "AutoConnectAP" -i. Seejärel kuvab teie brauser lehe, kuhu saate lisada oma WiFi -võrgu SSID (nimi) ja parooli, mida Wemose kontroller kasutab teie WiFi -võrguga (ja Hue sillaga) ühenduse loomiseks.
NB! Kui koodi üleslaadimine meie Wemos D1 minisse USB kaudu ei toimi, peate võib -olla Wemose USB -kiibile draiveri alla laadima. Teie platvormi (Windows, Mac) draiveri saate alla laadida aadressilt
Nüüd olete valmis oma loomingut proovile panema!
// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Seda koodi on testitud Wemos D1 mini -ga, kuid tõenäoliselt töötab see ka teistel ESP8266 -põhistel arendusplaatidel // Wemos D1 mini ja muude ESP8266 tahvlite toe lisamiseks Arduino redaktorisse toimige järgmiselt. // - Käivitage Arduino ja avage eelistuste aken. // - Sisestage väljale Täiendava halduri URL -id aadress https://arduino.esp8266.com/stable/package_esp8266com_index.json. Saate lisada mitu URL -i, eraldades need komadega. // - Avage Boards Manager menüüst Tools> Board ja installige platvorm esp8266 (ja ärge unustage pärast installimist valida ESP8266 plaat menüüst Tools> Board). // kasutatud teegid: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Kohalik DNS -server, mida kasutatakse kõigi päringute ümbersuunamiseks WiFiManageri konfiguratsiooniportaali, kui WIFI -seadeid (SSID, parool) pole pole veel seadistatud. #include "ESP8266WebServer.h" // WiFiManageri konfiguratsiooniportaali teenindamiseks kasutatav kohalik veebiserver #include "WiFiManager.h" // WiFi Configuration Magic raamatukogu, kui see pole veel installitud, vaadake aadressi https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, vajalik Philips Hue API kasutamiseks (vt https://developers.meethue.com/develop/ hue-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, vajalik Hue API vastuse analüüsimiseks, installige versioon 5.x Arduino raamatukoguhalduri kaudu (menüü "Visand"> Kaasa raamatukogu> Halda Raamatukogud> otsige ArduinoJson ja muutke versioon uusimaks versiooniks 5.x). Versioon 6 (praegu beetaversioon) annab tõrke. // muutujad ja init: String vastus; const int redPin = 13; // Wemos on see d7 const int greenPin = 12; // Wemos on see d6 const int bluePin = 14; // Wemos on see d5 const int touchSensor = 5; // Wemos sellel on d1 const int aktiveeriminePin = 4; // Wemos on see d2 bool aktiveerimine = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; topelt x_restore; topelt y_restore; kahekordne x_magic; kahekordne y_magic; bool first = tõsi; allkirjata pikk startMillis; allkirjastamata pikkvoolMillis; allkirjastamata pikk kestusMillis; RestClient klient = RestClient ("192.168.178.23"); // "teie Hue Bridge'i IP -aadress" // Kui te ei tea oma Hue Bridge'i IP -aadressi, külastage aadressi https://discovery.meethue.com ja see kuvatakse kohe teie brauseris. IP -aadress on punktiir, millele eelneb "internalipaddress" void setup () {analogWriteRange (255); Seriaalne algus (9600); // Alustage LED -i väljalülitamisega. pinMode (aktiveerimispin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// siin pole midagi teha, jätke tühjaks…} void checkWand () {int rgbColour [3]; // James Hartoni RGB värvikood, https://gist.github.com/jamesotron/766994 // Alusta punasega. rgbVärv [0] = 255; rgbVärv [1] = 0; rgbVärv [2] = 0; aktiveerimine = digitalRead (aktivatsioonipin); // LOW tähendab, et kasutatakse võlukeppi. touch = digitalRead (touchSensor); // HIGH tähendab, et võlukepi asemel kasutatakse sõrme, mis ei tohiks nii olla. while (aktiveerimine == LOW && touch == LOW) {// Valige värvid, mida suurendada ja vähendada. jaoks (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = kolmekordne operaator, tähendab: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // kahe värvi ristpimendamine. jaoks (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbVärv [incColour] += 1; // kuna meie RGB -ledil on katoodi asemel ühine anood (seega peame ühendama +3,3 V maa asemel), vajame RGB jaoks pöördväärtusi: int red = 255 - rgbColour [0]; int roheline = 255 - rgbVärv [1]; int sinine = 255 - rgbVärv [2]; analogWrite (redPin, punane); analogWrite (rohelinePin, roheline); analogWrite (sininePin, sinine); viivitus (8); aktiveerimine = digitalRead (aktiveerimisPin); if (aktiveerimine == HIGH) {// HIGH tähendab, et võlukepp on üles tõstetud. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// pani Wemose unerežiimi: ESP.deepSleep (0); }} tühine RGBtoxy (int punane, int roheline, int sinine) {// vt https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = kaart (punane, 0, 255, 0, 1000); R /= 1000; topelt G = kaart (roheline, 0, 255, 0, 1000); G /= 1000; kahekordne B = kaart (sinine, 0, 255, 0, 1000); B /= 1000; R = (R> 0,04045f)? Pow ((R + 0,055f) / (1,0f + 0,055f), 2,4f): (R / 12,92f); G = (G> 0,04045f)? Pow ((G + 0,055f) / (1,0f + 0,055f), 2,4f): (G / 12,92f); B = (B> 0,04045f)? Pow ((B + 0,055f) / (1,0f + 0,055f), 2,4f): (B / 12,92f); kahekordne X = R * 0,649926f + G * 0,103455f + B * 0,197109f; kahekordne Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; kahekordne Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; kahekordne x = X / (X + Y + Z); topelt y = Y / (X + Y + Z); // teisendus pole täielikult lõpule viidud, kuid tõenäoliselt piisavalt hea selleks, mida me tahame saavutada, nii et jätke see nii ja saatke XY väärtused lambile: sendtoHue (x, y); } void sendtoHue (topelt a, kahekordne b) {// tegelik värvimuutus võlukeppade maagiast, kui (esimene) {// esimene läbisõit: hangi lambi praegune olek getCurrentValues (); } // seejärel saatke võluvitsa värvid: // oodake õigekirja: kaua oodake; x_maagiline = a; y_maagiline = b; // lamp põleb võluvitsa värviga: response = ""; int temp = juhuslik (2, 9); const char* olek = "tõsi"; for (int i = 1; i <= temp; i ++) {// loo sillale saatmiseks sümbolmassiiv: String temp_body1 = "{" on / ":" + String (olek) + ", \" bri / ": 220, / "xy \": [" + string (x_magic) +", " + string (y_magic) +"], / "transfertime \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // nüüd on meil char_massiivina post_body1; // tee puhkekõne: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); oota = juhuslik (100, 600); viivitus (oota); if (state == "true") {state = "false"; } else {state = "true"; }} // vähendada heledust…: response = ""; temp = juhuslik (4, 17); // loo sillale saatmiseks char -massiiv: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" transfertime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // nüüd on meil char_massiivina post_body2; // tee puhkekõne: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); oota = juhuslik (1000, 2500); viivitus (oota); //..ja muuta heledamaks uuesti: response = ""; temp = juhuslik (4, 17); // loo sillale saatmiseks char -massiiv: String temp_body3 = "{" bri_inc / ": 100, \" siirtumisaeg / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // nüüd on meil post_body3 char -massiivina; // tee puhkekõne: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); oota = juhuslik (2500, 5000); // oota 2-5 sekundit viivitust (oota); // ja naase vana väärtuse juurde: response = ""; // loo sillale saatmiseks char -massiiv: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + String (x_restore) +", " + String (y_restore) +"], / "transfertime \": " + String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // nüüd on meil char_massiivina post_body4; // tee puhkekõne: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // lähen uuesti magama … } unsigned int getCurrentValues () {connectWifi (); // kõigepealt ühenduse loomine Wifi vastusega = ""; // tee puhkekõne: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Olekukood serverist pärast GET:"); Serial.println (statusCodeGet); Serial.print ("Response body from server:"); Serial.println (vastus); StaticJsonBuffer jsonBuffer; // Jsoni vastuse sõelumine // Objektipuu juur. // // See on viide JsonObjectile, tegelikud baidid on // jsonBufferi sees koos kõigi teiste objektipuu sõlmedega. // Mälu vabaneb, kui jsonBuffer väljub. JsonObject & root = jsonBuffer.parseObject (vastus); JsonObject & state = root ["state"]; // Testi, kas parsimine õnnestub. if (! root.success ()) {Serial.println ("parseObject () ebaõnnestus"); } // Väärtuste toomine. aan_restore = olek ["on"]; Serial.println (aan_restore); bri_restore = olek ["bri"]; x_restore = olek ["xy"] [0]; y_restore = olek ["xy"] [1]; esimene = vale;} void connectWifi () {// Kohalik intialiseerimine. Kui tema äri on tehtud, pole vaja seda WiFiManager wifiManager ümber hoida; // seadete lähtestamine - testimiseks: //wifiManager.resetSettings (); // määrake tagasihelistamine, millele helistatakse, kui eelmise WiFi -ga ühenduse loomine ebaõnnestub, ja siseneb pääsupunkti režiimi wifiManager.setAPCallback (configModeCallback); // toob ssid ja pass ning proovib ühendust luua // kui see ei loo ühendust, käivitab ta määratud nimega pääsupunkti // siin "AutoConnectAP" // ja läheb blokeerimissilmusesse, mis ootab seadistamist, kui (! wifiManager.autoConnect ()) {Serial.println ("ebaõnnestus ühenduse loomine ja aegumine"); // lähtesta ja proovi uuesti või pane see võib -olla sügavasse unne ESP.reset (); viivitus (1000); } // kui siia jõuate, olete ühendanud WiFi Serial.println ("ühendatud… jah:)"); Serial.print ("Ühendatud:"); Serial.println (WiFi. SSID ()); Serial.print ("IP -aadress:"); Serial.println (WiFi.localIP ()); // Teie ESP -le määratud IP -aadress (Wemos) // printige vastuvõetud signaali tugevus: pikk rssi = WiFi. RSSI (); Serial.print ("signaali tugevus (RSSI):"); Seeria.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Sisestatud konfiguratsioonirežiim"); Serial.println (WiFi.softAPIP ()); // kui kasutasite automaatselt loodud SSID-d, printige see Serial.println (myWiFiManager-> getConfigPortalSSID ()); }
Soovitan:
Patareitoitega Wi-Fi nutikas nupp HUE-tulede juhtimiseks: 5 sammu (piltidega)
Patareitoitega Wi-Fi nutikas nupp HUE-tulede juhtimiseks: see projekt näitab, kuidas luua patareitoitega IoT Wi-Fi nuppu vähem kui 10 minutiga. Nupp juhib IFETT kaudu HUE tulesid. Täna saate ehitada elektroonilisi seadmeid ja ühendada need teiste nutikate kodumasinatega sõna otseses mõttes minutitega. Mis on
Jagage ja pikendage Philips Hue Lightstripi: 8 sammu (koos piltidega)
Jagage ja pikendage Philips Hue Lightstripi: olen lisanud rohkem " nutikat kodu " tüüpi vidinaid minu koju ja üks asi, millega olen mänginud, on Philips Hue Lightstrip. See on LED -tulede riba, mida saab juhtida rakendusest või nutika assistendi, näiteks Alexa või
Välistingimustes ilmastikukindel kinnitusvahend Lifx või Hue jaoks: 5 sammu (piltidega)
Välistingimustes, ilmastikukindel kinnitusvahend Lifx või Hue jaoks: tahtsin oma aeda oma Lifx Color 1000 pirnidega valgustada, nii õhtuseks nautimiseks kui ka aeg -ajalt tagaaias. Arvestades sibulate haavatavust niiskuse ja kuumusega, ei leidnud ma turult ühtegi kinnitusvahendit, mis kaitseks piisavalt
DIY Philips Hue paneelvalgusti: 4 sammu (piltidega)
DIY Philips Hue paneelvalgus: ostsin hiljuti oma magamistuppa mõned Philips Hue tuled. Nad on suurepärased! Ma saan neid Alexa abil oma häälega juhtida ja ka oma telefoni kaudu juhtida. Proovisin leida värvi muutva paneeli valgust, kuid nagu te ehk teate, ei näe Philips Hue seda
Meeleoluprojektor (häkkinud Philips Hue Light koos GSR -iga) TfCD: 7 sammu (koos piltidega)
Meeleoluprojektor (häkkinud Philips Hue Light koos GSR -iga) TfCD: autor Laura Ahsmann & Maaike Weber Eesmärk: Madal meeleolu ja stress on suur osa tänapäevasest kiirest elust. See on ka midagi, mis on väliselt nähtamatu. Mis siis, kui suudaksime oma stressitaset nii visuaalselt kui ka akustiliselt projitseerida