Inhoudsopgave:

Smart Lamp (TCfD) - Rainbow + Music Visualizer - Ajarnpa
Smart Lamp (TCfD) - Rainbow + Music Visualizer - Ajarnpa

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer - Ajarnpa

Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer - Ajarnpa
Video: LG Life’s Good Award : Conference - Full | LG 2024, Juli-
Anonim
Image
Image
Schakelschema
Schakelschema

Dit project is gedaan voor de cursus Technology for Concept Design aan de TUDelft

Het eindproduct is een ESP-32 basis LED-lamp en is verbonden met de server. Voor het prototype heeft de lamp twee functies; een regenboogeffect dat een rustgevende kleurverschuivende gloed uitstraalt naar de omgeving en ten tweede een geluidsvisualizer waarbij de LED-pixels "dansen" op basis van geluidsniveaus. Het systeem is verbonden met wifi en de gebruiker kan via wifi kiezen welk effect hij van de lamp wil.

De goedkope ESP-32-microchip biedt ons krachtige processors, ingebouwde hall-sensor, temperatuursensor, aanraaksensor en ook wifi- en bluetooth-mogelijkheden. Hiermee, Hoewel slechts twee effecten werden gekozen voor dit project, is de implicatie van deze "slimme" lamp grenzeloos. Het zou worden gebruikt om het weer aan de gebruiker of de temperatuur van de kamer aan te geven, de lamp zelf kan fungeren als een alarmtrigger of het kan een kalmerende zonlichtgloed naast je bed geven die de zonsopgang simuleert voor een prettige wakker worden.

Stap 1: Benodigd materiaal

Arduino esp32

Geluidssensor

Vierweg bidirectionele logische niveau-omzetter

Neopixel led 2m 60 led/m

Doorverbindingsdraden

Micro-USB-kabel met adapter

internetverbinding

Stap 2: Schakelschema

Er is een schakelschema getekend en het circuit is overeenkomstig gemaakt zoals aangegeven in

onderstaand schema.

Stap 3: Arduino-code

Hier werd eerst visualizer code gemaakt. Dan, twee voorbeeldcodes:

;“neoplxel RGBW stertest”; en "simpleWebServerWifi" is aangepast en geïntegreerd in de visualizer-code. Hoewel de code soms nog steeds buggy is (willekeurige led's lichten af en toe op). De volgende iteratie van de code (zodra we genoeg tijd hebben) zal worden bijgewerkt.

#erbij betrekken

#ifdef _AVR_

#erbij betrekken

#stop als

const int numReadings = 5;

int lezingen [numReadings];

int readIndex = 0;

int totaal = 0;

int gemiddelde = 0;

int micPin = 33;

#definieer pincode 4

#define NUM_LEDS 120

#define HELDERHEID 100

Adafruit_NeoPixel-strip = 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 };

#erbij betrekken

#erbij betrekken

char ssid = "uw netwerk"; // uw netwerk-SSID (naam)

char pass = "geheim wachtwoord"; // uw netwerkwachtwoord

int keyIndex = 0; // uw netwerksleutel Indexnummer (alleen nodig voor WEP)

int-status = WL_IDLE_STATUS;

WiFiServer-server (80);

ongeldige setup()

{

Serieel.begin(9600); // initialiseer seriële communicatie

pinMode(9, UITGANG); // stel de LED-pinmodus in

// controleer op de aanwezigheid van het schild:

if (WiFi.status() == WL_NO_SHIELD) {

Serial.println("WiFi-schild niet aanwezig");

terwijl (waar); // niet doorgaan

}

String fv = WiFi.firmwareVersion();

if (fv != "1.1.0") {

Serial.println ("Upgrade de firmware alstublieft");

}

// probeer verbinding te maken met wifi-netwerk:

while (status != WL_CONNECTED) {

Serial.print("Poging om verbinding te maken met netwerk genaamd: ");

Seriële.println(ssid); // print de netwerknaam (SSID);

// Maak verbinding met het WPA/WPA2-netwerk. Wijzig deze regel bij gebruik van een open of WEP-netwerk:

status = WiFi.begin(ssid, pass);

// wacht 10 seconden voor verbinding:

vertraging (10000);

}

server.begin(); // start de webserver op poort 80

printWifiStatus(); // je bent nu verbonden, dus print de status uit

}

{

Serieel.begin(9600);

strip.setHelderheid (HELDERHEID);

strip.begin();

strip.show(); // Initialiseer alle pixels op 'uit'

pinMode (micPin, INPUT);

for (int thisReading = 0; thisReading < numReadings; thisReading++) {

lezingen [thisReading] = 0;

}

}

ongeldige regenboog (uint8_t wacht) {

uint16_t i, j;

voor(j=0; j<256; j++) {

voor(i=0; i

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

}

strip.show();

vertraging (wacht);

}

}

void visualizer(){

totaal = totaal - metingen [readIndex];

metingen [readIndex] = analogRead (micPin);

totaal = totaal + metingen [readIndex];

readIndex = readIndex + 1;

if (readIndex >= numReadings) {

leesIndex = 0;

}

gemiddelde = totaal / aantal Aflezingen;

vertraging(1);

int micpixel = (gemiddeld-100)/5;

Serieel.println(micpixel);

if (micpixel > 0){

{

for(int j=0; j<=micpixel; j++)

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

for(int j=micpixel; j<=NUM_LEDS; j++)

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

strip.show();

}

}

if (micpixel < 0) {

for(int j=0; j<=20; j++)

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

strip.show();

}

}

lege lus() {

{

WiFiClient-client = server.beschikbaar(); // luister naar inkomende klanten

if (client) { // als je een klant krijgt, Serial.println ("nieuwe klant"); // druk een bericht af via de seriële poort

Tekenreeks currentLine = ""; // maak een string om inkomende gegevens van de client vast te houden

while (client.connected()) { // loop while the client's connected

if (client.available()) { // als er bytes zijn om van de client te lezen, char c = cliënt.lezen(); // lees een byte, dan

Serieel.schrijven(c); // print het uit de seriële monitor

if (c == '\n') { // als de byte een teken van een nieuwe regel is

// als de huidige regel leeg is, heb je twee nieuwe regeltekens op een rij.

// dat is het einde van het HTTP-verzoek van de client, dus stuur een antwoord:

if (currentLine.length() == 0) {

// HTTP-headers beginnen altijd met een responscode (bijv. HTTP/1.1 200 OK)

// en een inhoudstype zodat de klant weet wat er gaat komen, dan een lege regel:

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

client.println("Inhoudstype:tekst/html");

klant.println();

// de inhoud van het HTTP-antwoord volgt op de header:

client.print("Klik hier Regenboogeffect inschakelen");

client.print("Klik hier Zet Visualizer aan");

// Het HTTP-antwoord eindigt met nog een lege regel:

klant.println();

// doorbreek de while-lus:

pauze;

} else { // als je een nieuwe regel hebt, wis dan huidige regel:

huidigeLijn = "";

}

} else if (c != '\r') { // als je iets anders hebt dan een regelterugloopteken, huidigeLijn += c; // voeg het toe aan het einde van de huidige regel

}

// Controleer of het clientverzoek "GET /H" of "GET /L" was:

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

Regenboog(10); // Regenboogeffect ingeschakeld

}

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

Visualizer(); // Visualizer is ingeschakeld

}

}

}

// sluit de verbinding:

klant.stop();

Serial.println("client losgekoppeld");

}

}

ongeldig printWifiStatus() {

// druk de SSID af van het netwerk waarmee u bent verbonden:

Serial.print("SSID: ");

Seriële.println(WiFi. SSID());

// print het IP-adres van je wifi-schild:

IP-adres ip = WiFi.localIP();

Serial.print("IP-adres: ");

Serieel.println(ip);

// print de ontvangen signaalsterkte:

lange rssi = WiFi. RSSI();

Serial.print("signaalsterkte (RSSI):");

Seriële.afdruk(rssi);

Serial.println(" dBm");

// print waar te gaan in een browser:

Serial.print( Om deze pagina in actie te zien, opent u een browser naar

Serieel.println(ip);

}

}

uint32_t Wheel(byte WheelPos) {

WheelPos = 255 - WheelPos;

if(WielPos < 85) {

retourstrook. Kleur (255 - WheelPos * 3, 0, WheelPos * 3, 0);

}

if(WielPos < 170) {

WielPos -= 85;

retourstrip. Kleur (0, WheelPos * 3, 255 - WheelPos * 3, 0);

}

WielPos -= 170;

retourstrip. Kleur (WheelPos * 3, 255 - WheelPos * 3, 0, 0);

}

uint8_t rood(uint32_t c) {

retour (c >> 16);

}

uint8_t groen(uint32_t c) {

retour (c >> 8);

}

uint8_t blauw(uint32_t c) {

retour (c);

}

}

//Serial.println(micpixel);

}

Stap 4: 3D-afdrukken van de voet van de lamp

3D-printen van de voet van de lamp
3D-printen van de voet van de lamp

Een 3D-model van de lampvoet werd gemeten, ontworpen en afgedrukt met afmetingen die groot genoeg waren om alle elektrische componenten in het basiscompartiment te passen.

Stap 5: Led-bevestiging

Led-bijlage
Led-bijlage

Led's werden opgerold in kartonnen rol en bevestigd met dubbelzijdige tape, er werd een gat geboord in het onderste gedeelte om de draad door te laten

Stap 6: Lampbehuizing

Lampbehuizing
Lampbehuizing

Er werd een behuizing gemaakt door een transparante fles te vinden met dezelfde breedte als de lampvoet en de hoogte als de LED-bevestiging. Dit werd vervolgens bedekt met dik papier voor een betere verspreiding van het licht. Als alternatief is het mogelijk om als lampbehuizing gematteerd glas of doorschijnende kunststof buizen te gebruiken.

Stap 7: Instellen

Opstelling
Opstelling

Alles werd aan elkaar gelijmd en gemonteerd. En de lamp was klaar voor wat testen!.

Aanbevolen: