Помогите переделать скетч из энкодера под джойстик
- Войдите на сайт для отправки комментариев
Втр, 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,пусть он и управляет вашу подсветку.
я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично
я не глумлюсь..по_моему это было бы интересно и неожиданно..и весьма динамично
главное - магнитики на холодильнике обходить через балкон. О_О
*и, я не глумлюсь(с) - да.
это будет подсветка приборной панели в автомобиле.
какая кухня..какие магнитики? акстись
В плане перемещается компас - перемещаются цвета на светодиодной ленте? Да, было бы здорово в городе, но на трассе будет скучновато))
вы знаете некую трассу строго ориентированную по сторонам света?)
зато Вы не дергаетесь руками а предоставляете магнитному полю планеты управлять вашим световым шоу)
Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.
Руки на руль, глаза на дорогу. Нечего цветомузыкой любоваться. Невозможно стало до работы доехать- по пять аварий на километр. А когда не за рулём-изучай джойстики и энкодеры.
одна рука на руле ,другая-на коленке ((лобке,груди...(нужное подчеркнуть)) любимой женщины любующейся светомузыкой).. а аварий много от того что не нужно быть быдлом и хамить на дорогах и телефон выключить нах
Про глаза и мозги забыл? Рядом же любимая женщина. Смотреть на дорогу!
мы несколько отошли от темы). неужели среди множества остроумных и гениальных форумчан не найдется филантропа готового помочь ТС с его кнопками и джойстиками....неужто вы не посоветуете нечто более технологичное чем тупо замыкать проводки руками?
неужто все посты здесь создаются лишь для того чтобы блистали своим скудоумием господа евгенийпэ да клапауций?