Page 1 of 1

Remote neo pixel controller ( Fire effects) Help needed

Remote neo pixel controller ( Fire effects) Help needed

Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!

Topics for particular software or systems: Start your topic link with the name of the application or system.
Examples: "MacOS X - Your question", "MS Word - Your Tip or Trick".

Please note that switching to another language when reading a post will not work!
Posts will not have a translated counterpart.




RSS Feed

Home Forums Hardware Arduino Remote neo pixel controller ( Fire effects) Help needed

Tagged: 

This topic contains 1 reply, has 2 voices, and was last updated by  hans 1 month ago.

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • 12055

    beautownshend
    Participant

    Hi there! 
    Firstly I’d just like to thank you for all your help towards us fellow makers/tinkerers!
    so, I have followed this tutorial: https://learn.adafruit.com/neotrellis-neopixel-controller/overview to create a remote controller for neopixels, 
    My aim is to apply this controller to trigger various fire effects replacing some of the pre-set effects already in the reciever code such as rainbow fade ( which I am currently trying to replace with fire2012 https://github.com/FastLED/FastLED/blob/master/examples/Fire2012/Fire2012.ino
    I have managed ( with some help) to achieve this, however it only works on the first LED on a strip of 60, if any one can please help me with some advice as to overcome this problem it would be hugely appreciated :) my code is as follows :

    #include <FastLED.h>
    #define FRAMES_PER_SECOND 30 // %%%%%%%%%%%%%%%%%% best guess for this 
    #define LED_PIN 12
    #define NUM_LEDS 60
    #define LED_TYPE WS2812B
    #define COLOR_ORDER GRB
    #define COOLING 55
    #define SPARKING 120

    CRGBArray<NUM_LEDS> leds;
    #include <SPI.h>
    #include <RH_RF69.h>
    #include <Wire.h>
    #define LED 13
    /********** NeoPixel Setup *************/
    #define UPDATES_PER_SECOND 100
    CRGBPalette16 currentPalette( CRGB::Black);
    CRGBPalette16 targetPalette( PartyColors_p );
    TBlendType currentBlending;
    int SPEEDO = 25;
    int STEPS = 20;
    int HUE = 200; // starting color
    int SATURATION = 255;
    int BRIGHTNESS = 200;
    int glitter = 0;
    /************ Radio Setup ***************/
    // Change to 434.0 or other frequency, must match RX's freq!
    #define RF69_FREQ 915.0
    #if defined (__AVR_ATmega32U4__) // Feather 32u4 w/Radio
    #define RFM69_CS 8
    #define RFM69_INT 7
    #define RFM69_RST 4
    #endif
    #if defined(ARDUINO_SAMD_FEATHER_M0) // Feather M0 w/Radio
    #define RFM69_CS 8
    #define RFM69_INT 3
    #define RFM69_RST 4
    #endif
    #if defined (__AVR_ATmega328P__) // Feather 328P w/wing
    #define RFM69_INT 3 // 
    #define RFM69_CS 4 //
    #define RFM69_RST 2 // "A"
    #endif
    #if defined(ESP32) // ESP32 feather w/wing
    #define RFM69_RST 13 // same as LED
    #define RFM69_CS 33 // "B"
    #define RFM69_INT 27 // "A"
    #endif

    // Singleton instance of the radio driver
    RH_RF69 rf69(RFM69_CS, RFM69_INT);

    bool oldState = HIGH;

    void setup()
    {
       delay( 3000 ); // power-up safety delay
       FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
       FastLED.setBrightness( BRIGHTNESS );
       pinMode(LED, OUTPUT);
       pinMode(RFM69_RST, OUTPUT);
       digitalWrite(RFM69_RST, LOW);
       Serial.println("Feather RFM69 RX/TX Test!");
       // manual reset
       digitalWrite(RFM69_RST, HIGH);
       delay(10);
       digitalWrite(RFM69_RST, LOW);
       delay(10);
       if (!rf69.init())
       {
          Serial.println("RFM69 radio init failed");
          while (1);
       }
       Serial.println("RFM69 radio init OK!");
       // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM (for low power module)
       // No encryption
       if (!rf69.setFrequency(RF69_FREQ))
       {
          Serial.println("setFrequency failed");
       }
       // If you are using a high power RF69 eg RFM69HW, you *must* set a Tx power with the
       // ishighpowermodule flag set like this:
       rf69.setTxPower(14, true);
       // The encryption key has to be the same as the one in the server
       uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
                       };
       rf69.setEncryptionKey(key);
       pinMode(LED, OUTPUT);
       Serial.print("RFM69 radio @"); Serial.print((int)RF69_FREQ); Serial.println(" MHz");
       delay(500);
       Gradient(); //So the lights come un upon startup, even if the trigger box is off
    }
    void loop()
    {
       if (rf69.waitAvailableTimeout(1000))
       {
          // Should be a message for us now
          uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
          uint8_t len = sizeof(buf);
          if (! rf69.recv(buf, &len))
          {
             Serial.println("Receive failed");
             return;
          }
          //digitalWrite(LED, HIGH);
          //rf69.printBuffer("Received: ", buf, len);
          //buf[len] = 0;
          //Serial.print("Got: "); Serial.println((char*)buf);
          //Serial.print("RSSI: "); Serial.println(rf69.lastRssi(), DEC);

          char radiopacket[20] = "Button #";//prep reply message to send


          if (buf[0] == 'A') //the letter sent from the button
          {
             ledMode(0);
             radiopacket[8] = 'A';
          }
          else if (buf[0] == 'B') //the letter sent from the button
          {
             ledMode(1);
             radiopacket[8] = 'B';
          }
          else if (buf[0] == 'C') //the letter sent from the button
          {
             ledMode(2);
             radiopacket[8] = 'C';
          }
          else if (buf[0] == 'D') //the letter sent from the button
          {
             ledMode(3);
             radiopacket[8] = 'D';
          }
          else if (buf[0] == 'E') //the letter sent from the button
          {
             ledMode(4);
             radiopacket[8] = 'E';
          }
          else if (buf[0] == 'F') //the letter sent from the button
          {
             ledMode(5);
             radiopacket[8] = 'F';
          }
          else if (buf[0] == 'G') //the letter sent from the button
          {
             ledMode(6);
             radiopacket[8] = 'G';
          }
          else if (buf[0] == 'H') //the letter sent from the button
          {
             ledMode(7);
             radiopacket[8] = 'H';
          }
          else if (buf[0] == 'I') //the letter sent from the button
          {
             ledMode(8);
             radiopacket[8] = 'I';
          }
          else if (buf[0] == 'J') //the letter sent from the button
          {
             ledMode(9);
             radiopacket[8] = 'J';
          }
          else if (buf[0] == 'K') //the letter sent from the button
          {
             ledMode(10);
             radiopacket[8] = 'K';
          }
          else if (buf[0] == 'L') //the letter sent from the button
          {
             ledMode(11);
             radiopacket[8] = 'L';
          }
          else if (buf[0] == 'M') //the letter sent from the button
          {
             ledMode(12);
             radiopacket[8] = 'M';
          }
          else if (buf[0] == 'N') //the letter sent from the button
          {
             ledMode(13);
             radiopacket[8] = 'N';
          }
          else if (buf[0] == 'O') //the letter sent from the button
          {
             ledMode(14);
             radiopacket[8] = 'O';
          }
          else if (buf[0] == 'P') //the letter sent from the button
          {
             ledMode(15);
             radiopacket[8] = 'P';
          }
          else if (buf[0] == 'Q') //the letter sent from the button
          {
             ledMode(16);
             radiopacket[8] = 'Q';
          }
          else if (buf[0] == 'R') //the letter sent from the button
          {
             ledMode(17);
             radiopacket[8] = 'R';
          }
          else if (buf[0] == 'S') //the letter sent from the button
          {
             ledMode(18);
             radiopacket[8] = 'S';
          }
          else if (buf[0] == 'T') //the letter sent from the button
          {
             ledMode(19);
             radiopacket[8] = 'T';
          }
          else if (buf[0] == 'Z') //the letter sent from the button
          {
             ledMode(20);
             radiopacket[8] = 'Z';
          }

          /* radiopacket[9] = 0;
             Serial.print("Sending "); Serial.println(radiopacket);
             rf69.send((uint8_t *)radiopacket, strlen(radiopacket));
             rf69.waitPacketSent(); */
          digitalWrite(LED, LOW);
       }
    }

    void ledMode(int i)
    {
       switch (i)
       {
          //&&&&&&&&&&&&&& added curly bracket (CB)
          case 0: HUE = 0; SATURATION = 255; BRIGHTNESS = 200; Solid(); // red
             break;
          case 1: HUE = 40; SATURATION = 255; BRIGHTNESS = 200; Solid(); // gold
             break;
          case 2: HUE = 100; SATURATION = 255; BRIGHTNESS = 200; Solid(); // green
             break;
          case 3: HUE = 140; SATURATION = 255; BRIGHTNESS = 200; Solid(); // Blue
             break;
          case 4: HUE = 180; SATURATION = 255; BRIGHTNESS = 200; Solid(); // purple
             break;
          case 5: HUE = 220; SATURATION = 255; BRIGHTNESS = 200; Solid(); // pink
             break;
          case 6: HUE = 0; SATURATION = 0; BRIGHTNESS = 200; Solid(); // white
             break;
          case 7: HUE = 0; BRIGHTNESS = 0; Solid(); // off
             break;
          case 8: HUE = 0; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // red
             break;
          case 9: HUE = 40; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // gold
             break;
          case 10: HUE = 100; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // green
             break;
          case 11: HUE = 140; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // blue
             break;
          case 12: HUE = 180; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // purple
             break;
          case 13: HUE = 220; SATURATION = 255; BRIGHTNESS = 200; Gradient(); // pink
             break;
          case 14: HUE = 160; SATURATION = 50; BRIGHTNESS = 200; Gradient(); // white
             break;
          case 15: SATURATION = 255; BRIGHTNESS = 200; Rainbow_Fade(); // rainbow fade
             break;
          case 16: STEPS = 4; SATURATION = 255; BRIGHTNESS = 200; Rainbow(); //rainbow 2
             break;
          case 17: STEPS = 20; BRIGHTNESS = 200; SATURATION = 255; Rainbow(); // rainbow 3
             break;
          case 20: BRIGHTNESS = 200;
             break;
       }
    }
    // GRADIENT --------------------------------------------------------------
    void Gradient()
    {
       SetupGradientPalette();
       // &&&&&&&&&&&&&&&&&&&&& removed CB
       static uint8_t startIndex = 0;
       startIndex = startIndex + 1; // motion speed
       FillLEDsFromPaletteColors( startIndex);
       FastLED.show();
       FastLED.delay(SPEEDO);
    }
    // SOLID ----------------------------------------------------
    void Solid()
    {
       fill_solid(leds, NUM_LEDS, CHSV(HUE, SATURATION, BRIGHTNESS));
       FastLED.show();
       delay(20);
    }
    // RAINBOW --------------------------------------------------
    void Rainbow()
    {
       FastLED.setBrightness( BRIGHTNESS );
       currentPalette = RainbowColors_p;
       static uint8_t startIndex = 0;
       startIndex = startIndex + 1;
       FillLEDsFromPaletteColors( startIndex);
       FastLED.show();
       FastLED.delay(SPEEDO);
    }
    // RAINBOW FADE --------------------------------------------------
    void Rainbow_Fade() //-m2-FADE ALL LEDS THROUGH HSV RAINBOW
    {
       // Array of temperature readings at each simulation cell
       static byte heat[NUM_LEDS]; // $$$$$$$$$$$$$$$$$$$$$$$$$ missinf semi-colon
       // Step 1. Cool down every cell a little
       for ( int i = 0; i < NUM_LEDS; i++)
       {
          heat[i] = qsub8( heat[i], random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
       }
       // Step 2. Heat from each cell drifts 'up' and diffuses a little
       for ( int k = NUM_LEDS - 1; k >= 2; k--)
       {
          heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
       }
       // Step 3. Randomly ignite new 'sparks' of heat near the bottom
       if ( random8() < SPARKING )
       {
          int y = random8(7);
          heat[y] = qadd8( heat[y], random8(160, 255) );
       }
       // Step 4. Map from heat cells to LED colors
       for ( int j = 0; j < NUM_LEDS; j++)
       {
          CRGB color = HeatColor( heat[j]);
          int pixelnumber;
    // ^^^^^^^^^^^^^^^^ I don't know where gReverseDirection is supposed to be declared or where it
    // is to get its value so had to comment this part out      
          /*if ( gReverseDirection ) // &&&&&&&&&&&&&&&&&& is not declared anywhere 
          {
             pixelnumber = (NUM_LEDS - 1) - j;
          }
          else
          {
             pixelnumber = j;
          }*/
          
          leds[pixelnumber] = color;
          FastLED.show(); // display this frame
          FastLED.delay(1000 / FRAMES_PER_SECOND);
       }
    } // ^^^^^^^^^^^^^^^^^^^^^^^^ added CB

    void SetupGradientPalette()
    {
       CRGB light = CHSV( HUE + 25, SATURATION - 20, BRIGHTNESS);
       CRGB dark = CHSV( HUE, SATURATION - 15, BRIGHTNESS);
       CRGB medium = CHSV ( HUE - 25, SATURATION, BRIGHTNESS);
       currentPalette = CRGBPalette16(
                           light, light, light, light,
                           medium, medium, medium, medium,
                           dark, dark, dark, dark,
                           medium, medium, medium, medium );
    }
    void FillLEDsFromPaletteColors( uint8_t colorIndex)
    {
       uint8_t brightness = BRIGHTNESS;
       for ( int i = 0; i < NUM_LEDS; i++)
       {
          leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
          colorIndex += STEPS;
       }
    }
    12062

    hans
    Keymaster

    Hi beautownshend,

    quite a large sketch – it took me a while to read through 

    So when you start this Sketch, what do you see? Just the 1st LED lights up?
    What happens if you add

    while(1);

    after the

       Gradient();  //So the lights come un upon startup, even if the trigger box is off

    line in setup()?

    Also note: You’re using quite a few Global variables.
    I think it’s good practice to avoid this as much as possible, but that doesn’t mean it won’t work  – it just can cause confusing moments 

Viewing 2 posts - 1 through 2 (of 2 total)



You must be logged in to reply to this topic.