DISCO light bar Arduinóval

 

2020-11-27

A képre kattintva láthattok egy kis videót készülékről:

Ha megnézitek a forráskód dátumát, láthajátok, hogy valamikor a nyár elején készítettem. Azért nem tettem eddig közzé, mert még mindig nem jutottam dűlőre az Arduino elé kapcsolt analóg áramkörrel. Csak hát ha rám vártok, ki tudja mennyi időre lesz még szükségetek, mire fabrikálok egy megelégedésemre szolgáló egyenirányító/spekrtrum analizáló kapcsolást, mert a terveimben fényorgona üzemmód is van. Aki mégis meg szeretné addig építeni, az a korábbi kapcsolásom HF egyenirányítóját használhatja:

http://tkiraaly.hu/avr/a8_vu5/a8_vu5.html

Szóval inkább most leközlöm a publikusnak szánt verziót. Ennek alapján egyébként mindenfélét le tudtok programozni. A publikus verzióban csak két modult találtok, a KIT-et és VU-t, valamint nincs benne szin/sebesség állítás. Eredetileg négy LED csíkot akartam párhuzamosan kötni, de azután látványra jobban tetszett a három. A LED csíkok 1m hosszúak, 60 chip van rajtuk. Ezek a LED-ek 3 szinűek és programozhatóak, már korábban is foglalkoztam ilyenekkel:

http://tkiraaly.hu/arduino/rgbled/rgbled.html

Szintén a látvány szempontjából utánoztam le a ma már múzeális/klasszikus LED-es kivezérlésmérőket. Anno félórákat bámultuk hipnotizálva a bizományik kirakatában a magnó deck-keket, amiken 12 LED-es kivezérlésmérő villogot. Ezért osztottam logikailag 60/12= 5 LED-es szegmensekre a kijelzőt. Ha valaki hozzá akar fogni a megépítéshez, jó ha ismeri az Arduino-kat, tud C-ben programozni, és vesz néhány megfelelő LED csíkot. Csak csendesen merek súgni, hogy a Csang bácsiéknál olcsóbb, igaz 1-2 hónapot várni kell az alkatrészekre. Talán annyi tertozik még ide, hogy a méréseim szerint egy 3A-es 5V-os dugasztápról járatható az egész áramkör. Én a biztonság kedvéért a LED csíkok táp bevezetésére tettem egy 1000uF-os szűrőkondit.



/******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2020.06.11.
*   Chip         -  Arduino nano, keyboard matrix, WS2812 LED pixel strip
*   Compiler     -  Arduino IDE 1.8.12
*
*   DISCO LIGHT BAR - Public version
*    
*            NANO              WS2812 LED pixel strip 
*        +----------+        +------------------------------+
*        !      +5V +--------+ +5V                          !
*        !       D3 +--------+ DIN                          !
*  MIC --+ A3   GND +--------+ GND                          !
*        !          !        +------------------------------+
*                   !
*                   !        +---------+
*                D5 +--------! S S S S !
*                D6 +--------! S S S S !
*                D7 +--------! S S S S !
*                D8 +--------! S S S S !
*                   !        +---------+
*                   !          ! ! ! !
*                D9 +----------+ ! ! !
*               D10 +------------+ ! !
*               D11 +--------------+ !
*               D12 +----------------+
*                   !
*    
******************************************************************************/

#include "Arduino.h"
#include <FastLED.h>


#define KBD0       12   
#define KBD1       11   
#define KBD2       10   
#define KBD3        9   
#define KBD4        8   
#define KBD5        7  
#define KBD6        6  
#define KBD7        5  

#define NUM_LEDS   60
#define DATA_PIN    3
#define VU_PIN     A3


CRGB leds[ NUM_LEDS];
byte mode= 3;
byte k= '-';


byte kbd( void);
CRGB szin( byte, byte, byte);
void szegmens( byte, CRGB);
void color_bar( CRGB = CRGB::Black);
void vu( byte);
void kitt( byte);


void setup()
{
   pinMode( KBD0, INPUT_PULLUP);               // billentyuzet
   pinMode( KBD1, INPUT_PULLUP);
   pinMode( KBD2, INPUT_PULLUP);
   pinMode( KBD3, INPUT_PULLUP);
   pinMode( KBD4, OUTPUT);
   pinMode( KBD5, OUTPUT);
   pinMode( KBD6, OUTPUT);
   pinMode( KBD7, OUTPUT);
   FastLED.addLeds<WS2812, DATA_PIN, GRB>( leds, NUM_LEDS);
   color_bar();                               // bejelentkezes
   leds[ 0]= CRGB::Red;
   FastLED.show();
   delay( 300);
   leds[ 1]= CRGB::Grey;                      // a feher tul vakito
   FastLED.show();
   delay( 300);
   leds[ 2]= CRGB::Green;
   FastLED.show();
   delay( 1000);
   color_bar();
}


void loop()
{
   switch( mode)
   {
      case 0: break;                             // off
      case 1: vu(); break;
      case 3: kitt(); break;
   }
   switch( k= kbd())
   {
      case '0': mode= 0; color_bar(); break;
      case 'A': mode= 1; color_bar(); break;
      case 'C': mode= 3; color_bar(); break;
   } 
} 


CRGB szin( byte piros, byte zold, byte kek)      // egy szin beallitasa
{
   CRGB a;
   a.red= piros;
   a.green= zold;
   a.blue= kek;
   return a;
}


void color_bar( CRGB s)                          // egesz sor atszinezese, ha mas nincs megadva, feketere
{
   byte i= NUM_LEDS;
   while( i--) leds[ i]= s; 
   FastLED.show();
}


void szegmens( byte n, CRGB szin)                // egy szegmens beallitasa
{
    if( n > 11) n= 11;
    n*= 5;
    leds[ n++]= szin; 
    leds[ n++]= szin; 
    leds[ n++]= szin; 
    leds[ n++]= szin; 
    leds[ n]= szin; 
}


byte kbd()                                       // bill. lekerdezes, perges mentesites
{
   static byte elozo= '-';
   byte a= '-';
   digitalWrite( KBD4, LOW);
   digitalWrite( KBD5, HIGH);
   digitalWrite( KBD6, HIGH);
   digitalWrite( KBD7, HIGH);
   if( !digitalRead( KBD0)) a= '1';
   if( !digitalRead( KBD1)) a= '4';
   if( !digitalRead( KBD2)) a= '7';
   if( !digitalRead( KBD3)) a= '*';
   digitalWrite( KBD4, HIGH);
   digitalWrite( KBD5, LOW);
   if( !digitalRead( KBD0)) a= '2';
   if( !digitalRead( KBD1)) a= '5';
   if( !digitalRead( KBD2)) a= '8';
   if( !digitalRead( KBD3)) a= '0';
   digitalWrite( KBD5, HIGH);
   digitalWrite( KBD6, LOW);
   if( !digitalRead( KBD0)) a= '3';
   if( !digitalRead( KBD1)) a= '6';
   if( !digitalRead( KBD2)) a= '9';
   if( !digitalRead( KBD3)) a= '#';
   digitalWrite( KBD6, HIGH);
   digitalWrite( KBD7, LOW);
   if( !digitalRead( KBD0)) a= 'A';
   if( !digitalRead( KBD1)) a= 'B';
   if( !digitalRead( KBD2)) a= 'C';
   if( !digitalRead( KBD3)) a= 'D';
   if ( elozo == a) a='-';
   else             elozo= a;
   return a;
}
    

void vu( void)                                 // kivezerles mero
{
   byte i;
   int v= analogRead( VU_PIN)/ 4;
   for( i= 0; i < 12; i++)
   {
      if ( i < v)
      {
         if( i < 9) szegmens( i, CRGB::Green);
         else       szegmens( i, CRGB::Red);
      }
      else szegmens( i, CRGB::Black);
   }
   FastLED.show();
   delay( 100);
}


void kitt( void) 
{
   static byte utem= 0;
   static CRGB ego= CRGB::Red;
   static int szunet= 80;
   static int irany= 1;
   color_bar();
   delay( 20);
   szegmens( utem, ego);
   FastLED.show();
   if( ( irany == 1) && ( utem == 11)) irany= -1;
   if( ( irany == -1) && ( utem == 0)) irany= 1;
   utem+= irany;
   delay( szunet);
}

Itt a vége, fuss el véle.