Spisu treści:

Inteligentna lampa (TCfD) - Rainbow + Wizualizator muzyki: 7 kroków (ze zdjęciami)
Inteligentna lampa (TCfD) - Rainbow + Wizualizator muzyki: 7 kroków (ze zdjęciami)

Wideo: Inteligentna lampa (TCfD) - Rainbow + Wizualizator muzyki: 7 kroków (ze zdjęciami)

Wideo: Inteligentna lampa (TCfD) - Rainbow + Wizualizator muzyki: 7 kroków (ze zdjęciami)
Wideo: Светильник колонка c беспроводной зарядкой 2024, Lipiec
Anonim
Image
Image
Schemat obwodu
Schemat obwodu

Ten projekt jest wykonywany na kursie Technologia projektowania koncepcyjnego w TUDelft

Produktem końcowym jest podstawowa lampa LED ESP-32 i jest podłączona do serwera. W przypadku prototypu lampa pełni dwie funkcje; efekt tęczy, który emituje kojący, zmieniający kolor blask w kierunku otoczenia, a po drugie wizualizator dźwięku, w którym piksele LED „tańczą” zgodnie z poziomem dźwięku. System jest podłączony do Wi-Fi, a użytkownik może wybrać, jaki efekt chce uzyskać od lampy za pośrednictwem WIFI.

Tani mikrochip ESP-32 zapewnia nam potężne procesory, wbudowany czujnik Halla, czujnik temperatury, czujnik dotykowy, a także możliwość Wi-Fi i bluetooth. Dzięki temu, podczas gdy do tego projektu wybrano tylko dwa efekty, wpływ tej „inteligentnej” lampy jest nieograniczony. Służyłby do wskazywania użytkownikowi pogody lub temperatury w pomieszczeniu, sama lampa może działać jako wyzwalacz alarmu lub może dawać uspokajającą poświatę słońca obok łóżka, symulując wschód słońca, zapewniając przyjemne przebudzenie.

Krok 1: Potrzebny materiał

Arduino esp32

Czujnik dźwięku

Czterokierunkowy dwukierunkowy konwerter poziomów logicznych

Neopikselowa dioda LED 2m 60 diod/m

Przewody połączeniowe

Kabel micro USB z adapterem

połączenie internetowe

Krok 2: Schemat obwodu

Schemat obwodu został narysowany i obwód został wykonany zgodnie z podanymi w

schemat poniżej.

Krok 3: Kod Arduino

Tutaj najpierw powstał kod wizualizera. Następnie dwa przykładowe kody

;„test początkowy neoplxel RGBW”; oraz „simpleWebServerWifi” został zmodyfikowany i zintegrowany z kodem wizualizera. Chociaż kod wciąż jest czasami wadliwy (od czasu do czasu zapala się losowa dioda). Kolejna iteracja kodu (gdy zdążymy) zostanie zaktualizowana.

#włączać

#ifdef _AVR_

#włączać

#endif

const int numReadings = 5;

odczyty int[numReadings];

int odczyt indeksu = 0;

całkowita = 0;

średnia int = 0;

int micPin = 33;

#zdefiniuj PIN 4

#define NUM_LEDS 120

#define JASNOŚĆ 100

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

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

#włączać

#włączać

char ssid = "twojaSieć"; // SSID sieci (nazwa)

char pass = "tajne hasło"; // twoje hasło sieciowe

int keyIndex = 0; // Twój klucz sieciowy Numer indeksu (potrzebny tylko dla WEP)

stan int = WL_IDLE_STATUS;

Serwer WiFiServer(80);

pusta konfiguracja()

{

Serial.początek(9600); // zainicjuj komunikację szeregową

pinMode(9, WYJŚCIE); // ustaw tryb pinów LED

// sprawdź obecność tarczy:

jeśli (WiFi.status() == WL_NO_SHIELD) {

Serial.println("Brak osłony WiFi");

podczas (prawda); // nie kontynuuj

}

Ciąg fv = WiFi. Wersja oprogramowania układowego();

if (fv != "1.1.0") {

Serial.println("Proszę zaktualizować oprogramowanie");

}

// próba połączenia z siecią Wifi:

while (stan != WL_CONNECTED) {

Serial.print("Próba połączenia z siecią o nazwie: ");

Serial.println(ssid); // drukuj nazwę sieci (SSID);

// Połącz z siecią WPA/WPA2. Zmień tę linię, jeśli używasz sieci otwartej lub WEP:

status = WiFi.begin(ssid, pass);

// poczekaj 10 sekund na połączenie:

opóźnienie (10000);

}

serwer.początek(); // uruchom serwer WWW na porcie 80

printWifiStatus(); // masz teraz połączenie, więc wydrukuj status

}

{

Serial.początek(9600);

strip.setJasność(JASNOŚĆ);

strip.początek();

strip.pokaż(); // Zainicjuj wszystkie piksele na „wyłączone”

pinMode (micPin, INPUT);

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

odczyty[tenOdczyt] = 0;

}

}

void rainbow(uint8_t czekaj) {

uint16_ti, j;

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

dla(i=0; i

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

}

strip.pokaż();

opóźnienie (czekaj);

}

}

wizualizator pustki(){

total = total - odczyty[readIndex];

odczyty[odczytIndeks] = analogRead(micPin);

suma = suma + odczyty[odczytIndeks];

czytajIndeks = czytajIndeks + 1;

if (readIndex >= numReadings) {

odczyt indeksu = 0;

}

średnia = suma / liczbaOdczytów;

opóźnienie(1);

int mikpiksel = (średnia-100)/5;

Serial.println(mikpiksel);

jeśli (mikropiksel > 0){

{

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

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

for(int j=mikpiksel; j<=LICZBA_LED; j++)

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

strip.pokaż();

}

}

jeśli (mikropiksel < 0) {

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

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

strip.pokaż();

}

}

pusta pętla () {

{

Klient WiFiClient = serwer.dostępny(); // nasłuchuj przychodzących klientów

if (client) { // jeśli masz klienta, Serial.println("nowy klient"); // wypisz wiadomość na porcie szeregowym

Ciąg currentLine = ""; // utwórz ciąg do przechowywania danych przychodzących od klienta

while (client.connected()) { // pętla, gdy klient jest podłączony

if (client.available()) { // jeśli są bajty do odczytania z klienta, char c = klient.odczyt(); // odczytaj bajt, to

Serial.zapis(c); // wydrukuj to na monitorze szeregowym

if (c == '\n') { // jeśli bajt jest znakiem nowej linii

// jeśli bieżąca linia jest pusta, otrzymujesz dwa znaki nowej linii z rzędu.

// to koniec żądania HTTP klienta, więc wyślij odpowiedź:

if (bieżącaLinia.length() == 0) {

// Nagłówki HTTP zawsze zaczynają się od kodu odpowiedzi (np. HTTP/1.1 200 OK)

// i typ zawartości, aby klient wiedział, co nadchodzi, a następnie pusta linia:

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

client.println("Typ-treści:tekst/html");

klient.println();

// treść odpowiedzi HTTP następuje po nagłówku:

client.print("Kliknij tutaj Włącz efekt tęczy");

client.print("Kliknij tutaj Włącz wizualizator");

// Odpowiedź HTTP kończy się kolejną pustą linią:

klient.println();

// wyrwij się z pętli while:

przerwa;

} else { // jeśli masz znak nowej linii, wyczyść bieżący wiersz:

bieżącaLinia = "";

}

} else if (c != '\r') { // jeśli masz cokolwiek innego niż znak powrotu karetki, bieżącaLinia += c; // dodaj go na koniec bieżącej linii

}

// Sprawdź, czy żądanie klienta to „GET /H” czy „GET /L”:

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

Tęcza(10); // Efekt tęczy włączony

}

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

Wizualizator(); // Wizualizator jest włączony

}

}

}

// zamknij połączenie:

klient.stop();

Serial.println("klient odłączony");

}

}

void printWifiStatus() {

// wydrukuj identyfikator SSID sieci, do której jesteś podłączony:

Serial.print("SSID: ");

Serial.println(WiFi. SSID());

// wydrukuj adres IP tarczy WiFi:

AdresIP ip = WiFi.localIP();

Serial.print("Adres IP: ");

Serial.println(ip);

// drukuj siłę odbieranego sygnału:

długi rssi = WiFi. RSSI();

Serial.print("siła sygnału (RSSI):");

Serial.print(rssi);

Serial.println("dBm");

// drukuj gdzie iść w przeglądarce:

Serial.print( Aby zobaczyć tę stronę w akcji, otwórz przeglądarkę na

Serial.println(ip);

}

}

uint32_t Wheel(byte WheelPos) {

Pozycja koła = 255 - Pozycja koła;

if(Pozycja Koła < 85) {

return strip. Color(255 - WheelPos * 3, 0, WheelPos * 3, 0);

}

if(Pozycja Koła < 170) {

Pozycja koła -= 85;

return strip. Color(0, Poz.koła * 3, 255 - Poz.koła * 3, 0);

}

Pozycja koła -= 170;

return strip. Color(WheelPos * 3, 255 - WheelPos * 3, 0, 0);

}

uint8_t czerwony(uint32_t c) {

powrót (c >> 16);

}

uint8_t zielony(uint32_t c) {

powrót (c >> 8);

}

uint8_t niebieski(uint32_t c) {

powrót (c);

}

}

//Serial.println(mikpiksel);

}

Krok 4: drukowanie 3d podstawy lampy

Drukowanie 3d podstawy lampy
Drukowanie 3d podstawy lampy

Zmierzono, zaprojektowano i wydrukowano trójwymiarowy model podstawy lampy o wymiarach wystarczająco dużych, aby zmieścić wszystkie elementy elektryczne w komorze podstawy.

Krok 5: Załącznik Led

Led załącznik
Led załącznik

Ledy zostały nawinięte w tekturową rolkę i przymocowane taśmą dwustronną, w dolnej części wywiercony został otwór na przewód

Krok 6: Obudowa lampy

Obudowa lampy
Obudowa lampy

Obudowa została wykonana poprzez znalezienie przezroczystej butelki o podobnej szerokości co podstawa lampy i wysokości co nasadka LED. Następnie pokryto go grubym papierem dla lepszego rozproszenia światła. Alternatywnie jako obudowa lampy można użyć matowego szkła lub półprzezroczystych plastikowych rurek.

Krok 7: Konfiguracja

Ustawiać
Ustawiać

Wszystko zostało sklejone i zmontowane. A lampa była gotowa do testów!.

Zalecana: