Kleine Bastelei: Krückenbeleuchtung

    Kleine Bastelei: Krückenbeleuchtung

    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: 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:

    Quellcode

    1. #include <Adafruit_NeoPixel.h>
    2. #ifdef __AVR__
    3. #include <avr/power.h>
    4. #endif
    5. // General setup
    6. #define PIN 2
    7. #define PIXELS 30
    8. // Sparkle parameters
    9. #define SPTIME 200
    10. #define SPSPEED 50
    11. #define SPFADE 100
    12. #define SPCOUNT 1
    13. // pinkblue parameters
    14. #define PBTIME 100
    15. #define PBSPEED 100
    16. // Red drop parameters
    17. #define RDTIME 500
    18. #define RDSPEED 20
    19. #define RDFADE 50
    20. // Green fade parameters
    21. #define GFTIME 500
    22. #define GFSPEED 20
    23. #define GFFADE 10
    24. #define GFCOUNT 5
    25. Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS, PIN, NEO_GRB + NEO_KHZ800);
    26. // Setup the pixel array
    27. int pRed[PIXELS];
    28. int pGreen[PIXELS];
    29. int pBlue[PIXELS];
    30. int droppos;
    31. void setup() {
    32. strip.begin();
    33. strip.setBrightness(64);
    34. strip.show(); // Initialize all pixels to 'off'
    35. }
    36. void loop() {
    37. // Pinkblue
    38. for (int i=0; i<PBTIME; i++) {
    39. pinkblue(PBSPEED);
    40. output();
    41. }
    42. // Sparkle
    43. for (int i=0; i<SPTIME; i++) {
    44. sparkle(SPSPEED);
    45. output();
    46. }
    47. // Red drop
    48. for (int i=0; i<RDTIME; i++) {
    49. reddrop(RDSPEED);
    50. output();
    51. }
    52. // Green fade
    53. for (int i=0; i<GFTIME; i++) {
    54. greenfade(GFSPEED);
    55. output();
    56. }
    57. }
    58. void greenfade(uint8_t wait) {
    59. // Fade pixels
    60. fade(GFFADE);
    61. // New LED
    62. for(int i=0; i<GFCOUNT; i++) {
    63. int p = random(0,PIXELS-1);
    64. pRed[p] = 40;
    65. pGreen[p] = 255;
    66. pBlue[p] = 0;
    67. }
    68. delay(wait);
    69. }
    70. void reddrop(uint8_t wait) {
    71. // Fade pixels
    72. fade(RDFADE);
    73. // New drop
    74. droppos++;
    75. if(droppos == PIXELS) {
    76. droppos = 0;
    77. }
    78. pRed[droppos] = 255;
    79. pGreen[droppos] = 0;
    80. pBlue[droppos] = 0;
    81. delay(wait);
    82. }
    83. void sparkle(uint8_t wait) {
    84. // Background colour
    85. for(int p=0; p<PIXELS; p++){
    86. pRed[p] = 0;
    87. pGreen[p] = 0;
    88. pBlue[p] = 30;
    89. }
    90. // New sparkle
    91. for(int i=0; i<SPCOUNT; i++) {
    92. int p = random(0,PIXELS-1);
    93. pRed[p] = 255;
    94. pGreen[p] = 255;
    95. pBlue[p] = 255;
    96. }
    97. delay(wait);
    98. }
    99. void pinkblue(uint8_t wait) {
    100. for(int p=0; p<PIXELS; p++){
    101. pRed[p] = random(0,200);
    102. pGreen[p] = 50; //random(0,255);
    103. pBlue[p] = 50; //random(0,255);
    104. }
    105. delay(wait);
    106. }
    107. void output() {
    108. // Set pixels
    109. for(int p=0; p<PIXELS; p++){
    110. strip.setPixelColor(p, pRed[p],pGreen[p],pBlue[p] );
    111. }
    112. strip.show();
    113. }
    114. void fade(uint8_t fade) {
    115. // Fade pixels
    116. for(int p=0; p<PIXELS; p++){
    117. if(pRed[p] >= fade) {
    118. pRed[p] = pRed[p] - fade;
    119. } else {
    120. pRed[p] = 0;
    121. }
    122. if(pGreen[p] >= fade) {
    123. pGreen[p] = pGreen[p] - fade;
    124. } else {
    125. pGreen[p] = 0;
    126. }
    127. if(pBlue[p] >= fade) {
    128. pBlue[p] = pBlue[p] - fade;
    129. } else {
    130. pBlue[p] = 0;
    131. }
    132. }
    133. }


    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 :D ) - Anleitung und SW hier: digistump.com/wiki/digispark/tutorials/connecting
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    Danke! :)
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    Coole Sache,

    kannste zu Himmelfahrt nochmal reaktivieren und von den Krücken an einen Gehstock umziehen lassen :D
    Gut zu wissen, das die WS2812 auch mit nem Tiny85 und internem Takt laufen. Da die Neopixel ja etwas bockig sein sollen, was das Timing betrifft und nicht alle Arduino Libs reibungslos auf nem Tiny laufen.
    Für die Jüngeren: Led Zeppelin ist KEIN beleuchtetes Luftschiff! :D
    Neopixel hatte ich noch nicht, die haben nen Apa drauf, oder? - WS 2811/2812 und TM1804 sind recht gutmütig. Ich benutze (also bei meinen Projekten in asm) nur eine Ausgaberoutine für alle, trotz lt. Datenblatt unterschiedlichem Timing funktioniert das einwandfrei. Es muss nur der "0"-Puls kurz genug, und der "1"-Puls lang genug sein...
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    Gerne! :)
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!