Помогите переделать скетч из энкодера под джойстик
- Войдите на сайт для отправки комментариев
Втр, 24/10/2017 - 04:04
Здравствуйте!
Есть следующий код, в нем реализовано переключение режимов светодиодной ленты энкодером. Так как энкодер я победить не смог(сначала скакал туда-сюда, припаял конденсаторы, стал переключать через единицу), то решил вместо энкодера воткнуть джойстик.. Хочу чтобы вправо-влево переключались режимы, а вверх-вниз регулировалась яркость)) Вобщем прошу помощи господа ардуинщики!
/////////////////////////////////////////////////////////// ///////// 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//////////////////////////////////////////////////////
ptaha999, суть вашего сообщения - "Я не справился с одной простой задачей, поэтому решил взять ещё более сложную задачу". Разбирайтесь с энкодером, это жизненно важный элемент управления.
ТС.можно ссылку на источник ?
Джойстик переключать будет при достижении упора? Тогда поставь 4 кнопки. Проще будет.
ТС.можно ссылку на источник ?
https://pastebin.com/d7fGzXaf
Да, источник этот)) да, по достижении упора. Кнопки не пойдут так как это будет подсветка приборной панели в автомобиле, и один элемент управления удобнее чем 4 кнопки..
кнопки,джойстик и прочие рычаги- это прошлый век. ставьте электронный компАс GY271,пусть он и управляет вашу подсветку.
я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично
я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично
главное - магнитики на холодильнике обходить через балкон. О_О
*и, я не глумлюсь(с) - да.
это будет подсветка приборной панели в автомобиле.
какая кухня..какие магнитики? акстись
В плане перемещается компас - перемещаются цвета на светодиодной ленте? Да, было бы здорово в городе, но на трассе будет скучновато))
вы знаете некую трассу строго ориентированную по сторонам света?)
зато Вы не дергаетесь руками а предоставляете магнитному полю планеты управлять вашим световым шоу)
Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.
Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.
одна рука на руле ,другая-на коленке ((лобке,груди...(нужное подчеркнуть)) любимой женщины любующейся светомузыкой).. а аварий много от того что не нужно быть быдлом и хамить на дорогах и телефон выключить нах
Про глаза и мозги забыл? Рядом же любимая женщина. Смотреть на дорогу!
мы несколько отошли от темы). неужели среди множества остроумных и гениальных форумчан не найдется филантропа готового помочь ТС с его кнопками и джойстиками....неужто вы не посоветуете нечто более технологичное чем тупо замыкать проводки руками?
неужто все посты здесь создаются лишь для того чтобы блистали своим скудоумием господа евгенийпэ да клапауций?