NeoTrellis Remote FX Controller RX
RX code for NeoTrellis Remote FX Controller
This commit is contained in:
parent
5b0c44e798
commit
8fe43d0e5b
2 changed files with 1009 additions and 0 deletions
|
|
@ -0,0 +1,371 @@
|
|||
//Ada_remoteFXTrigger_RX_NeoPixel
|
||||
//Remote Effects Trigger Box Receiver
|
||||
//by John Park & Erin St Blaine
|
||||
//for Adafruit Industries
|
||||
//
|
||||
// Button box receiver with NeoPixels using FastLED
|
||||
//
|
||||
//
|
||||
//MIT License
|
||||
|
||||
#include <FastLED.h>
|
||||
|
||||
#define LED_PIN 12
|
||||
#define NUM_LEDS 20
|
||||
#define LED_TYPE WS2812B
|
||||
#define COLOR_ORDER GRB
|
||||
|
||||
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){
|
||||
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();
|
||||
|
||||
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
|
||||
HUE++;
|
||||
if (HUE > 255) {HUE = 0;}
|
||||
for(int idex = 0 ; idex < NUM_LEDS; idex++ ) {
|
||||
leds[idex] = CHSV(HUE, SATURATION, BRIGHTNESS);
|
||||
}
|
||||
LEDS.show();
|
||||
delay(SPEEDO);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,638 @@
|
|||
//Ada_remoteFXTrigger_NeoTrellis_TX
|
||||
//Remote Effects Trigger Box Transmitter
|
||||
//by John Park
|
||||
// & Erin St. Blaine
|
||||
//for Adafruit Industries
|
||||
|
||||
// General purpose button box
|
||||
// for triggering remote effects
|
||||
// using packet radio Feather boards
|
||||
//
|
||||
//
|
||||
//MIT License
|
||||
|
||||
#include <SPI.h>
|
||||
#include <RH_RF69.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
#include <Adafruit_NeoTrellis.h>
|
||||
|
||||
#include <Encoder.h>
|
||||
int m = 0; //variable to increment through menu list
|
||||
int x = 17; //variable for referencing buttons -- setting X to a non-existent button
|
||||
/********* Encoder Setup ***************/
|
||||
#define PIN_ENCODER_SWITCH 11
|
||||
Encoder knob(10, 12);
|
||||
uint8_t activeRow = 0;
|
||||
long pos = -999;
|
||||
long newpos;
|
||||
int prevButtonState = HIGH;
|
||||
bool needsRefresh = true;
|
||||
bool advanced = false;
|
||||
unsigned long startTime;
|
||||
|
||||
|
||||
/********* NeoTrellis Setup ***************/
|
||||
Adafruit_NeoTrellis trellis;
|
||||
|
||||
#define MOMENTARY 0
|
||||
#define LATCHING 1
|
||||
#define MODE LATCHING //all Trellis buttons in latching mode
|
||||
#define NUMTRELLIS 1
|
||||
#define numKeys (NUMTRELLIS * 16)
|
||||
#define INTPIN A2
|
||||
int NUM_SCREENS = 3; // change this number to add more screens
|
||||
|
||||
|
||||
//define a callback for key presses
|
||||
TrellisCallback blink(keyEvent evt){
|
||||
// Check is the pad pressed?
|
||||
if (evt.bit.EDGE == SEESAW_KEYPAD_EDGE_RISING) {
|
||||
//trellis.pixels.setPixelColor(evt.bit.NUM, 0xFFFFFF); //on rising
|
||||
} else if (evt.bit.EDGE == SEESAW_KEYPAD_EDGE_FALLING) {
|
||||
// or is the pad released?
|
||||
//trellis.pixels.setPixelColor(m, Wheel(map(m*2, 0, trellis.pixels.numPixels(), 0, 255))); //off falling
|
||||
x = evt.bit.NUM;
|
||||
}
|
||||
|
||||
// Turn on/off the neopixels!
|
||||
trellis.pixels.show();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************ OLED Setup ***************/
|
||||
Adafruit_SSD1306 oled = Adafruit_SSD1306();
|
||||
#if defined(ESP8266)
|
||||
#define BUTTON_A 0
|
||||
#define BUTTON_B 16
|
||||
#define BUTTON_C 2
|
||||
#define LED 0
|
||||
#elif defined(ESP32)
|
||||
#define BUTTON_A 15
|
||||
#define BUTTON_B 32
|
||||
#define BUTTON_C 14
|
||||
#define LED 13
|
||||
#elif defined(ARDUINO_STM32F2_FEATHER)
|
||||
#define BUTTON_A PA15
|
||||
#define BUTTON_B PC7
|
||||
#define BUTTON_C PC5
|
||||
#define LED PB5
|
||||
#elif defined(TEENSYDUINO)
|
||||
#define BUTTON_A 4
|
||||
#define BUTTON_B 3
|
||||
#define BUTTON_C 8
|
||||
#define LED 13
|
||||
#elif defined(ARDUINO_FEATHER52)
|
||||
#define BUTTON_A 31
|
||||
#define BUTTON_B 30
|
||||
#define BUTTON_C 27
|
||||
#define LED 17
|
||||
#else // 32u4, M0, and 328p
|
||||
#define BUTTON_A 9
|
||||
#define BUTTON_B 6
|
||||
#define BUTTON_C 5
|
||||
#define LED 13
|
||||
#endif
|
||||
|
||||
|
||||
/************ Radio Setup ***************/
|
||||
// Can be changed 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);
|
||||
|
||||
int lastButton=17; //last button pressed for Trellis logic
|
||||
|
||||
int menuList[8]={1,2,3,4,5,6,7,8}; //for rotary encoder choices
|
||||
//int m = 0; //variable to increment through menu list
|
||||
int lastTB[8] = {16, 16, 16, 16, 16, 16, 16, 16}; //array to store per-menu Trellis button
|
||||
|
||||
|
||||
/*******************SETUP************/
|
||||
void setup() {
|
||||
delay(500);
|
||||
Serial.begin(115200);
|
||||
//while (!Serial) { delay(1); } // wait until serial console is open,
|
||||
//remove if not tethered to computer
|
||||
|
||||
pinMode(PIN_ENCODER_SWITCH, INPUT_PULLUP);//set encoder push switch pin to input pullup
|
||||
pinMode(INTPIN, INPUT);
|
||||
|
||||
// digitalPinToInterrupt(10); //on M0, Encoder library doesn't auto set these as interrupts
|
||||
// digitalPinToInterrupt(12);
|
||||
|
||||
// Initialize OLED display
|
||||
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
|
||||
oled.setTextWrap(false);
|
||||
oled.display();
|
||||
delay(500);
|
||||
oled.clearDisplay();
|
||||
oled.display();
|
||||
oled.setTextSize(2);
|
||||
oled.setTextColor(WHITE);
|
||||
pinMode(BUTTON_A, INPUT_PULLUP);
|
||||
pinMode(BUTTON_B, INPUT_PULLUP);
|
||||
pinMode(BUTTON_C, INPUT_PULLUP);
|
||||
pinMode(LED, OUTPUT);
|
||||
pinMode(RFM69_RST, OUTPUT);
|
||||
digitalWrite(RFM69_RST, LOW);
|
||||
|
||||
// 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");
|
||||
|
||||
oled.setCursor(0,0);
|
||||
oled.println("RFM69 @ ");
|
||||
oled.print((int)RF69_FREQ);
|
||||
oled.println(" MHz");
|
||||
oled.display();
|
||||
delay(1200); //pause to let freq message be read by a human
|
||||
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.println("REMOTE FX");
|
||||
oled.setCursor(0,16);
|
||||
oled.println("TRIGGER");
|
||||
oled.display();
|
||||
|
||||
if (!trellis.begin()) {
|
||||
Serial.println("Could not start trellis, check wiring?");
|
||||
while(1);
|
||||
} else {
|
||||
Serial.println("NeoPixel Trellis started");
|
||||
}
|
||||
|
||||
//activate all NeoTrellis keys and set callbacks
|
||||
for(int i=0; i<NEO_TRELLIS_NUM_KEYS; i++){
|
||||
trellis.activateKey(i, SEESAW_KEYPAD_EDGE_RISING);
|
||||
trellis.activateKey(i, SEESAW_KEYPAD_EDGE_FALLING);
|
||||
trellis.registerCallback(i, blink);
|
||||
}
|
||||
|
||||
//do a little animation to show we're on
|
||||
for (uint16_t i=0; i<trellis.pixels.numPixels(); i++) {
|
||||
trellis.pixels.setPixelColor(i, Wheel(map(i, 0, trellis.pixels.numPixels(), 0, 255)));
|
||||
trellis.pixels.show();
|
||||
delay(50);
|
||||
}
|
||||
for (uint16_t i=0; i<trellis.pixels.numPixels(); i++) {
|
||||
trellis.pixels.setPixelColor(i, 0x000000);
|
||||
trellis.pixels.show();
|
||||
delay(50);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
void loop() {
|
||||
|
||||
|
||||
/*************Rotary Encoder Menu***********/
|
||||
|
||||
//check the encoder knob, set the current position as origin
|
||||
long newpos = knob.read() / 4;//divide for encoder detents
|
||||
|
||||
/* // for debugging
|
||||
Serial.print("pos=");
|
||||
Serial.print(pos);
|
||||
Serial.print(", newpos=");
|
||||
Serial.println(newpos);
|
||||
*/
|
||||
|
||||
if(newpos != pos){
|
||||
int diff = newpos - pos;//check the different between old and new position
|
||||
if(diff>=1){
|
||||
m++;
|
||||
m = (m+NUM_SCREENS) % NUM_SCREENS;//modulo to roll over the m variable through the list size
|
||||
}
|
||||
|
||||
if(diff==-1){ //rotating backwards
|
||||
m--;
|
||||
m = (m+NUM_SCREENS) % NUM_SCREENS;
|
||||
}
|
||||
/* //uncomment for debugging or general curiosity
|
||||
Serial.print("Diff = ");
|
||||
Serial.print(diff);
|
||||
Serial.print(" pos= ");
|
||||
Serial.print(pos);
|
||||
Serial.print(", newpos=");
|
||||
Serial.println(newpos);
|
||||
Serial.println(menuList[m]);
|
||||
*/
|
||||
|
||||
pos = newpos;
|
||||
|
||||
// Serial.print("m is: ");
|
||||
//Serial.println(m);
|
||||
//write to the display
|
||||
oled.setCursor(0,3);
|
||||
oled.clearDisplay();
|
||||
|
||||
int p; //for drawing bullet point menu location pixels
|
||||
int q;
|
||||
|
||||
if (m==0){
|
||||
for(p=4;p<8;p++){
|
||||
for(q=0;q<4;q++){
|
||||
oled.drawPixel(q,p,WHITE);
|
||||
}
|
||||
}
|
||||
oled.print(" Solids");
|
||||
clearPixels();
|
||||
trellis.pixels.setPixelColor(0, 50,0,0);
|
||||
trellis.pixels.setPixelColor(1, 50,50,0);
|
||||
trellis.pixels.setPixelColor(2, 0,50,0);
|
||||
trellis.pixels.setPixelColor(3, 0,0,50);
|
||||
trellis.pixels.setPixelColor(4, 20,0,50);
|
||||
trellis.pixels.setPixelColor(5, 50,0,20);
|
||||
trellis.pixels.setPixelColor(6, 100,100,100);
|
||||
trellis.pixels.setPixelColor(7, 10,10,10);
|
||||
trellis.pixels.show();
|
||||
}
|
||||
if (m==1){
|
||||
for(p=8;p<12;p++){
|
||||
for(q=0;q<4;q++){
|
||||
oled.drawPixel(q,p,WHITE);
|
||||
}
|
||||
}
|
||||
oled.print(" Gradients");
|
||||
clearPixels();
|
||||
trellis.pixels.setPixelColor(0, 50,0,0);
|
||||
trellis.pixels.setPixelColor(1, 50,50,0);
|
||||
trellis.pixels.setPixelColor(2, 0,50,0);
|
||||
trellis.pixels.setPixelColor(3, 0,0,50);
|
||||
trellis.pixels.setPixelColor(4, 20,0,50);
|
||||
trellis.pixels.setPixelColor(5, 50,0,20);
|
||||
trellis.pixels.setPixelColor(6, 100,100,100);
|
||||
trellis.pixels.setPixelColor(7, 10,10,10);
|
||||
trellis.pixels.show();
|
||||
}
|
||||
if (m==2){
|
||||
for(p=12;p<16;p++){
|
||||
for(q=0;q<4;q++){
|
||||
oled.drawPixel(q,p,WHITE);
|
||||
}
|
||||
}
|
||||
oled.print(" Rainbows");
|
||||
clearPixels();
|
||||
trellis.pixels.setPixelColor(0, 50,0,0);
|
||||
trellis.pixels.setPixelColor(1, 50,50,0);
|
||||
trellis.pixels.setPixelColor(2, 0,50,0);
|
||||
trellis.pixels.setPixelColor(7, 10,10,10);
|
||||
trellis.pixels.show();
|
||||
}
|
||||
|
||||
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
char radiopacket[20];
|
||||
|
||||
|
||||
/**************Solids**************/
|
||||
|
||||
if(m==0){ //next menu item
|
||||
|
||||
if (x==0){ //button 1 sends button A command
|
||||
radiopacket[0] = 'A';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("RED");
|
||||
oled.display();
|
||||
}
|
||||
if (x==1){ //button 2 sends button B command
|
||||
radiopacket[0] = 'B';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("GOLD");
|
||||
oled.display();
|
||||
}
|
||||
if (x==2){ //button 3 sends button C command
|
||||
radiopacket[0] = 'C';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("GREEN");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==3){ //button 4 sends button D command
|
||||
radiopacket[0] = 'D';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("BLUE");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==4){ //button 5 sends button E command
|
||||
radiopacket[0] = 'E';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("PURPLE");
|
||||
oled.display();
|
||||
}
|
||||
if (x==5){ //button 6 sends button F command
|
||||
radiopacket[0] = 'F';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("PINK");
|
||||
oled.display();
|
||||
}
|
||||
if (x==6){ //button 7 sends button G command
|
||||
radiopacket[0] = 'G';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("WHITE");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==7){ //button 8 sends button H command
|
||||
radiopacket[0] = 'H';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Solid");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("OFF");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
|
||||
trellis.pixels.show(); // tell the trellis to set the LEDs we requested
|
||||
}
|
||||
|
||||
/**************Gradients**************/
|
||||
|
||||
if(m==1){ //next menu item
|
||||
|
||||
if (x==0){ //button 1 sends button A command
|
||||
radiopacket[0] = 'I';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("RED");
|
||||
oled.display();
|
||||
}
|
||||
if (x==1){ //button 2 sends button B command
|
||||
radiopacket[0] = 'J';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("GOLD");
|
||||
oled.display();
|
||||
}
|
||||
if (x==2){ //button 3 sends button C command
|
||||
radiopacket[0] = 'K';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("GREEN");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==3){ //button 4 sends button D command
|
||||
radiopacket[0] = 'L';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("BLUE");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==4){ //button 5 sends button E command
|
||||
radiopacket[0] = 'M';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("PURPLE");
|
||||
oled.display();
|
||||
}
|
||||
if (x==5){ //button 6 sends button F command
|
||||
radiopacket[0] = 'N';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("PINK");
|
||||
oled.display();
|
||||
}
|
||||
if (x==6){ //button 7 sends button G command
|
||||
radiopacket[0] = 'O';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("WHITE");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==7){ //button 8 sends button H command
|
||||
radiopacket[0] = 'H';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Gradient");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("OFF");
|
||||
oled.display();
|
||||
}
|
||||
trellis.pixels.show(); // tell the trellis to set the LEDs we requested
|
||||
}
|
||||
|
||||
|
||||
/**************Rainbows**************/
|
||||
|
||||
if(m==2){ //next menu item
|
||||
|
||||
if (x==0){ //button 1 sends button A command
|
||||
radiopacket[0] = 'P';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Rainbow");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("FADE");
|
||||
oled.display();
|
||||
}
|
||||
if (x==1){ //button 2 sends button B command
|
||||
radiopacket[0] = 'Q';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Rainbow");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("SOFT");
|
||||
oled.display();
|
||||
}
|
||||
if (x==2){ //button 3 sends button C command
|
||||
radiopacket[0] = 'R';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Rainbow");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("TWINKLE");
|
||||
oled.display();
|
||||
}
|
||||
|
||||
if (x==7){ //button 8 sends button H command
|
||||
radiopacket[0] = 'H';
|
||||
oled.clearDisplay();
|
||||
oled.setCursor(0,0);
|
||||
oled.print("Rainbow");
|
||||
oled.setCursor(50,16);
|
||||
oled.print("OFF");
|
||||
oled.display();
|
||||
}
|
||||
trellis.pixels.show(); // tell the trellis to set the LEDs we requested
|
||||
}
|
||||
|
||||
|
||||
|
||||
Serial.print("Sending ");
|
||||
Serial.println(radiopacket[0]);
|
||||
|
||||
rf69.send((uint8_t *)radiopacket, strlen(radiopacket));
|
||||
rf69.waitPacketSent();
|
||||
//reset packet so unassigned buttons don't send last command
|
||||
radiopacket[0]='Z'; //also being used to turn off NeoPixels
|
||||
//from any unused button
|
||||
|
||||
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("TX Got: ");
|
||||
//Serial.println((char*)buf);
|
||||
Serial.print("RSSI: ");
|
||||
Serial.println(rf69.lastRssi(), DEC);
|
||||
|
||||
//delay(1000);//chill for a moment before returning the message to RX unit
|
||||
|
||||
/*************Reply message from RX unit***********/
|
||||
//oled.clearDisplay();
|
||||
//oled.print((char*)buf[0]);
|
||||
//oled.print("RSSI: "); oled.print(rf69.lastRssi());
|
||||
//oled.display();
|
||||
|
||||
|
||||
digitalWrite(LED, LOW);
|
||||
}
|
||||
|
||||
//lastButton=i;//set for next pass through to turn this one off
|
||||
|
||||
|
||||
trellis.read();
|
||||
delay(100); //the NeoTrellis has a resolution of around 60hz
|
||||
|
||||
}
|
||||
|
||||
|
||||
/******************************************/
|
||||
|
||||
// Input a value 0 to 255 to get a color value.
|
||||
// The colors are a transition r - g - b - back to r.
|
||||
uint32_t Wheel(byte WheelPos) {
|
||||
if(WheelPos < 85) {
|
||||
return trellis.pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
|
||||
} else if(WheelPos < 170) {
|
||||
WheelPos -= 85;
|
||||
return trellis.pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
|
||||
} else {
|
||||
WheelPos -= 170;
|
||||
return trellis.pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clearPixels() {
|
||||
for (uint16_t i=0; i<trellis.pixels.numPixels(); i++) {
|
||||
trellis.pixels.setPixelColor(i, 0x000000);
|
||||
trellis.pixels.show();
|
||||
delay(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in a new issue