Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
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
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
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 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
Wszystko zostało sklejone i zmontowane. A lampa była gotowa do testów!.