Da ich wegen eines Arbeitsunfalls krank zu Hause bin, habe ich endlich mal wieder Zeit zu basteln
Ich habe mich aus Neugier nun mal bisschen mit Arduino beschäftigt. Obwohl ich normal eher selbst Platinen ätze und in Assembler programmiere, ist das schon auch interessant, weil man (v.a. durch die zahlreichen Vorlagen/Beispiele/Libs) oft schnell zu einem Ergebnis kommt. Und aus China ist so ein fertiges Board oft günstiger als der "nackte" µC beim Reichelt o.ä. Da braucht man (insb. bei wenig Elektronik außenrum) gar nicht mit ätzen und löten anzufangen...
Witzig fand ich diese Teile hier: http://www.ebay.de/itm/272277041646 - Ein Tiny85 mit USB-Firmware/Bootloader und Spannungsregler etc. für 1,16 Euro. Mal ein paar bestellt, und da ich i.M. mit Krücken gehen muss, habe ich auch gleich eine Anwendung dafür gefunden: Die Krücken beleuchten, damit mich in der dunklen Jahreszeit auf der Straße keiner übersieht und über den Haufen fährt.
Dazu habe ich den Winzling an 0,5 m WS2812B-Stripe geklöppelt (Din an P02):
Und in der Arduino-IDE ein paar Lauflichtprogramme geschrieben:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// General setup
#define PIN 2
#define PIXELS 30
// Sparkle parameters
#define SPTIME 200
#define SPSPEED 50
#define SPFADE 100
#define SPCOUNT 1
// pinkblue parameters
#define PBTIME 100
#define PBSPEED 100
// Red drop parameters
#define RDTIME 500
#define RDSPEED 20
#define RDFADE 50
// Green fade parameters
#define GFTIME 500
#define GFSPEED 20
#define GFFADE 10
#define GFCOUNT 5
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS, PIN, NEO_GRB + NEO_KHZ800);
// Setup the pixel array
int pRed[PIXELS];
int pGreen[PIXELS];
int pBlue[PIXELS];
int droppos;
void setup() {
strip.begin();
strip.setBrightness(64);
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Pinkblue
for (int i=0; i<PBTIME; i++) {
pinkblue(PBSPEED);
output();
}
// Sparkle
for (int i=0; i<SPTIME; i++) {
sparkle(SPSPEED);
output();
}
// Red drop
for (int i=0; i<RDTIME; i++) {
reddrop(RDSPEED);
output();
}
// Green fade
for (int i=0; i<GFTIME; i++) {
greenfade(GFSPEED);
output();
}
}
void greenfade(uint8_t wait) {
// Fade pixels
fade(GFFADE);
// New LED
for(int i=0; i<GFCOUNT; i++) {
int p = random(0,PIXELS-1);
pRed[p] = 40;
pGreen[p] = 255;
pBlue[p] = 0;
}
delay(wait);
}
void reddrop(uint8_t wait) {
// Fade pixels
fade(RDFADE);
// New drop
droppos++;
if(droppos == PIXELS) {
droppos = 0;
}
pRed[droppos] = 255;
pGreen[droppos] = 0;
pBlue[droppos] = 0;
delay(wait);
}
void sparkle(uint8_t wait) {
// Background colour
for(int p=0; p<PIXELS; p++){
pRed[p] = 0;
pGreen[p] = 0;
pBlue[p] = 30;
}
// New sparkle
for(int i=0; i<SPCOUNT; i++) {
int p = random(0,PIXELS-1);
pRed[p] = 255;
pGreen[p] = 255;
pBlue[p] = 255;
}
delay(wait);
}
void pinkblue(uint8_t wait) {
for(int p=0; p<PIXELS; p++){
pRed[p] = random(0,200);
pGreen[p] = 50; //random(0,255);
pBlue[p] = 50; //random(0,255);
}
delay(wait);
}
void output() {
// Set pixels
for(int p=0; p<PIXELS; p++){
strip.setPixelColor(p, pRed[p],pGreen[p],pBlue[p] );
}
strip.show();
}
void fade(uint8_t fade) {
// Fade pixels
for(int p=0; p<PIXELS; p++){
if(pRed[p] >= fade) {
pRed[p] = pRed[p] - fade;
} else {
pRed[p] = 0;
}
if(pGreen[p] >= fade) {
pGreen[p] = pGreen[p] - fade;
} else {
pGreen[p] = 0;
}
if(pBlue[p] >= fade) {
pBlue[p] = pBlue[p] - fade;
} else {
pBlue[p] = 0;
}
}
}
Alles anzeigen
Und den Stripe mit Isolierband an der Krücke befestigt. Zur Stromversorgung dient eine übliche USB-Powerbank, das ist auch cool an diesem Digispark, keine extra Stecker, Schalter etc., die Beleuchtung wird einfach durch einstecken eingeschaltet:
Und so sieht das dann in Bewegtbild aus:
Falls das jemand nachbasteln will: Der Digispark ist nicht in der IDE enthalten, muss man erst mit dem Boardmanager hinzufügen. Und für das Teil einen Treiber installieren (Achtung: Anleitung genau lesen, ich hatte zuerst den falschen, und recht rumgeflucht, warum der Sch**** nicht geht ) - Anleitung und SW hier: https://digistump.com/wiki/digispark/tutorials/connecting