Помогите переделать скетч из энкодера под джойстик

ptaha999
Offline
Зарегистрирован: 05.04.2016

Здравствуйте!

Есть следующий код, в нем реализовано переключение режимов светодиодной ленты энкодером. Так как энкодер я победить не смог(сначала скакал туда-сюда, припаял конденсаторы, стал переключать через единицу), то решил вместо энкодера воткнуть джойстик.. Хочу чтобы вправо-влево переключались режимы, а вверх-вниз регулировалась яркость)) Вобщем прошу помощи господа ардуинщики!

///////////////////////////////////////////////////////////
///////// LED SCOOTER BURNING MAN 2015 w/ ENCODER /////////
///////////////////////////////////////////////////////////

//INCLUDE LIBRARIES////////////////////////////////////////
#include <FastLED.h>                                       //Include FastLED Library
#include <Encoder.h>                                       //Include Rotary Encoder Library
//#include <AdaEncoder.h>                                  //Include Ada Encoder Library *TEST*
//#include <Bounce2.h>                                     //Include Bounce Library *TEST*

//LED SETUP////////////////////////////////////////////////
#define LED_PIN 6                                          //LED Strip Data Pin
#define LED_TYPE    WS2811                                 //LED Type
#define COLOR_ORDER GRB                                    //LED Color Order
#define NUM_LEDS 156                                       //Number of LEDs
CRGB leds[NUM_LEDS];                                       //Name of LED Array
CRGBPalette16 currentPalette;                              //Color Palette
TBlendType    currentBlending;                             //Color Blending

//PINs for connection of the rotary////////////////////////
//#define BUTTON_PIN 4                                     //Button Pin from Rotary Encoder
#define encoderPinA 2                                      //Encoder A
#define encoderPinB 3                                      //Encoder B
volatile int encoderPos = 0;                               // also negative values
byte count = 0;
byte lastCount = 0; 
//Bounce debouncer = Bounce(); 
//Bounce encoderPos = Bounce( encoderPinA,encoderPinB );
//#define encoderSwitchPin 4                               //Encoder Switch Pin *ALT*
//Encoder myEnc(3, 5);                                     //Encoder Pins *ALT*

//BUTTON SETUP/////////////////////////////////////////////
//byte prevKeyState = HIGH;        

//MODE VARIABLES///////////////////////////////////////////
int ledMode = 0;                                           //FIRST ACTIVE MODE
int BRIGHTNESS = 255;                                      //0-255.  Lower number saves battery life, higher number is screamingly bright
int SATURATION = 255;                                      //0 is white (no color) and 255 is fully saturated with color
int HUE = 0;                                               //0-255, around the color wheel
int STEPS = 4;                                             //Wider or narrower bands of color
int SPEEDO = 10;                                           //The speed of the animation

//SETUP////////////////////////////////////////////////////
void setup() {
  delay( 2000 );                                           // power-up safety delay
//  pinMode(BUTTON_PIN, INPUT);
  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  digitalWrite(encoderPinA, HIGH);                         // use internal pull-ups
  digitalWrite(encoderPinB, HIGH);                         // use internal pull-ups
  attachInterrupt(0, doEncoderA, CHANGE);                  // encoder pin on interrupt 0 (pin  2)
  attachInterrupt(1, doEncoderB, CHANGE);                  // encoder pin on interrupt 1 (pin  3) 
//  Serial.begin (9600)
  
 //FASTLED
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );
  currentBlending = BLEND;
  
  Serial.begin(115200);
}

//DEFINE NUMBER OF EFFECTS/////////////////////////////////
#define NUM_MODES 13                                       //Change this to max number of effects

//MAIN LOOP////////////////////////////////////////////////
void loop() {
    switch (ledMode) {
       case 0: BRIGHTNESS=255; Rainbow(); break;           //Rainbow Colors
       case 1: BRIGHTNESS=255; RainbowStripe(); break;     //Rainbow Stripe
       case 2: BRIGHTNESS=255; PartyColors(); break;       //Party Colors
       case 3: BRIGHTNESS=255; HeatColors(); break;        //Heat Colors
       case 4: BRIGHTNESS=255; Ocean(); break;             //Ocean Colors
       case 5: BRIGHTNESS=255; Forest(); break;            //Forrest Colors
       case 6: BRIGHTNESS=255; Flashlight(); break;        //Solid White
       case 7: BRIGHTNESS=255; WhiteBlink(); break;        //Blinking White
       case 8: BRIGHTNESS=255; Pink(); break;              //Solid Pink
       case 9: BRIGHTNESS=255; Caution(); break;           //Blink Orange Caution
       case 10: BRIGHTNESS=255; FIRE(); break;             //Blink Fire Red White
       case 11: BRIGHTNESS=255; PYRO(); break;             //Blink Pyro Red Orange
       case 12: BRIGHTNESS=255; LEO_Slow(); break;         //Blink LEO Slow
}  

/*
//BUTTON MANAGEMENT////////////////////////////////////////
        byte currKeyState = digitalRead(BUTTON_PIN);
     
        if ((prevKeyState == LOW) && (currKeyState == HIGH)) {
            keyRelease();
        }
        
        prevKeyState = currKeyState;
*/  
  
//ENCODER MANAGEMENT///////////////////////////////////////
                                                           // set the upper and lower limits for counting 
      if (encoderPos > NUM_MODES)                          // this limits the encoder max value 
          encoderPos = NUM_MODES;
  
      if (encoderPos < 0)                                  // this limits the encoder max value 
          encoderPos = 0;

      ledMode = encoderPos;
      bool trigger = 0;
      if (ledMode != lastCount) trigger = 1;               // if it's changed, trigger the different events
    
//    Serial.println(encoderPos);
//    delay(2000);                                         // slow down the output
    }

    
//LIGHT PATTERNS///////////////////////////////////////////
//RAINBOW COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Rainbow() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = RainbowColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//RAINBOW STRIPE~~-~~~~-~~~~-~~~~-~~~~-~~~~-~~~~-~~~~-~~~~~
void RainbowStripe() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = RainbowStripeColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//PARTY COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void PartyColors() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = PartyColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//HEAT COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void HeatColors() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = HeatColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//OCEAN COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Ocean() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = OceanColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//CLOUD COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Cloud() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = CloudColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//FORREST COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Forest() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = ForestColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//LAVA COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Lava() { 
  FastLED.setBrightness(  BRIGHTNESS );
  currentPalette = LavaColors_p;
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; 

  FillLEDsFromPaletteColors( startIndex);
    
  FastLED.show();
  FastLED.delay(SPEEDO);  
}

//FILL COLORS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void FillLEDsFromPaletteColors( uint8_t colorIndex) {
  for( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, BRIGHTNESS, currentBlending);
    colorIndex += STEPS;
  }
}

//SOLID WHITE----------------------------------------------
void Flashlight() {
   fill_solid(leds, NUM_LEDS, CRGB::White);  
   FastLED.show(); 
}

//SOLID PINK-----------------------------------------------
void Pink() {
   fill_solid(leds, NUM_LEDS, CRGB::HotPink);  
   FastLED.show(); 
}

//SOLID RED------------------------------------------------
void Redlight() {
   fill_solid(leds, NUM_LEDS, CRGB::Red);  
   FastLED.show(); 
}

//BLINK ORANGE SLOW-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void Caution() { 
  fill_solid(leds, NUM_LEDS, CRGB::Orange);
  FastLED.show();
  delay(1000);
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
  delay(1000);
}

//BLINK WHITE-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void WhiteBlink() { 
  fill_solid(leds, NUM_LEDS, CRGB::White);
  FastLED.show();
  delay(250);
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
  delay(250);
}

//FIRE BLINK RED WHITE-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
void FIRE() { 
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
  delay(250);
  fill_solid(leds, NUM_LEDS, CRGB::White);
  FastLED.show();
  delay(250);
}

//PYRO BLINK RED ORANGE-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void PYRO() { 
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
  delay(100);
  fill_solid(leds, NUM_LEDS, CRGB::Orange);
  FastLED.show();
  delay(100);
}

//LEO BLINK RED BLUE SLOW-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void LEO_Slow() { 
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
  delay(250);
  fill_solid(leds, NUM_LEDS, CRGB::Blue);
  FastLED.show();
  delay(250);
}

//LEO BLINK RED BLUE FAST-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void LEO_Fast() { 
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
  delay(100);
  fill_solid(leds, NUM_LEDS, CRGB::Blue);
  FastLED.show();
  delay(100);
}

/*
//BUTTON CONTROL///////////////////////////////////////////
//-called when button is pressed
void shortKeyPress() {
    Serial.println("short");
    ledMode++;
    if (ledMode > NUM_MODES){
    ledMode=0; }
}

// called when key goes from pressed to not pressed
void keyRelease() {
    Serial.println("key release");
        shortKeyPress();
    }
*/
  
//ENCODER CONTROL//////////////////////////////////////////
void doEncoderA(){                                         // Encoder A

if (digitalRead(encoderPinA) == HIGH) {                    // look for a low-to-high on channel A
   if (digitalRead(encoderPinB) == LOW) {                  // check channel B to see which way encoder is turning
     encoderPos = encoderPos + 1;   }                      // CW
      else {
      encoderPos = encoderPos - 1;  }                      // CCW
   }

else  {                                                    // must be a high-to-low edge on channel A                                      
   if (digitalRead(encoderPinB) == HIGH) {                 // check channel B to see which way encoder is turning  
     encoderPos = encoderPos + 1;    }                     // CW
      else {
     encoderPos = encoderPos - 1;    }                     // CCW
      }
  }

void doEncoderB(){                                         // Encoder B

if (digitalRead(encoderPinB) == HIGH) {                    // look for a low-to-high on channel B
   if (digitalRead(encoderPinA) == HIGH) {                 // check channel A to see which way encoder is turning
     encoderPos = encoderPos + 1;    }                     // CW
      else {
     encoderPos = encoderPos - 1;    }                     // CCW
   }

else {                                                     // Look for a high-to-low on channel B
    if (digitalRead(encoderPinA) == LOW) {                 // check channel B to see which way encoder is turning  
     encoderPos = encoderPos + 1;    }                     // CW
      else {
     encoderPos = encoderPos - 1;    }                     // CCW
     }
} 
//END//////////////////////////////////////////////////////

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ptaha999, суть вашего сообщения - "Я не справился с одной простой задачей, поэтому решил взять ещё более сложную задачу".  Разбирайтесь с энкодером, это жизненно важный элемент управления.

valera678
Offline
Зарегистрирован: 04.11.2016

ТС.можно ссылку на источник ?

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Джойстик переключать будет при достижении упора? Тогда поставь 4 кнопки. Проще будет.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

valera678 пишет:

ТС.можно ссылку на источник ?

https://pastebin.com/d7fGzXaf

ptaha999
Offline
Зарегистрирован: 05.04.2016

Да, источник этот)) да, по достижении упора. Кнопки не пойдут так как это будет подсветка приборной панели в автомобиле, и один элемент управления удобнее чем 4 кнопки..

valera678
Offline
Зарегистрирован: 04.11.2016

кнопки,джойстик и прочие рычаги- это прошлый век. ставьте электронный компАс GY271,пусть он и управляет вашу подсветку.

я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

valera678 пишет:

я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично

главное - магнитики на холодильнике обходить через балкон. О_О

*и, я не глумлюсь(с) - да.

valera678
Offline
Зарегистрирован: 04.11.2016

это будет подсветка приборной панели в автомобиле.

какая кухня..какие  магнитики? акстись

ptaha999
Offline
Зарегистрирован: 05.04.2016

В плане перемещается компас - перемещаются цвета на светодиодной ленте? Да, было бы здорово в городе, но на трассе будет скучновато))

valera678
Offline
Зарегистрирован: 04.11.2016

ptaha999 пишет:
В плане перемещается компас - перемещаются цвета на светодиодной ленте? Да, было бы здорово в городе, но на трассе будет скучновато))

вы знаете некую трассу строго ориентированную по сторонам света?) 

зато Вы не дергаетесь руками а предоставляете магнитному полю планеты управлять вашим световым шоу)

bizzon
Offline
Зарегистрирован: 29.03.2016

Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.

valera678
Offline
Зарегистрирован: 04.11.2016

bizzon пишет:

Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.

одна рука на руле ,другая-на коленке ((лобке,груди...(нужное подчеркнуть)) любимой женщины любующейся светомузыкой).. а аварий много от того что не нужно быть быдлом и хамить на дорогах и телефон выключить нах

bizzon
Offline
Зарегистрирован: 29.03.2016

Про глаза и мозги забыл? Рядом же любимая женщина. Смотреть на дорогу!

valera678
Offline
Зарегистрирован: 04.11.2016

мы несколько отошли от темы). неужели среди множества остроумных и гениальных форумчан не найдется филантропа готового помочь ТС с его кнопками и джойстиками....неужто вы не посоветуете нечто более технологичное чем тупо замыкать проводки руками? 

valera678
Offline
Зарегистрирован: 04.11.2016

неужто все посты здесь создаются лишь для того чтобы блистали своим скудоумием господа евгенийпэ да клапауций?