Inhaltsverzeichnis:
- Schritt 1: Benötigtes Material
- Schritt 2: Schaltplan
- Schritt 3: Arduino-Code
- Schritt 4: 3D-Druck der Basis der Lampe
- Schritt 5: LED-Befestigung
- Schritt 6: Lampengehäuse
- Schritt 7: Einrichtung
Video: Smart Lamp (TCfD) - Rainbow + Music Visualizer - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Dieses Projekt wird für den Studiengang Technologie für Konzeptdesign an der TUDelft durchgeführt
Das Endprodukt ist eine ESP-32-Sockel-LED-Lampe und wird mit dem Server verbunden. Für den Prototyp hat die Lampe zwei Funktionen; ein Regenbogeneffekt, der ein beruhigendes, farbwechselndes Leuchten in Richtung seiner Umgebung aussendet, und zweitens eine Klangvisualisierung, bei der die LED-Pixel je nach Geräuschpegel „tanzen“. Das System ist mit WLAN verbunden und der Benutzer kann über WLAN auswählen, welchen Effekt er von der Lampe haben möchte.
Der günstige ESP-32-Mikrochip bietet uns leistungsstarke Prozessoren, einen eingebauten Hall-Sensor, einen Temperatursensor, einen Berührungssensor sowie WLAN- und Bluetooth-Fähigkeiten. Während für dieses Projekt nur zwei Effekte ausgewählt wurden, sind die Auswirkungen dieser „intelligenten“Lampe grenzenlos. Sie wird verwendet, um dem Benutzer das Wetter oder die Temperatur des Raums anzuzeigen, die Lampe selbst kann als Alarmauslöser fungieren oder ein beruhigendes Sonnenlicht neben Ihrem Bett abgeben, das den Sonnenaufgang für ein schönes Aufwacherlebnis simuliert.
Schritt 1: Benötigtes Material
Arduino esp32
Schallsensor
Vier-Wege-bidirektionaler Logikpegelwandler
Neopixel-LED 2m 60 LED/m
Überbrückungsdrähte
Micro-USB-Kabel mit Adapter
Internetverbindung
Schritt 2: Schaltplan
Ein Schaltplan wurde gezeichnet und die Schaltung wurde entsprechend wie in angegeben hergestellt
das Diagramm unten.
Schritt 3: Arduino-Code
Hier wurde zunächst Visualizer-Code erstellt. Dann zwei Beispielcodes
;“Neoplxel RGBW Starndtest”; und „simpleWebServerWifi“wurde modifiziert und in den Visualizer-Code integriert. Obwohl der Code manchmal immer noch fehlerhaft ist (zufällige LEDs leuchten von Zeit zu Zeit auf). Die nächste Iteration des Codes (sobald wir genug Zeit haben) wird aktualisiert.
#enthalten
#ifdef _AVR_
#enthalten
#endif
const int numReadings = 5;
int Messwerte[numReadings];
int readIndex = 0;
int gesamt = 0;
int-Durchschnitt = 0;
int micPin = 33;
#definiere PIN 4
#define NUM_LEDS 120
#define HELLIGKEIT 100
Adafruit_NeoPixel-Streifen = 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 };
#enthalten
#enthalten
char ssid = "IhrNetzwerk"; // Ihre Netzwerk-SSID (Name)
char pass = "geheimesPasswort"; // Ihr Netzwerk-Passwort
int keyIndex = 0; // Ihr Netzwerkschlüssel Indexnummer (wird nur für WEP benötigt)
int-Status = WL_IDLE_STATUS;
WiFiServer-Server (80);
Void-Setup ()
{
Serial.begin (9600); // serielle Kommunikation initialisieren
pinMode(9, AUSGANG); // Setze den LED-Pin-Modus
// Überprüfen Sie, ob das Schild vorhanden ist:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println ("WiFi-Schild nicht vorhanden");
während (wahr); // nicht weiter
}
String fv = WiFi.firmwareVersion();
if (fv != "1.1.0") {
Serial.println ("Bitte aktualisieren Sie die Firmware");
}
// Versuch, eine Verbindung zum Wifi-Netzwerk herzustellen:
while (status != WL_CONNECTED) {
Serial.print ("Versuch, eine Verbindung zum Netzwerk mit dem Namen herzustellen: ");
Serial.println (ssid); // drucke den Netzwerknamen (SSID);
// Verbindung zum WPA/WPA2-Netzwerk herstellen. Ändern Sie diese Zeile, wenn Sie ein offenes oder WEP-Netzwerk verwenden:
status = WiFi.begin(ssid, pass);
// 10 Sekunden auf Verbindung warten:
Verzögerung (10000);
}
server.begin(); // starte den Webserver auf Port 80
printWifiStatus(); // Sie sind jetzt verbunden, also drucken Sie den Status aus
}
{
Serial.begin (9600);
strip.setHelligkeit (HELLIGKEIT);
strip.begin();
Strip-Show(); // Alle Pixel auf 'off' initialisieren
pinMode (micPin, INPUT);
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
Messwerte[thisReading] = 0;
}
}
void rainbow(uint8_t warte) {
uint16_t i, j;
for(j=0; j<256; j++) {
für(i=0; i
strip.setPixelColor(i, Rad((i+j) & 255));
}
Strip-Show();
verzögern (warten);
}
}
Void Visualisierer () {
total = total - Messwerte[readIndex];
Messwerte[readIndex] = analogRead(micPin);
Gesamt = Gesamt + Messwerte[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings) {
readIndex = 0;
}
Durchschnitt = gesamt / numReadings;
Verzögerung(1);
int-Micpixel = (Durchschnitt-100)/5;
Serial.println (Micpixel);
wenn (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();
}
}
Leere Schleife () {
{
WiFiClient-Client = server.available(); // auf eingehende Kunden hören
if (client) { // wenn du einen Client bekommst, Serial.println("neuer Kunde"); // eine Nachricht über den seriellen Port ausgeben
String currentLine = ""; // einen String erstellen, um eingehende Daten vom Client aufzunehmen
while (client.connected()) { // Schleife während der Client verbunden ist
if (client.available()) { // wenn Bytes vom Client zu lesen sind, char c = client.read(); // ein Byte lesen, dann
Serial.write (c); // den seriellen Monitor ausdrucken
if (c == '\n') { // wenn das Byte ein Zeilenumbruchzeichen ist
// Wenn die aktuelle Zeile leer ist, haben Sie zwei Zeilenumbrüche hintereinander.
// Das ist das Ende der HTTP-Anfrage des Clients, also senden Sie eine Antwort:
if (currentLine.length() == 0) {
// HTTP-Header beginnen immer mit einem Antwortcode (z. B. HTTP/1.1 200 OK)
// und einen Inhaltstyp, damit der Client weiß, was kommt, dann eine Leerzeile:
client.println("HTTP/1.1 200 OK");
client.println("Inhaltstyp:text/html");
client.println();
// Der Inhalt der HTTP-Antwort folgt dem Header:
client.print("Klicken Sie hier, um den Regenbogeneffekt zu aktivieren");
client.print("Hier klicken Visualizer einschalten");
// Die HTTP-Antwort endet mit einer weiteren Leerzeile:
client.println();
// aus der while-Schleife ausbrechen:
brechen;
} else { // Wenn Sie einen Zeilenumbruch haben, löschen Sie currentLine:
aktuelleLine = "";
}
} else if (c != '\r') { // wenn du etwas anderes als ein Wagenrücklaufzeichen hast, aktuelle Zeile += c; // füge es am Ende der aktuellen Zeile hinzu
}
// Überprüfen Sie, ob die Client-Anfrage "GET /H" oder "GET /L" war:
if (currentLine.endsWith("GET /R")) {
Regenbogen(10); // Regenbogeneffekt eingeschaltet
}
if (currentLine.endsWith("GET /V")) {
Visualisierer(); // Visualizer ist eingeschaltet
}
}
}
// Verbindung schließen:
client.stop();
Serial.println ("Client getrennt");
}
}
void printWifiStatus() {
// drucke die SSID des Netzwerks, mit dem du verbunden bist:
Serial.print("SSID:");
Serial.println (WiFi. SSID());
// drucke die IP-Adresse deines WiFi-Shields:
IPAdresse ip = WiFi.localIP();
Serial.print ("IP-Adresse: ");
Serial.println (ip);
// die empfangene Signalstärke ausgeben:
lange rssi = WiFi. RSSI();
Serial.print ("Signalstärke (RSSI):");
Serial.print (rssi);
Serial.println("dBm");
// Drucken Sie, wohin Sie in einem Browser gehen sollen:
Serial.print ( Um diese Seite in Aktion zu sehen, öffnen Sie einen Browser zu
Serial.println (ip);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(RadPos < 85) {
Return strip. Color(255 - WheelPos * 3, 0, WheelPos * 3, 0);
}
if(RadPos <170) {
RadPos -= 85;
Return strip. Color(0, WheelPos * 3, 255 - WheelPos * 3, 0);
}
RadPos -= 170;
Return strip. Color (WheelPos * 3, 255 - WheelPos * 3, 0, 0);
}
uint8_t red(uint32_tc) {
zurück (c >> 16);
}
uint8_t grün(uint32_t c) {
zurück (c >> 8);
}
uint8_t blau(uint32_t c) {
zurück (c);
}
}
//Seriell.println (Micpixel);
}
Schritt 4: 3D-Druck der Basis der Lampe
Ein 3D-Modell des Lampensockels wurde gemessen, entworfen und mit Abmessungen gedruckt, die groß genug waren, um alle elektrischen Komponenten in das Sockelfach zu passen.
Schritt 5: LED-Befestigung
LEDs wurden in Kartonrolle gewickelt und mit doppelseitigem Klebeband befestigt, im unteren Teil wurde ein Loch gebohrt, um den Draht hindurchzuführen
Schritt 6: Lampengehäuse
Ein Gehäuse wurde hergestellt, indem eine transparente Flasche mit einer ähnlichen Breite wie der Lampensockel und einer Höhe wie der LED-Aufsatz gefunden wurde. Dieser wurde dann zur besseren Lichtstreuung mit dickem Papier abgedeckt. Alternativ können auch Milchglas- oder transluzente Kunststoffrohre als Lampengehäuse verwendet werden.
Schritt 7: Einrichtung
Alles wurde zusammengeklebt und zusammengebaut. Und die Lampe war bereit für einige Tests!.