Page 1 of 1
Forum

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.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.

Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!



Remote neo pixel co...
 
Share:
Notifications
Clear all

[Solved] Remote neo pixel controller ( Fire effects) Help needed

2 Posts
2 Users
0 Reactions
1,873 Views
(@beautownshend)
New Member
Joined: 6 years ago
Posts: 1
Topic starter  

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 = qsub8( heat, 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 = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
      colorIndex += STEPS;
   }
}

   
ReplyQuote
 Hans
(@hans)
Famed Member Admin
Joined: 12 years ago
Posts: 2859
 

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 


   
ReplyQuote
Share: