NeoPixel-Button mit Farbsensor und Gemma

Ob Kongresse, Messen oder Abschlussball: alles ist besser mit ein bisschen Bling-Bling. Und was wäre stilechter für den fashion-bewussten Maker als ein blinkender NeoPixel-Button? Dafür sind glücklicherweise keine ermüdenden Shopping-Touren durch überfüllte Innenstädte nötig. Mit einem NeoPixel-Jewel und Adafruit’s Gemma bastelst du dir in 10 Minuten einen stylischen Hingucker. Und der gleicht sich obendrein noch genau deinem Outfit an: dank eines Farbsensors übernimmt der NeoPixel-Button immer die Farben deiner Kleidung. Modesünden (oder zumindest sich beißende Farben) gehören damit der Vergangenheit an.

NeoPixel-Button mit Gemma: Schritt für Schritt

Was du dafür brauchst

WARENKORB

Alle für dieses Projekt notwendigen Artikel (außer Lötkolben) landen mit einem Klick auf den Button direkt in deinem Warenkorb, sofern sie in unserem Shop verfügbar sind. Kontrolliere daher deinen Warenkorb genau!

Und so geht’s

Zuerst wird die Arduino-IDE vorbereitet. Für den Pixel-Button verwenden wir die NeoPixel Library. Dafür einfach unter Tools→Manage Libraries… im Suchfeld „Adafruit Neopixel“ eingeben und dann „install“ klicken.

Weil der Sensor eigentlich für Gemma’s größere Schwester Flora gedacht ist, funktioniert Adafruit’s TCS34725 Library nicht ohne Weiteres. Deswegen haben wir eine Version der Bibliothek vorbereitet, die mit Gemma kompatibel ist. Um die Bibliothek zu verwenden, musst du folgende Dateien aus unserem GitHub-Repo herunterladen und im selben Ordner wie die Arduino-Sketch speichern:

Der Code ist relativ einfach: beim Einschalten misst der Sensor die Farbe, die gemessenen Werte sind dann die Farbe des NeoPixel-Buttons. Dafür brauchen wir nur einen kleinen LED-Kunstgriff. Weil das menschliche Auge Farben nicht linear wahrnimmt – die LEDs diese aber linear anzeigen – brauchen wir eine sogenannte Gamma-Korrektur. Dazu wird eine inverse Funktion angewendet, um unsere Wahrnehmung auszugleichen:

Ohne diese Kompensation würden manche Farben falsch aussehen.

Und weil Gemma auch weniger Speicher zur Verfügung hat als Flora, ersparen wir ihr die Floating-Point-Berechnungen, die nötig wären, um die Gamma-Korrektur zu ermitteln. Stattdessen befinden sich die gamma-korrigierten Werte in einer Lookup-Tabelle. Obwohl das erstmal nach mehr aussieht, benötigt diese Tabelle tatsächlich weniger Speicher als eine Schleife zur Berechnung. Und ist obendrein auch noch schneller.

Der ganze Code sieht dann so aus:

#include "Adafruit_TCS34725.h" // die angepasste Sensor-Bibliothek
#include <Adafruit_NeoPixel.h>

// Gamma-Werte als Tabelle und nicht als Schleife, um Speicher und Zeit zu sparen
// die Tabelle mappt eingelesene, lineare Werte auf nichtlineare gamma-korrgierte Werte
// Idee von Phillip Burgess
const uint8_t PROGMEM gamma8[] = {
	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, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
	3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
	8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13,
	14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 
	21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30,
	31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42,
	42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55,
	56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,
	73, 74, 75, 77, 78, 79, 80, 82, 83, 84, 85, 87, 88, 89, 91,
	92, 93, 95, 96, 98, 99, 100, 102, 103, 105, 106, 108, 109, 
	111, 112, 114, 115, 117, 119, 120, 122, 123, 125, 127, 128,
	130, 132, 133, 135, 137, 138, 140, 142, 144, 145, 147, 149,
	151, 153, 155, 156, 158, 160, 162, 164, 166, 168, 170, 172,
	174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 197,
	199, 201, 203, 205, 207, 210, 212, 214, 216, 219, 221, 223,
	226, 228, 230, 233, 235, 237, 240, 242, 245, 247, 250, 252, 255};

Adafruit_NeoPixel strip = Adafruit_NeoPixel(7, 1, NEO_GRBW + NEO_KHZ800);
Adafruit_TCS34725 tcs		= Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
     
void setup() {
	strip.begin();
	strip.setBrightness(30);
	strip.show(); 
      
	tcs.begin();
	
	for (int i = 0; i < 3; i++){ 
		colorWipe(strip.Color(188, 188, 188, 188), 1000);
		colorWipe(strip.Color(0, 0, 0, 0), 500);
  }
      
	uint16_t clear, red, green, blue;
     
	tcs.setInterrupt(false);      // Sensor-LED an
     
	delay(60);  // ca. 50ms zum Einlesen
      
	tcs.getRawData(&red, &green, &blue, &clear); // Werte fuer Rot-, Gruen-, Blau-, Weißanteil speichern
     
	tcs.setInterrupt(true);  // Sensor-LED aus
     
	// Hex-Code fuer Visualisierung berechnen
	uint32_t sum = red;
	sum += green;
	sum += blue;
      
	float r, g, b;
	r = red; r /= sum;
	g = green; g /= sum;
	b = blue; b /= sum;
	r *= 256; g *= 256; b *= 256;

	// Pixel-Button in der eingelesen, gamma-korrigierten Farbe faerben
	colorWipe(strip.Color(pgm_read_byte(&gamma8[(int)r]),
												pgm_read_byte(&gamma8[(int)g]),
												pgm_read_byte(&gamma8[(int)b])), 0);                                                                    
}

// Pixel faerben
void colorWipe(uint32_t c, uint8_t wait) {
	for(uint16_t i = 0; i < strip.numPixels(); i++) {
		strip.setPixelColor(i, c);
		strip.show();
		delay(wait);
	}
}
     
void loop() {
	
	//loop ist leer, weil Farbe nur einmal bei Einschalten bestimmt wird. Um die Farbe zu aendern,
	// Gemma aus- und einschalten
        
}

Um den Code auf das Gemma-Board zu laden, musst du dann den Reset-Button kurz drücken. Solange die kleine LED blinkt, kannst du den Upload-Button in der Arduino-IDE klicken.

Schaltung

Für die Verbindung zwischen NeoPixel-Button, Sensor und Gemma brauchst du insgesamt sieben Kabel. Der Sensor kommt auf Gemma’s Rückseite, der Pixel-Button auf die Vorderseite. Um eine gute Länge für die Kabel zu finden, probierst du am besten vorher ein bisschen herum. Dann kannst du die Kabel kürzen und jeweils an den Enden ein Stück der Isolierung entfernen.

Als nächstes wird die Schaltung nach folgendem Schema verlötet:

GemmaNeoPixel Jewel
GNDGND
D1In
VoutPWR
GemmaFarbsensor
GNDGND
A1/D2SCL
D0SDA
3V3V

Fertig!

Und schon ist dein neues Accessoire fertig! Falls du nicht der Typ für Buttons bist: die Kombi ist klein genug, um beispielsweise in einen großen Anhänger an einer Kette zu passen. Besonders schön sieht das NeoPixel-Juwel auch aus, wenn es unter weißem Stoff (z.B. einem Schal oder einer Krawatte) getragen wird. Dadurch wird das Licht optimal zerstreut. Für die Stromversorgung eignet sich ein kleiner Lipo-Akku oder eine Knopfbatterie, je nach dem wo und wie der Button getragen werden soll.

Und wie immer: bei Fragen, Anregungen oder Verbesserungen schreib’ einfach einen Kommentar!

Falls du Lust auf weitere Projekte hast, findest du hier Inspiration.

Die mobile Version verlassen